From 8b345d9a07aa1dc621be493afd0fa2e7f9d2b2c7 Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Tue, 3 Jan 2023 12:46:56 +0100 Subject: [PATCH 001/106] Porting and drastical rewrite to reach compatibility with `3b1b/manim` again (#3107) * ported functionality of Mobject from 3b1b to OpenGLMobject * ported functionality of VMobject from 3b1b to OpenVGLMobject * first working render * first step to dump old scene structure * copied scene without adapting --- manim/_config/utils.py | 2 + manim/constants.py | 3 + manim/event_handler/__init__.py | 5 + manim/event_handler/event_dispatcher.py | 91 + manim/event_handler/event_listener.py | 34 + manim/event_handler/event_type.py | 11 + manim/mobject/opengl/opengl_mobject.py | 1601 +++++++----- .../opengl/opengl_vectorized_mobject.py | 847 ++++--- manim/mobject/types/vectorized_mobject.py | 1 - manim/renderer/opengl_renderer.py | 506 +++- manim/renderer/shader_wrapper.py | 67 +- manim/scene/scene.py | 2254 ++++++----------- manim/utils/bezier.py | 31 + manim/utils/color.py | 27 + manim/utils/directories.py | 50 + manim/utils/file_ops.py | 3 + manim/utils/simple_functions.py | 13 + manim/utils/space_ops.py | 26 + 18 files changed, 3105 insertions(+), 2467 deletions(-) create mode 100644 manim/event_handler/__init__.py create mode 100644 manim/event_handler/event_dispatcher.py create mode 100644 manim/event_handler/event_listener.py create mode 100644 manim/event_handler/event_type.py create mode 100644 manim/utils/directories.py diff --git a/manim/_config/utils.py b/manim/_config/utils.py index cdbd62fce4..98229ac4c6 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -15,6 +15,8 @@ import configparser import copy import errno +import importlib +import inspect import logging import os import re diff --git a/manim/constants.py b/manim/constants.py index d81d85902c..efbb86e1d4 100644 --- a/manim/constants.py +++ b/manim/constants.py @@ -194,6 +194,9 @@ DEGREES: float = TAU / 360 """The exchange rate between radians and degrees.""" +RADIANS: float = 1.0 +"""Just a default to select for camera.""" + # Video qualities QUALITIES: dict[str, dict[str, str | int | None]] = { "fourk_quality": { diff --git a/manim/event_handler/__init__.py b/manim/event_handler/__init__.py new file mode 100644 index 0000000000..1a9a247106 --- /dev/null +++ b/manim/event_handler/__init__.py @@ -0,0 +1,5 @@ +from manim.event_handler.event_dispatcher import EventDispatcher + +# This is supposed to be a Singleton +# i.e., during runtime there should be only one object of Event Dispatcher +EVENT_DISPATCHER = EventDispatcher() diff --git a/manim/event_handler/event_dispatcher.py b/manim/event_handler/event_dispatcher.py new file mode 100644 index 0000000000..050379b5e1 --- /dev/null +++ b/manim/event_handler/event_dispatcher.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +import numpy as np + +from manim.event_handler.event_listener import EventListener +from manim.event_handler.event_type import EventType + + +class EventDispatcher: + def __init__(self): + self.event_listeners: dict[EventType, list[EventListener]] = { + event_type: [] for event_type in EventType + } + self.mouse_point = np.array((0.0, 0.0, 0.0)) + self.mouse_drag_point = np.array((0.0, 0.0, 0.0)) + self.pressed_keys: set[int] = set() + self.draggable_object_listeners: list[EventListener] = [] + + def add_listener(self, event_listener: EventListener): + assert isinstance(event_listener, EventListener) + self.event_listeners[event_listener.event_type].append(event_listener) + return self + + def remove_listener(self, event_listener: EventListener): + assert isinstance(event_listener, EventListener) + try: + while event_listener in self.event_listeners[event_listener.event_type]: + self.event_listeners[event_listener.event_type].remove(event_listener) + except Exception: + # raise ValueError("Handler is not handling this event, so cannot remove it.") + pass + return self + + def dispatch(self, event_type: EventType, **event_data): + if event_type == EventType.MouseMotionEvent: + self.mouse_point = event_data["point"] + elif event_type == EventType.MouseDragEvent: + self.mouse_drag_point = event_data["point"] + elif event_type == EventType.KeyPressEvent: + self.pressed_keys.add(event_data["symbol"]) # Modifiers? + elif event_type == EventType.KeyReleaseEvent: + self.pressed_keys.difference_update({event_data["symbol"]}) # Modifiers? + elif event_type == EventType.MousePressEvent: + self.draggable_object_listeners = [ + listener + for listener in self.event_listeners[EventType.MouseDragEvent] + if listener.mobject.is_point_touching(self.mouse_point) + ] + elif event_type == EventType.MouseReleaseEvent: + self.draggable_object_listeners = [] + + propagate_event = None + + if event_type == EventType.MouseDragEvent: + for listener in self.draggable_object_listeners: + assert isinstance(listener, EventListener) + propagate_event = listener.callback(listener.mobject, event_data) + if propagate_event is not None and propagate_event is False: + return propagate_event + + elif event_type.value.startswith("mouse"): + for listener in self.event_listeners[event_type]: + if listener.mobject.is_point_touching(self.mouse_point): + propagate_event = listener.callback(listener.mobject, event_data) + if propagate_event is not None and propagate_event is False: + return propagate_event + + elif event_type.value.startswith("key"): + for listener in self.event_listeners[event_type]: + propagate_event = listener.callback(listener.mobject, event_data) + if propagate_event is not None and propagate_event is False: + return propagate_event + + return propagate_event + + def get_listeners_count(self) -> int: + return sum([len(value) for key, value in self.event_listeners.items()]) + + def get_mouse_point(self) -> np.ndarray: + return self.mouse_point + + def get_mouse_drag_point(self) -> np.ndarray: + return self.mouse_drag_point + + def is_key_pressed(self, symbol: int) -> bool: + return symbol in self.pressed_keys + + __iadd__ = add_listener + __isub__ = remove_listener + __call__ = dispatch + __len__ = get_listeners_count diff --git a/manim/event_handler/event_listener.py b/manim/event_handler/event_listener.py new file mode 100644 index 0000000000..9c923d4d57 --- /dev/null +++ b/manim/event_handler/event_listener.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from typing import Callable + + import manim.mobject.opengl.opengl_mobject as glmob + from manim.event_handler.event_type import EventType + + +class EventListener: + def __init__( + self, + mobject: glmob.OpenGLMobject, + event_type: EventType, + event_callback: Callable[[glmob.OpenGLMobject, dict[str, str]], None], + ): + self.mobject = mobject + self.event_type = event_type + self.callback = event_callback + + def __eq__(self, o: object) -> bool: + return_val = False + if isinstance(o, EventListener): + try: + return_val = ( + self.callback == o.callback + and self.mobject == o.mobject + and self.event_type == o.event_type + ) + except Exception: + pass + return return_val diff --git a/manim/event_handler/event_type.py b/manim/event_handler/event_type.py new file mode 100644 index 0000000000..b9a9eb2da3 --- /dev/null +++ b/manim/event_handler/event_type.py @@ -0,0 +1,11 @@ +from enum import Enum + + +class EventType(Enum): + MouseMotionEvent = "mouse_motion_event" + MousePressEvent = "mouse_press_event" + MouseReleaseEvent = "mouse_release_event" + MouseDragEvent = "mouse_drag_event" + MouseScrollEvent = "mouse_scroll_event" + KeyPressEvent = "key_press_event" + KeyReleaseEvent = "key_release_event" diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index 25159ab23c..568c040ea5 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -2,11 +2,14 @@ import copy import itertools as it +import numbers +import os +import pickle import random import sys from functools import partialmethod, wraps from math import ceil -from typing import Iterable, Sequence +from typing import TYPE_CHECKING import moderngl import numpy as np @@ -14,10 +17,14 @@ from manim import config, logger from manim.constants import * +from manim.event_handler import EVENT_DISPATCHER +from manim.event_handler.event_listener import EventListener +from manim.event_handler.event_type import EventType +from manim.renderer.shader_wrapper import ShaderWrapper, get_colormap_code from manim.utils.bezier import integer_interpolate, interpolate from manim.utils.color import * -from manim.utils.color import Colors -from manim.utils.config_ops import _Data, _Uniforms +from manim.utils.color import Colors, get_colormap_list +from manim.utils.deprecation import deprecated # from ..utils.iterables import batch_by_property from manim.utils.iterables import ( @@ -34,20 +41,23 @@ from manim.utils.simple_functions import get_parameters from manim.utils.space_ops import ( angle_between_vectors, + angle_of_vector, + get_norm, normalize, rotation_matrix_transpose, ) +if TYPE_CHECKING: + from typing import Callable, Iterable, Sequence, Tuple, Union -def affects_shader_info_id(func): - @wraps(func) - def wrapper(self): - for mob in self.get_family(): - func(mob) - mob.refresh_shader_wrapper_id() - return self + from typing_extensions import Self, TypeAlias - return wrapper + TimeBasedUpdater: TypeAlias = Callable[[OpenGLMobject, float], OpenGLMobject | None] + NonTimeUpdater: TypeAlias = Callable[[OpenGLMobject], OpenGLMobject | None] + Updater: TypeAlias = Union[TimeBasedUpdater, NonTimeUpdater] + PointUpdateFunction: TypeAlias = Callable[[np.ndarray], np.ndarray] + +UNIFORM_DTYPE = np.float64 class OpenGLMobject: @@ -66,96 +76,60 @@ class OpenGLMobject: """ - shader_dtype = [ + dim: int = 3 + shader_folder: str = "" + render_primitive: int = moderngl.TRIANGLE_STRIP + shader_dtype: Sequence[tuple[str, type, tuple[int]]] = [ ("point", np.float32, (3,)), ] - shader_folder = "" - - # _Data and _Uniforms are set as class variables to tell manim how to handle setting/getting these attributes later. - points = _Data() - bounding_box = _Data() - rgbas = _Data() - - is_fixed_in_frame = _Uniforms() - is_fixed_orientation = _Uniforms() - fixed_orientation_center = _Uniforms() # for fixed orientation reference - gloss = _Uniforms() - shadow = _Uniforms() def __init__( self, color=WHITE, - opacity=1, - dim=3, # TODO, get rid of this - # Lighting parameters - # Positive gloss up to 1 makes it reflect the light. - gloss=0.0, - # Positive shadow up to 1 makes a side opposite the light darker - shadow=0.0, - # For shaders - render_primitive=moderngl.TRIANGLES, - texture_paths=None, - depth_test=False, - # If true, the mobject will not get rotated according to camera position - is_fixed_in_frame=False, - is_fixed_orientation=False, - # Must match in attributes of vert shader - # Event listener - listen_to_events=False, - model_matrix=None, - should_render=True, + opacity: float = 1.0, + reflectiveness: float = 0.0, + shadow: float = 0.0, + gloss: float = 0.0, + texture_paths: dict[str, str] | None = None, + is_fixed_in_frame: bool = False, + depth_test: bool = False, name: str | None = None, **kwargs, ): - self.name = self.__class__.__name__ if name is None else name - # getattr in case data/uniforms are already defined in parent classes. - self.data = getattr(self, "data", {}) - self.uniforms = getattr(self, "uniforms", {}) - + self.color = color self.opacity = opacity - self.dim = dim # TODO, get rid of this - # Lighting parameters - # Positive gloss up to 1 makes it reflect the light. - self.gloss = gloss - # Positive shadow up to 1 makes a side opposite the light darker + self.reflectiveness = reflectiveness self.shadow = shadow - # For shaders - self.render_primitive = render_primitive + self.gloss = gloss self.texture_paths = texture_paths + self.is_fixed_in_frame = is_fixed_in_frame self.depth_test = depth_test - # If true, the mobject will not get rotated according to camera position - self.is_fixed_in_frame = float(is_fixed_in_frame) - self.is_fixed_orientation = float(is_fixed_orientation) - self.fixed_orientation_center = (0, 0, 0) - # Must match in attributes of vert shader - # Event listener - self.listen_to_events = listen_to_events - - self._submobjects = [] - self.parents = [] - self.parent = None - self.family = [self] - self.locked_data_keys = set() - self.needs_new_bounding_box = True - if model_matrix is None: - self.model_matrix = np.eye(4) - else: - self.model_matrix = model_matrix + self.name = self.__class__.__name__ if name is None else name + + # internal_state + self.submobjects: list[OpenGLMobject] = [] + self.parents: list[OpenGLMobject] = [] + self.family: list[OpenGLMobject] = [self] + self.locked_data_keys: set[str] = set() + self.needs_new_bounding_box: bool = True + self._is_animating: bool = False + self.saved_state: OpenGLMobject | None = None + self.target: OpenGLMobject | None = None + + self.data: dict[str, np.ndarray] = {} + self.uniforms: dict[str, float | np.ndarray] = {} self.init_data() + self.init_uniforms() self.init_updaters() - # self.init_event_listners() + self.init_event_listeners() self.init_points() - self.color = Color(color) if color else None self.init_colors() - - self.shader_indices = None + self.init_shader_data() if self.depth_test: self.apply_depth_test() - self.should_render = should_render - @classmethod def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) @@ -167,17 +141,15 @@ def __str__(self): def __repr__(self): return str(self.name) - def __sub__(self, other): - return NotImplemented - - def __isub__(self, other): - return NotImplemented - - def __add__(self, mobject): - return NotImplemented + def __add__(self, other: OpenGLMobject) -> Self: + if not isinstance(other, OpenGLMobject): + raise TypeError(f"Only Mobjects can be added to Mobjects not {type(other)}") + return self.get_group_class()(self, other) - def __iadd__(self, mobject): - return NotImplemented + def __mul__(self, other: int) -> Self: + if not isinstance(other, int): + raise TypeError(f"Only int can be multiplied to Mobjects not {type(other)}") + return self.replicate(other) @classmethod def set_default(cls, **kwargs): @@ -227,12 +199,51 @@ def construct(self): else: cls.__init__ = cls._original__init__ + @property + def points(self): + return self.data["points"] + + @points.setter + def points(self, value): + self.data["points"] = value + + @property + def bounding_box(self): + return self.data["bounding_box"] + + @bounding_box.setter + def bounding_box(self, value): + self.data["bounding_box"] = value + + @property + def rgbas(self): + return self.data["rgbas"] + + @rgbas.setter + def rgbas(self, value): + self.data["rgbas"] = value + def init_data(self): """Initializes the ``points``, ``bounding_box`` and ``rgbas`` attributes and groups them into self.data. Subclasses can inherit and overwrite this method to extend `self.data`.""" - self.points = np.zeros((0, 3)) - self.bounding_box = np.zeros((3, 3)) - self.rgbas = np.zeros((1, 4)) + self.data = { + "points": np.zeros((0, 3)), + "bounding_box": np.zeros((3, 3)), + "rgbas": np.zeros((1, 4)), + } + + def init_uniforms(self): + """Initializes the uniforms. + + Gets called upon creation""" + self.uniforms = { + "is_fixed_in_frame": np.array( + float(self.is_fixed_in_frame), dtype=UNIFORM_DTYPE + ), + "gloss": np.array(self.gloss, dtype=UNIFORM_DTYPE), + "shadow": np.array(self.shadow, dtype=UNIFORM_DTYPE), + "reflectiveness": np.array(self.reflectiveness, dtype=UNIFORM_DTYPE), + } def init_colors(self): """Initializes the colors. @@ -248,52 +259,20 @@ def init_points(self): # Typically implemented in subclass, unless purposefully left blank pass - def set(self, **kwargs) -> OpenGLMobject: - """Sets attributes. - - Mainly to be used along with :attr:`animate` to - animate setting attributes. - - Examples - -------- - :: - - >>> mob = OpenGLMobject() - >>> mob.set(foo=0) - OpenGLMobject - >>> mob.foo - 0 - - Parameters - ---------- - **kwargs - The attributes and corresponding values to set. - - Returns - ------- - :class:`OpenGLMobject` - ``self`` - - - """ - - for attr, value in kwargs.items(): - setattr(self, attr, value) - - return self - def set_data(self, data): for key in data: - self.data[key] = data[key].copy() + self.data[key] = data[key] return self def set_uniforms(self, uniforms): - for key in uniforms: - self.uniforms[key] = uniforms[key] # Copy? + for key, value in uniforms.items(): + if isinstance(value, np.ndarray): + value = value.copy() + self.uniforms[key] = value return self @property - def animate(self): + def animate(self) -> _AnimationBuilder: """Used to animate the application of a method. .. warning:: @@ -380,6 +359,101 @@ def construct(self): """ return _AnimationBuilder(self) + def resize_points(self, new_length, resize_func=resize_array): + if new_length != len(self.points): + self.points = resize_func(self.points, new_length) + self.refresh_bounding_box() + return self + + def set_points(self, points): + if len(points) == len(self.points): + self.points[:] = points + elif isinstance(points, np.ndarray): + self.points = points.copy() + else: + self.points = np.array(points) + self.refresh_bounding_box() + return self + + def append_points(self, new_points): + self.points = np.vstack([self.points, new_points]) + self.refresh_bounding_box() + return self + + def reverse_points(self): + for mob in self.get_family(): + for key in mob.data: + mob.data[key] = mob.data[key][::-1] + return self + + def apply_points_function( + self, + func: PointUpdateFunction, + about_point=None, + about_edge=ORIGIN, + works_on_bounding_box=False, + ): + if about_point is None and about_edge is not None: + about_point = self.get_bounding_box_point(about_edge) + + for mob in self.get_family(): + arrs = [] + if mob.has_points(): + arrs.append(mob.points) + if works_on_bounding_box: + arrs.append(mob.get_bounding_box()) + + for arr in arrs: + if about_point is None: + arr[:] = func(arr) + else: + arr[:] = func(arr - about_point) + about_point + + if not works_on_bounding_box: + self.refresh_bounding_box(recurse_down=True) + else: + for parent in self.parents: + parent.refresh_bounding_box() + return self + + # ce only + def get_array_attrs(self): + """This method is used to determine which attributes of the :class:`~.OpenGLMobject` are arrays. + These can be used to apply functions to all of them at once. + """ + return ["points"] + + # ce only + def apply_over_attr_arrays(self, func): + """This method is used to apply a function to all attributes of the :class:`~.OpenGLMobject` that are arrays.""" + for attr in self.get_array_attrs(): + setattr(self, attr, func(getattr(self, attr))) + return self + + # ce only + def get_midpoint(self) -> np.ndarray: + """Get coordinates of the middle of the path that forms the :class:`~.OpenGLMobject`. + + Examples + -------- + + .. manim:: AngleMidPoint + :save_last_frame: + + class AngleMidPoint(Scene): + def construct(self): + line1 = Line(ORIGIN, 2*RIGHT) + line2 = Line(ORIGIN, 2*RIGHT).rotate_about_origin(80*DEGREES) + + a = Angle(line1, line2, radius=1.5, other_angle=False) + d = Dot(a.get_midpoint()).set_color(RED) + + self.add(line1, line2, a, d) + self.wait() + + """ + return self.point_from_proportion(0.5) + @property def width(self): """The width of the mobject. @@ -476,91 +550,6 @@ def depth(self): def depth(self, value): self.rescale_to_fit(value, 2, stretch=False) - def resize_points(self, new_length, resize_func=resize_array): - if new_length != len(self.points): - self.points = resize_func(self.points, new_length) - self.refresh_bounding_box() - return self - - def set_points(self, points): - if len(points) == len(self.points): - self.points[:] = points - elif isinstance(points, np.ndarray): - self.points = points.copy() - else: - self.points = np.array(points) - self.refresh_bounding_box() - return self - - def apply_over_attr_arrays(self, func): - for attr in self.get_array_attrs(): - setattr(self, attr, func(getattr(self, attr))) - return self - - def append_points(self, new_points): - self.points = np.vstack([self.points, new_points]) - self.refresh_bounding_box() - return self - - def reverse_points(self): - for mob in self.get_family(): - for key in mob.data: - mob.data[key] = mob.data[key][::-1] - return self - - def get_midpoint(self) -> np.ndarray: - """Get coordinates of the middle of the path that forms the :class:`~.OpenGLMobject`. - - Examples - -------- - - .. manim:: AngleMidPoint - :save_last_frame: - - class AngleMidPoint(Scene): - def construct(self): - line1 = Line(ORIGIN, 2*RIGHT) - line2 = Line(ORIGIN, 2*RIGHT).rotate_about_origin(80*DEGREES) - - a = Angle(line1, line2, radius=1.5, other_angle=False) - d = Dot(a.get_midpoint()).set_color(RED) - - self.add(line1, line2, a, d) - self.wait() - - """ - return self.point_from_proportion(0.5) - - def apply_points_function( - self, - func, - about_point=None, - about_edge=ORIGIN, - works_on_bounding_box=False, - ): - if about_point is None and about_edge is not None: - about_point = self.get_bounding_box_point(about_edge) - - for mob in self.get_family(): - arrs = [] - if mob.has_points(): - arrs.append(mob.points) - if works_on_bounding_box: - arrs.append(mob.get_bounding_box()) - - for arr in arrs: - if about_point is None: - arr[:] = func(arr) - else: - arr[:] = func(arr - about_point) + about_point - - if not works_on_bounding_box: - self.refresh_bounding_box(recurse_down=True) - else: - for parent in self.parents: - parent.refresh_bounding_box() - return self - # Others related to points def match_points(self, mobject): @@ -581,6 +570,7 @@ def construct(self): self.wait(0.5) """ self.set_points(mobject.points) + return self def clear_points(self): self.points = np.empty((0, 3)) @@ -631,11 +621,28 @@ def refresh_bounding_box(self, recurse_down=False, recurse_up=True): parent.refresh_bounding_box() return self - def is_point_touching(self, point, buff=MED_SMALL_BUFF): + def are_points_touching(self, points, buff: float = 0) -> np.ndarray: bb = self.get_bounding_box() mins = bb[0] - buff maxs = bb[2] + buff - return (point >= mins).all() and (point <= maxs).all() + return ((points >= mins) * (points <= maxs)).all(1) + + def is_point_touching(self, point, buff=MED_SMALL_BUFF): + return self.are_points_touching(np.array(point, ndmin=2), buff)[0] + + def is_touching(self, mobject: OpenGLMobject, buff: float = 1e-2) -> bool: + bb1 = self.get_bounding_box() + bb2 = mobject.get_bounding_box() + return not any( + ( + ( + bb2[2] < bb1[0] - buff + ).any(), # E.g. Right of mobject is left of self's left + ( + bb2[0] > bb1[2] + buff + ).any(), # E.g. Left of mobject is right of self's right + ) + ) # Family matters @@ -648,13 +655,13 @@ def __getitem__(self, value): def __iter__(self): return iter(self.split()) - def __len__(self): + def __len__(self) -> int: return len(self.split()) - def split(self): + def split(self) -> list[OpenGLMobject]: return self.submobjects - def assemble_family(self): + def assemble_family(self) -> Self: sub_families = (sm.get_family() for sm in self.submobjects) self.family = [self, *uniq_chain(*sub_families)] self.refresh_has_updater_status() @@ -663,18 +670,40 @@ def assemble_family(self): parent.assemble_family() return self - def get_family(self, recurse=True): + def get_family(self, recurse=True) -> list[OpenGLMobject]: if recurse and hasattr(self, "family"): return self.family else: return [self] - def family_members_with_points(self): + def family_members_with_points(self) -> list[OpenGLMobject]: return [m for m in self.get_family() if m.has_points()] + def get_ancestors(self, extended: bool = False) -> list[OpenGLMobject]: + """ + Returns parents, grandparents, etc. + Order of result should be from higher members of the hierarchy down. + + If extended is set to true, it includes the ancestors of all family members, + e.g. any other parents of a submobject + """ + ancestors = [] + to_process = list(self.get_family(recurse=extended)) + excluded = set(to_process) + while to_process: + for p in to_process.pop().parents: + if p not in excluded: + ancestors.append(p) + to_process.append(p) + # Ensure mobjects highest in the hierarchy show up first + ancestors.reverse() + # Remove list redundancies while preserving order + return list(dict.fromkeys(ancestors)) + def add( - self, *mobjects: OpenGLMobject, update_parent: bool = False - ) -> OpenGLMobject: + self, + *mobjects: OpenGLMobject, + ) -> Self: """Add mobjects as submobjects. The mobjects are added to :attr:`submobjects`. @@ -733,17 +762,6 @@ def add( ValueError: OpenGLMobject cannot contain self """ - if update_parent: - assert len(mobjects) == 1, "Can't set multiple parents." - mobjects[0].parent = self - - if self in mobjects: - raise ValueError("OpenGLMobject cannot contain self") - if any(mobjects.count(elem) > 1 for elem in mobjects): - logger.warning( - "Attempted adding some Mobject as a child more than once, " - "this is not possible. Repetitions are ignored.", - ) for mobject in mobjects: if not isinstance(mobject, OpenGLMobject): raise TypeError("All submobjects must be of type OpenGLMobject") @@ -754,45 +772,7 @@ def add( self.assemble_family() return self - def insert(self, index: int, mobject: OpenGLMobject, update_parent: bool = False): - """Inserts a mobject at a specific position into self.submobjects - - Effectively just calls ``self.submobjects.insert(index, mobject)``, - where ``self.submobjects`` is a list. - - Highly adapted from ``OpenGLMobject.add``. - - Parameters - ---------- - index - The index at which - mobject - The mobject to be inserted. - update_parent - Whether or not to set ``mobject.parent`` to ``self``. - """ - - if update_parent: - mobject.parent = self - - if mobject is self: - raise ValueError("OpenGLMobject cannot contain self") - - if not isinstance(mobject, OpenGLMobject): - raise TypeError("All submobjects must be of type OpenGLMobject") - - if mobject not in self.submobjects: - self.submobjects.insert(index, mobject) - - if self not in mobject.parents: - mobject.parents.append(self) - - self.assemble_family() - return self - - def remove( - self, *mobjects: OpenGLMobject, update_parent: bool = False - ) -> OpenGLMobject: + def remove(self, *mobjects: OpenGLMobject, reassemble: bool = True) -> Self: """Remove :attr:`submobjects`. The mobjects are removed from :attr:`submobjects`, if they exist. @@ -814,19 +794,16 @@ def remove( :meth:`add` """ - if update_parent: - assert len(mobjects) == 1, "Can't remove multiple parents." - mobjects[0].parent = None - for mobject in mobjects: if mobject in self.submobjects: self.submobjects.remove(mobject) if self in mobject.parents: mobject.parents.remove(self) - self.assemble_family() + if reassemble: + self.assemble_family() return self - def add_to_back(self, *mobjects: OpenGLMobject) -> OpenGLMobject: + def add_to_back(self, *mobjects: OpenGLMobject) -> Self: # NOTE: is the note true OpenGLMobjects? """Add all passed mobjects to the back of the submobjects. @@ -871,7 +848,7 @@ def add_to_back(self, *mobjects: OpenGLMobject) -> OpenGLMobject: :meth:`add` """ - self.submobjects = list_update(mobjects, self.submobjects) + self.set_submobjects(list_update(mobjects, self.submobjects)) return self def replace_submobject(self, index, new_submob): @@ -879,35 +856,43 @@ def replace_submobject(self, index, new_submob): if self in old_submob.parents: old_submob.parents.remove(self) self.submobjects[index] = new_submob + new_submob.parents.append(self) self.assemble_family() return self - def invert(self, recursive=False): - """Inverts the list of :attr:`submobjects`. + def insert_submobject(self, index: int, mobject: OpenGLMobject): + """Inserts a mobject at a specific position into self.submobjects + + Effectively just calls ``self.submobjects.insert(index, mobject)``, + where ``self.submobjects`` is a list. + + Highly adapted from ``OpenGLMobject.add``. Parameters ---------- - recursive - If ``True``, all submobject lists of this mobject's family are inverted. + index + The index at which + mobject + The mobject to be inserted. + update_parent + Whether or not to set ``mobject.parent`` to ``self``. + """ + if mobject is self: + raise ValueError("OpenGLMobject cannot contain self") - Examples - -------- + if not isinstance(mobject, OpenGLMobject): + raise TypeError("All submobjects must be of type OpenGLMobject") - .. manim:: InvertSumobjectsExample + if mobject not in self.submobjects: + self.submobjects.insert(index, mobject) - class InvertSumobjectsExample(Scene): - def construct(self): - s = VGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) - s2 = s.copy() - s2.invert() - s2.shift(DOWN) - self.play(Write(s), Write(s2)) - """ - if recursive: - for submob in self.submobjects: - submob.invert(recursive=True) - list.reverse(self.submobjects) self.assemble_family() + return self + + def set_submobjects(self, submobject_list: list[OpenGLMobject]): + self.remove(*self.submobjects, reassemble=False) + self.add(*submobject_list) + return self # Submobject organization @@ -935,7 +920,8 @@ def construct(self): self.center() return self - def arrange_in_grid( + # !TODO this differs a lot from 3b1b/manim + def arrange_in_grid_legacy( self, rows: int | None = None, cols: int | None = None, @@ -947,7 +933,7 @@ def arrange_in_grid( col_widths: Iterable[float | None] | None = None, flow_order: str = "rd", **kwargs, - ) -> OpenGLMobject: + ) -> Self: """Arrange submobjects in a grid. Parameters @@ -1062,7 +1048,7 @@ def init_size(num, alignments, sizes): # This is favored over rows>cols since in general # the sceene is wider than high. if rows is None: - rows = ceil(len(mobs) / cols) + rows = ceil(len(mobs) / cols) # type: ignore if cols is None: cols = ceil(len(mobs) / rows) if rows * cols < len(mobs): @@ -1117,7 +1103,7 @@ def init_alignments(alignments, num, mapping, name, dir): raise ValueError( 'flow_order must be one of the following values: "dr", "rd", "ld" "dl", "ru", "ur", "lu", "ul".', ) - flow_order = mapper[flow_order] + flow_order = mapper[flow_order] # type: ignore # Reverse row_alignments and row_heights. Necessary since the # grid filling is handled bottom up for simplicity reasons. @@ -1136,7 +1122,11 @@ def reverse(maybe_list): # properties of 0. mobs.extend([placeholder] * (rows * cols - len(mobs))) - grid = [[mobs[flow_order(r, c)] for c in range(cols)] for r in range(rows)] + + grid = [ + [mobs[flow_order(r, c)] for c in range(cols)] # type:ignore + for r in range(rows) + ] measured_heigths = [ max(grid[r][c].height for c in range(cols)) for r in range(rows) @@ -1163,7 +1153,7 @@ def init_sizes(sizes, num, measures, name): x = 0 for c in range(cols): if grid[r][c] is not placeholder: - alignment = row_alignments[r] + col_alignments[c] + alignment = row_alignments[r] + col_alignments[c] # type:ignore line = Line( x * RIGHT + y * UP, (x + widths[c]) * RIGHT + (y + heights[r]) * UP, @@ -1179,20 +1169,76 @@ def init_sizes(sizes, num, measures, name): self.move_to(start_pos) return self - def get_grid(self, n_rows, n_cols, height=None, **kwargs): - """ - Returns a new mobject containing multiple copies of this one - arranged in a grid - """ - grid = self.duplicate(n_rows * n_cols) - grid.arrange_in_grid(n_rows, n_cols, **kwargs) - if height is not None: - grid.set_height(height) - return grid + def arrange_in_grid( + self, + n_rows: int | None = None, + n_cols: int | None = None, + buff: float | None = None, + h_buff: float | None = None, + v_buff: float | None = None, + buff_ratio: float | None = None, + h_buff_ratio: float = 0.5, + v_buff_ratio: float = 0.5, + aligned_edge: np.ndarray = ORIGIN, + fill_rows_first: bool = True, + ): + submobs = self.submobjects + if n_rows is None and n_cols is None: + n_rows = int(np.sqrt(len(submobs))) + if n_rows is None and n_cols is not None: + n_rows = len(submobs) // n_cols + if n_cols is None and n_rows is not None: + n_cols = len(submobs) // n_rows + + if buff is not None: + h_buff = buff + v_buff = buff + else: + if buff_ratio is not None: + v_buff_ratio = buff_ratio + h_buff_ratio = buff_ratio + if h_buff is None: + h_buff = h_buff_ratio * self[0].get_width() + if v_buff is None: + v_buff = v_buff_ratio * self[0].get_height() + + x_unit = h_buff + max([sm.get_width() for sm in submobs]) + y_unit = v_buff + max([sm.get_height() for sm in submobs]) + + for index, sm in enumerate(submobs): + if fill_rows_first: + x, y = index % n_cols, index // n_cols # type: ignore + else: + x, y = index // n_rows, index % n_rows # type: ignore + sm.move_to(ORIGIN, aligned_edge) + sm.shift(x * x_unit * RIGHT + y * y_unit * DOWN) + self.center() + return self - def duplicate(self, n: int): - """Returns an :class:`~.OpenGLVGroup` containing ``n`` copies of the mobject.""" - return self.get_group_class()(*[self.copy() for _ in range(n)]) + def arrange_to_fit_dim(self, length: float, dim: int, about_edge=ORIGIN): + ref_point = self.get_bounding_box_point(about_edge) + n_submobs = len(self.submobjects) + if n_submobs <= 1: + return + total_length = sum(sm.length_over_dim(dim) for sm in self.submobjects) + buff = (length - total_length) / (n_submobs - 1) + vect = np.zeros(self.dim) + vect[dim] = 1 + x = 0 + for submob in self.submobjects: + submob.set_coord(x, dim, -vect) + x += submob.length_over_dim(dim) + buff + self.move_to(ref_point, about_edge) + return self + + def arrange_to_fit_width(self, width: float, about_edge=ORIGIN): + return self.arrange_to_fit_dim(width, 0, about_edge) + + def arrange_to_fit_height(self, height: float, about_edge=ORIGIN): + return self.arrange_to_fit_dim(height, 1, about_edge) + + def arrange_to_fit_depth(self, depth: float, about_edge=ORIGIN): + return self.arrange_to_fit_dim(depth, 2, about_edge) def sort(self, point_to_num_func=lambda p: p[0], submob_func=None): """Sorts the list of :attr:`submobjects` by a function defined by ``submob_func``.""" @@ -1225,8 +1271,8 @@ def construct(self): self.assemble_family() return self - def invert(self, recursive=False): - """Inverts the list of :attr:`submobjects`. + def reverse_submobjects(self, recursive=False): + """Reverses the list of :attr:`submobjects`. Parameters ---------- @@ -1236,24 +1282,58 @@ def invert(self, recursive=False): Examples -------- - .. manim:: InvertSumobjectsExample + .. manim:: ReverseSumobjectsExample - class InvertSumobjectsExample(Scene): + class ReverseSumobjectsExample(Scene): def construct(self): s = VGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) s2 = s.copy() - s2.invert() + s2.reverse_submobjects() s2.shift(DOWN) self.play(Write(s), Write(s2)) """ if recursive: for submob in self.submobjects: - submob.invert(recursive=True) - list.reverse(self.submobjects) + submob.reverse_submobjects(recursive=True) + self.submobjects.reverse() + self.assemble_family() # Copying - def copy(self, shallow: bool = False): + @staticmethod + def stash_mobject_pointers(func: Callable): + @wraps(func) + def wrapper(self, *args, **kwargs): + uncopied_attrs = ["parents", "target", "saved_state"] + stash = {} + for attr in uncopied_attrs: + if hasattr(self, attr): + value = getattr(self, attr) + stash[attr] = value + null_value = [] if isinstance(value, list) else None + setattr(self, attr, null_value) + result = func(self, *args, **kwargs) + self.__dict__.update(stash) + return result + + return wrapper + + @stash_mobject_pointers + def serialize(self) -> bytes: + return pickle.dumps(self) + + def deserialize(self, data: bytes) -> Self: + self.become(pickle.loads(data)) + return self + + def deepcopy(self) -> Self: + try: + return pickle.loads(pickle.dumps(self)) + except AttributeError: + return copy.deepcopy(self) + + @stash_mobject_pointers + def copy(self, deep: bool = False) -> Self: """Create and return an identical copy of the :class:`OpenGLMobject` including all :attr:`submobjects`. @@ -1271,116 +1351,174 @@ def copy(self, shallow: bool = False): ---- The clone is initially not visible in the Scene, even if the original was. """ - if not shallow: + if deep: return self.deepcopy() - # TODO, either justify reason for shallow copy, or - # remove this redundancy everywhere - # return self.deepcopy() - - parents = self.parents - self.parents = [] - copy_mobject = copy.copy(self) - self.parents = parents - - copy_mobject.data = dict(self.data) - for key in self.data: - copy_mobject.data[key] = self.data[key].copy() - - # TODO, are uniforms ever numpy arrays? - copy_mobject.uniforms = dict(self.uniforms) - - copy_mobject.submobjects = [] - copy_mobject.add(*(sm.copy() for sm in self.submobjects)) - copy_mobject.match_updaters(self) + result = copy.copy(self) + + # The line above is only a shallow copy, so the internal + # data which are numpyu arrays or other mobjects still + # need to be further copied. + result.data = {k: np.array(v) for k, v in self.data.items()} + result.uniforms = {k: np.array(v) for k, v in self.uniforms.items()} + + # Instead of adding using result.add, which does some checks for updating + # updater statues and bounding box, just directly modify the family-related + # lists + result.submobjects = [sm.copy() for sm in self.submobjects] + for sm in result.submobjects: + sm.parents = [result] + result.family = [ + result, + *it.chain(*(sm.get_family() for sm in result.submobjects)), + ] - copy_mobject.needs_new_bounding_box = self.needs_new_bounding_box + # Similarly, instead of calling match_updaters, since we know the status + # won't have changed, just directly match. + result.non_time_updaters = list(self.non_time_updaters) + result.time_based_updaters = list(self.time_based_updaters) - # Make sure any mobject or numpy array attributes are copied family = self.get_family() for attr, value in list(self.__dict__.items()): if ( isinstance(value, OpenGLMobject) - and value in family and value is not self + and value in family ): - setattr(copy_mobject, attr, value.copy()) + setattr(result, attr, result.family[self.family.index(value)]) if isinstance(value, np.ndarray): - setattr(copy_mobject, attr, value.copy()) - # if isinstance(value, ShaderWrapper): - # setattr(copy_mobject, attr, value.copy()) - return copy_mobject - - def deepcopy(self): - parents = self.parents - self.parents = [] - result = copy.deepcopy(self) - self.parents = parents + setattr(result, attr, value.copy()) + if isinstance(value, ShaderWrapper): + setattr(result, attr, value.copy()) return result def generate_target(self, use_deepcopy: bool = False): - self.target = None # Prevent exponential explosion - if use_deepcopy: - self.target = self.deepcopy() - else: - self.target = self.copy() + target: OpenGLMobject = self.copy(deep=use_deepcopy) + target.saved_state = self.saved_state + self.target = target return self.target def save_state(self, use_deepcopy: bool = False): """Save the current state (position, color & size). Can be restored with :meth:`~.OpenGLMobject.restore`.""" - if hasattr(self, "saved_state"): - # Prevent exponential growth of data - self.saved_state = None - if use_deepcopy: - self.saved_state = self.deepcopy() + saved_state: OpenGLMobject = self.copy(deep=use_deepcopy) + saved_state.target = self.target + self.saved_state = saved_state + return self + + def restore(self): + """Restores the state that was previously saved with :meth:`~.OpenGLMobject.save_state`.""" + if not hasattr(self, "saved_state") or self.save_state is None: + raise Exception("Trying to restore without having saved") + self.become(self.saved_state) + return self + + def save_to_file(self, file_path: str): + with open(file_path, "wb") as fp: + fp.write(self.serialize()) + logger.info(f"Saved mobject to {file_path}") + return self + + @staticmethod + def load(file_path): + if not os.path.exists(file_path): + logger.error(f"No file found at {file_path}") + sys.exit(2) + with open(file_path, "rb") as fp: + mobject = pickle.load(fp) + return mobject + + # Creating new Mobjects from this one + + def replicate(self, n: int) -> OpenGLGroup: + """Returns an :class:`~.OpenGLVGroup` containing ``n`` copies of the mobject.""" + group_class = self.get_group_class() + return group_class(*(self.copy() for _ in range(n))) + + def get_grid_legacy(self, n_rows, n_cols, height=None, **kwargs): + """ + Returns a new mobject containing multiple copies of this one + arranged in a grid + """ + grid = self.duplicate(n_rows * n_cols) + grid.arrange_in_grid(n_rows, n_cols, **kwargs) + if height is not None: + grid.set_height(height) + return grid + + def get_grid( + self, + n_rows: int, + n_cols: int, + height: float | None = None, + width: float | None = None, + group_by_rows: bool = False, + group_by_cols: bool = False, + **kwargs, + ) -> OpenGLGroup: + """ + Returns a new mobject containing multiple copies of this one + arranged in a grid + """ + total = n_rows * n_cols + grid = self.replicate(total) + if group_by_cols: + kwargs["fill_rows_first"] = False + grid.arrange_in_grid(n_rows, n_cols, **kwargs) + if height is not None: + grid.set_height(height) + if width is not None: + grid.set_height(width) + + group_class = self.get_group_class() + if group_by_rows: + return group_class(*(grid[n : n + n_cols] for n in range(0, total, n_cols))) + elif group_by_cols: + return group_class(*(grid[n : n + n_rows] for n in range(0, total, n_rows))) else: - self.saved_state = self.copy() - return self - - def restore(self): - """Restores the state that was previously saved with :meth:`~.OpenGLMobject.save_state`.""" - if not hasattr(self, "saved_state") or self.save_state is None: - raise Exception("Trying to restore without having saved") - self.become(self.saved_state) - return self + return grid # Updating - def init_updaters(self): - self.time_based_updaters = [] - self.non_time_updaters = [] - self.has_updaters = False - self.updating_suspended = False + def init_updaters(self) -> None: + self.time_based_updaters: list[TimeBasedUpdater] = [] + self.non_time_updaters: list[NonTimeUpdater] = [] + self.has_updaters: bool = False + self.updating_suspended: bool = False - def update(self, dt=0, recurse=True): + def update(self, dt: float = 0, recurse: bool = True) -> Self: if not self.has_updaters or self.updating_suspended: return self - for updater in self.time_based_updaters: - updater(self, dt) - for updater in self.non_time_updaters: - updater(self) + for time_updater in self.time_based_updaters: + time_updater(self, dt) + for non_time_updater in self.non_time_updaters: + non_time_updater(self) if recurse: for submob in self.submobjects: submob.update(dt, recurse) return self - def get_time_based_updaters(self): + def get_time_based_updaters(self) -> list[TimeBasedUpdater]: return self.time_based_updaters - def has_time_based_updater(self): + def has_time_based_updater(self) -> bool: return len(self.time_based_updaters) > 0 - def get_updaters(self): + def get_updaters(self) -> list[Updater]: return self.time_based_updaters + self.non_time_updaters - def get_family_updaters(self): + def get_family_updaters(self) -> list[Updater]: return list(it.chain(*(sm.get_updaters() for sm in self.get_family()))) - def add_updater(self, update_function, index=None, call_updater=False): + def add_updater( + self, + update_function: Updater, + index: int | None = None, + call_updater: bool = False, + ) -> Self: if "dt" in get_parameters(update_function): - updater_list = self.time_based_updaters + updater_list: list[Updater] = self.time_based_updaters # type: ignore else: - updater_list = self.non_time_updaters + updater_list: list[Updater] = self.non_time_updaters # type: ignore if index is None: updater_list.append(update_function) @@ -1392,14 +1530,18 @@ def add_updater(self, update_function, index=None, call_updater=False): self.update() return self - def remove_updater(self, update_function): - for updater_list in [self.time_based_updaters, self.non_time_updaters]: + def remove_updater(self, update_function: Updater) -> Self: + updater_lists: list[list[Updater]] = [ + self.time_based_updaters, # type: ignore + self.non_time_updaters, # type: ignore + ] + for updater_list in updater_lists: while update_function in updater_list: updater_list.remove(update_function) self.refresh_has_updater_status() return self - def clear_updaters(self, recurse=True): + def clear_updaters(self, recurse: bool = True) -> Self: self.time_based_updaters = [] self.non_time_updaters = [] self.refresh_has_updater_status() @@ -1408,20 +1550,20 @@ def clear_updaters(self, recurse=True): submob.clear_updaters() return self - def match_updaters(self, mobject): + def match_updaters(self, mobject: OpenGLMobject) -> Self: self.clear_updaters() for updater in mobject.get_updaters(): self.add_updater(updater) return self - def suspend_updating(self, recurse=True): + def suspend_updating(self, recurse: bool = True) -> Self: self.updating_suspended = True if recurse: for submob in self.submobjects: submob.suspend_updating(recurse) return self - def resume_updating(self, recurse=True, call_updater=True): + def resume_updating(self, recurse: bool = True, call_updater: bool = True) -> Self: self.updating_suspended = False if recurse: for submob in self.submobjects: @@ -1432,13 +1574,23 @@ def resume_updating(self, recurse=True, call_updater=True): self.update(dt=0, recurse=recurse) return self - def refresh_has_updater_status(self): + def refresh_has_updater_status(self) -> Self: self.has_updaters = any(mob.get_updaters() for mob in self.get_family()) return self + # Check if mark as static or not for camera + + def is_changing(self) -> bool: + return self.has_updaters or self._is_animating + + def set_animating_status(self, is_animating: bool, recurse: bool = True) -> Self: + for mob in (*self.get_family(recurse), *self.get_ancestors(extended=True)): + mob._is_animating = is_animating + return self + # Transforming operations - def shift(self, vector): + def shift(self, vector) -> Self: self.apply_points_function( lambda points: points + vector, about_edge=None, @@ -1448,11 +1600,12 @@ def shift(self, vector): def scale( self, - scale_factor: float, - about_point: Sequence[float] | None = None, - about_edge: Sequence[float] = ORIGIN, + scale_factor: float | np.ndarray, + min_scale_factor: float = 1e-8, + about_point: Sequence[float] | np.ndarray | None = None, + about_edge: Sequence[float] | np.ndarray = ORIGIN, **kwargs, - ) -> OpenGLMobject: + ) -> Self: r"""Scale the size by a factor. Default behavior is to scale about the center of the mobject. @@ -1469,6 +1622,10 @@ def scale( The scaling factor :math:`\alpha`. If :math:`0 < |\alpha| < 1`, the mobject will shrink, and for :math:`|\alpha| > 1` it will grow. Furthermore, if :math:`\alpha < 0`, the mobject is also flipped. + + min_scale_factor + The minimum scaling factor that is used such that the mobject is not scaled to zero. + kwargs Additional keyword arguments passed to :meth:`apply_points_function_about_point`. @@ -1499,16 +1656,33 @@ def construct(self): :meth:`move_to` """ + if isinstance(scale_factor, numbers.Number): + scale_factor = max(scale_factor, min_scale_factor) + else: + scale_factor = np.array(scale_factor).clip(min=min_scale_factor) # type: ignore self.apply_points_function( lambda points: scale_factor * points, about_point=about_point, about_edge=about_edge, works_on_bounding_box=True, - **kwargs, ) + for mob in self.get_family(): + mob._handle_scale_side_effects(scale_factor) return self - def stretch(self, factor, dim, **kwargs): + def _handle_scale_side_effects(self, scale_factor: float | np.ndarray) -> None: + """In case subclasses, such as DecimalNumber, need to make + any other changes when the size gets altered by scaling. + This method can be overridden in subclasses. + + Parameters + ---------- + scale_factor + The scaling factor :math:`\alpha`. If :math:`0 < |\alpha| < 1` + """ + pass + + def stretch(self, factor: float, dim: int, **kwargs) -> Self: def func(points): points[:, dim] *= factor return points @@ -1516,16 +1690,16 @@ def func(points): self.apply_points_function(func, works_on_bounding_box=True, **kwargs) return self - def rotate_about_origin(self, angle, axis=OUT): - return self.rotate(angle, axis, about_point=ORIGIN) + def rotate_about_origin(self, angle: float, axis=OUT) -> Self: + return self.rotate(angle, axis, about_point=ORIGIN) # type: ignore def rotate( self, - angle, + angle: float, axis=OUT, about_point: Sequence[float] | None = None, **kwargs, - ): + ) -> Self: """Rotates the :class:`~.OpenGLMobject` about a certain point.""" rot_matrix_T = rotation_matrix_transpose(angle, axis) self.apply_points_function( @@ -1535,7 +1709,7 @@ def rotate( ) return self - def flip(self, axis=UP, **kwargs): + def flip(self, axis=UP, **kwargs) -> Self: """Flips/Mirrors an mobject about its center. Examples @@ -1554,7 +1728,7 @@ def construct(self): """ return self.rotate(TAU / 2, axis, **kwargs) - def apply_function(self, function, **kwargs): + def apply_function(self, function: PointUpdateFunction, **kwargs) -> Self: # Default to applying matrix about the origin, not mobjects center if len(kwargs) == 0: kwargs["about_point"] = ORIGIN @@ -1563,16 +1737,18 @@ def apply_function(self, function, **kwargs): ) return self - def apply_function_to_position(self, function): + def apply_function_to_position(self, function: PointUpdateFunction) -> Self: self.move_to(function(self.get_center())) return self - def apply_function_to_submobject_positions(self, function): + def apply_function_to_submobject_positions( + self, function: PointUpdateFunction + ) -> Self: for submob in self.submobjects: submob.apply_function_to_position(function) return self - def apply_matrix(self, matrix, **kwargs): + def apply_matrix(self, matrix, **kwargs) -> Self: # Default to applying matrix about the origin, not mobjects center if ("about_point" not in kwargs) and ("about_edge" not in kwargs): kwargs["about_point"] = ORIGIN @@ -1584,7 +1760,7 @@ def apply_matrix(self, matrix, **kwargs): ) return self - def apply_complex_function(self, function, **kwargs): + def apply_complex_function(self, function, **kwargs) -> Self: """Applies a complex function to a :class:`OpenGLMobject`. The x and y coordinates correspond to the real and imaginary parts respectively. @@ -1629,7 +1805,7 @@ def hierarchical_model_matrix(self): current_object = current_object.parent return np.linalg.multi_dot(list(reversed(model_matrices))) - def wag(self, direction=RIGHT, axis=DOWN, wag_factor=1.0): + def wag(self, direction=RIGHT, axis=DOWN, wag_factor=1.0) -> Self: for mob in self.family_members_with_points(): alphas = np.dot(mob.points, np.transpose(axis)) alphas -= min(alphas) @@ -1646,19 +1822,19 @@ def wag(self, direction=RIGHT, axis=DOWN, wag_factor=1.0): # Positioning methods - def center(self): + def center(self) -> Self: """Moves the mobject to the center of the Scene.""" self.shift(-self.get_center()) return self - def align_on_border(self, direction, buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER): + def align_on_border(self, direction, buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER) -> Self: """ Direction just needs to be a vector pointing towards side or corner in the 2d plane. """ target_point = np.sign(direction) * ( - config["frame_x_radius"], - config["frame_y_radius"], + config.frame_x_radius, + config.frame_y_radius, 0, ) point_to_align = self.get_bounding_box_point(direction) @@ -1667,10 +1843,12 @@ def align_on_border(self, direction, buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER): self.shift(shift_val) return self - def to_corner(self, corner=LEFT + DOWN, buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER): + def to_corner( + self, corner=LEFT + DOWN, buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER + ) -> Self: return self.align_on_border(corner, buff) - def to_edge(self, edge=LEFT, buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER): + def to_edge(self, edge=LEFT, buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER) -> Self: return self.align_on_border(edge, buff) def next_to( @@ -1682,7 +1860,7 @@ def next_to( submobject_to_align=None, index_of_submobject_to_align=None, coor_mask=np.array([1, 1, 1]), - ): + ) -> Self: """Move this :class:`~.OpenGLMobject` next to another's :class:`~.OpenGLMobject` or coordinate. Examples @@ -1725,7 +1903,7 @@ def construct(self): return self def shift_onto_screen(self, **kwargs): - space_lengths = [config["frame_x_radius"], config["frame_y_radius"]] + space_lengths = [config.frame_x_radius, config.frame_y_radius] for vect in UP, DOWN, LEFT, RIGHT: dim = np.argmax(np.abs(vect)) buff = kwargs.get("buff", DEFAULT_MOBJECT_TO_EDGE_BUFFER) @@ -1831,6 +2009,36 @@ def set_depth(self, depth, stretch=False, **kwargs): scale_to_fit_depth = set_depth + def set_max_width(self, max_width: float, **kwargs): + if self.get_width() > max_width: + self.set_width(max_width, **kwargs) + return self + + def set_max_height(self, max_height: float, **kwargs): + if self.get_height() > max_height: + self.set_height(max_height, **kwargs) + return self + + def set_max_depth(self, max_depth: float, **kwargs): + if self.get_depth() > max_depth: + self.set_depth(max_depth, **kwargs) + return self + + def set_min_width(self, min_width: float, **kwargs): + if self.get_width() < min_width: + self.set_width(min_width, **kwargs) + return self + + def set_min_height(self, min_height: float, **kwargs): + if self.get_height() < min_height: + self.set_height(min_height, **kwargs) + return self + + def set_min_depth(self, min_depth: float, **kwargs): + if self.get_depth() < min_depth: + self.set_depth(min_depth, **kwargs) + return self + def set_coord(self, value, dim, direction=ORIGIN): curr = self.get_coord(dim, direction) shift_vect = np.zeros(self.dim) @@ -1860,7 +2068,7 @@ def move_to( self, point_or_mobject, aligned_edge=ORIGIN, - coor_mask=np.array([1, 1, 1]), + coor_mask=np.array((1, 1, 1)), ): """Move center of the :class:`~.OpenGLMobject` to certain coordinate.""" if isinstance(point_or_mobject, OpenGLMobject): @@ -1899,12 +2107,13 @@ def surround( self.scale((length + buff) / length) return self - def put_start_and_end_on(self, start, end): + # ! TODO: Check implementation of 3b1b for this method + def put_start_and_end_on_legacy(self, start, end): curr_start, curr_end = self.get_start_and_end() curr_vect = curr_end - curr_start if np.all(curr_vect == 0): raise Exception("Cannot position endpoints of closed loop") - target_vect = np.array(end) - np.array(start) + target_vect = np.asarray(end) - np.asarray(start) axis = ( normalize(np.cross(curr_vect, target_vect)) if np.linalg.norm(np.cross(curr_vect, target_vect)) != 0 @@ -1922,9 +2131,32 @@ def put_start_and_end_on(self, start, end): self.shift(start - curr_start) return self + def put_start_and_end_on(self, start: np.ndarray, end: np.ndarray): + curr_start, curr_end = self.get_start_and_end() + curr_vect = curr_end - curr_start + if np.all(curr_vect == 0): + raise Exception("Cannot position endpoints of closed loop") + target_vect = end - start + self.scale( + get_norm(target_vect) / get_norm(curr_vect), + about_point=curr_start, + ) + self.rotate( + angle_of_vector(target_vect) - angle_of_vector(curr_vect), + ) + self.rotate( + np.arctan2(curr_vect[2], get_norm(curr_vect[:2])) + - np.arctan2(target_vect[2], get_norm(target_vect[:2])), + axis=np.array([-target_vect[1], target_vect[0], 0]), + ) + self.shift(start - self.get_start()) + return self + # Color functions - def set_rgba_array(self, color=None, opacity=None, name="rgbas", recurse=True): + def set_rgba_array_legacy( + self, color=None, opacity=None, name="rgbas", recurse=True + ): if color is not None: rgbs = np.array([color_to_rgb(c) for c in listify(color)]) if opacity is not None: @@ -1954,7 +2186,9 @@ def set_rgba_array(self, color=None, opacity=None, name="rgbas", recurse=True): mob.data[name] = rgbas.copy() return self - def set_rgba_array_direct(self, rgbas: np.ndarray, name="rgbas", recurse=True): + def set_rgba_array( + self, rgba_array: np.ndarray, name: str = "rgbas", recurse: bool = False + ): """Directly set rgba data from `rgbas` and optionally do the same recursively with submobjects. This can be used if the `rgbas` have already been generated with the correct shape and simply need to be set. @@ -1969,7 +2203,58 @@ def set_rgba_array_direct(self, rgbas: np.ndarray, name="rgbas", recurse=True): set to true to recursively apply this method to submobjects """ for mob in self.get_family(recurse): - mob.data[name] = rgbas.copy() + mob.data[name] = np.array(rgba_array) # type: ignore + return self + + def set_color_by_rgba_func( + self, func: Callable[[np.ndarray], np.ndarray], recurse: bool = True + ): + """ + Func should take in a point in R3 and output an rgba value + """ + for mob in self.get_family(recurse): + rgba_array = np.asarray([func(point) for point in mob.points]) + mob.set_rgba_array(rgba_array) + return self + + def set_color_by_rgb_func( + self, + func: Callable[[np.ndarray], np.ndarray], + opacity: float = 1, + recurse: bool = True, + ): + """ + Func should take in a point in R3 and output an rgb value + """ + for mob in self.get_family(recurse): + rgba_array = np.asarray([[*func(point), opacity] for point in mob.points]) + mob.set_rgba_array(rgba_array) + return self + + def set_rgba_array_by_color( + self, + color=None, + opacity: float | Iterable[float] | None = None, + name: str = "rgbas", + recurse: bool = True, + ): + max_len = 0 + if color is not None: + rgbs = np.array([color_to_rgb(c) for c in listify(color)]) + max_len = len(rgbs) + if opacity is not None: + opacities = np.array(listify(opacity)) + max_len = max(max_len, len(opacities)) + + for mob in self.get_family(recurse): + if max_len > len(mob.data[name]): # type: ignore + mob.data[name] = resize_array(mob.data[name], max_len) # type: ignore + size = len(mob.data[name]) # type: ignore + if color is not None: + mob.data[name][:, :3] = resize_array(rgbs, size) # type: ignore + if opacity is not None: + mob.data[name][:, 3] = resize_array(opacities, size) # type: ignore + return self def set_color(self, color, opacity=None, recurse=True): self.set_rgba_array(color, opacity, recurse=False) @@ -1995,10 +2280,13 @@ def get_color(self): return rgb_to_hex(self.rgbas[0, :3]) def get_opacity(self): - return self.rgbas[0, 3] + return self.data["rgbas"][0, 3] - def set_color_by_gradient(self, *colors): - self.set_submobject_colors_by_gradient(*colors) + def set_color_by_gradient(self, *colors: Color): + if self.has_points(): + self.set_color(colors) + else: + self.set_submobject_colors_by_gradient(*colors) return self def set_submobject_colors_by_gradient(self, *colors): @@ -2018,20 +2306,28 @@ def set_submobject_colors_by_gradient(self, *colors): def fade(self, darkness=0.5, recurse=True): self.set_opacity(1.0 - darkness, recurse=recurse) - def get_gloss(self): - return self.gloss + def get_reflectiveness(self) -> np.ndarray: + return self.uniforms["reflectiveness"] + + def set_reflectiveness(self, reflectiveness: float, recurse: bool = True): + for mob in self.get_family(recurse): + mob.uniforms["reflectiveness"] = np.asarray(reflectiveness) + return self + + def get_shadow(self) -> np.ndarray: + return self.uniforms["shadow"] - def set_gloss(self, gloss, recurse=True): + def set_shadow(self, shadow: float, recurse: bool = True): for mob in self.get_family(recurse): - mob.gloss = gloss + mob.uniforms["shadow"] = np.asarray(shadow) return self - def get_shadow(self): - return self.shadow + def get_gloss(self) -> np.ndarray: + return self.uniforms["gloss"] - def set_shadow(self, shadow, recurse=True): + def set_gloss(self, gloss: float, recurse: bool = True): for mob in self.get_family(recurse): - mob.shadow = shadow + mob.uniforms["gloss"] = np.asarray(gloss) return self # Background rectangle @@ -2073,7 +2369,7 @@ def add_background_rectangle( self.background_rectangle = BackgroundRectangle( self, color=color, fill_opacity=opacity, **kwargs ) - self.add_to_back(self.background_rectangle) + self.add_to_back(self.background_rectangle) # type: ignore return self def add_background_rectangle_to_submobjects(self, **kwargs): @@ -2101,6 +2397,15 @@ def get_corner(self, direction) -> np.ndarray: """Get corner coordinates for certain direction.""" return self.get_bounding_box_point(direction) + def get_all_corners(self): + bb = self.get_bounding_box() + return np.array( + [ + [bb[indices[-i + 1]][i] for i in range(3)] + for indices in it.product([0, 2], repeat=3) + ] + ) + def get_center(self) -> np.ndarray: """Get center coordinates.""" return self.get_bounding_box()[1] @@ -2205,9 +2510,8 @@ def point_from_proportion(self, alpha): i, subalpha = integer_interpolate(0, len(points) - 1, alpha) return interpolate(points[i], points[i + 1], subalpha) - def pfp(self, alpha): - """Abbreviation for point_from_proportion""" - return self.point_from_proportion(alpha) + pfp = point_from_proportion + """Abbreviation for point_from_proportion""" def get_pieces(self, n_pieces): template = self.copy() @@ -2247,25 +2551,25 @@ def match_depth(self, mobject: OpenGLMobject, **kwargs): """Match the depth with the depth of another :class:`~.OpenGLMobject`.""" return self.match_dim_size(mobject, 2, **kwargs) - def match_coord(self, mobject: OpenGLMobject, dim, direction=ORIGIN): + def match_coord(self, mobject_or_point: OpenGLMobject, dim, direction=ORIGIN): """Match the coordinates with the coordinates of another :class:`~.OpenGLMobject`.""" - return self.set_coord( - mobject.get_coord(dim, direction), - dim=dim, - direction=direction, - ) + if isinstance(mobject_or_point, OpenGLMobject): + coord = mobject_or_point.get_coord(dim, direction) + else: + coord = mobject_or_point[dim] + return self.set_coord(coord, dim=dim, direction=direction) - def match_x(self, mobject, direction=ORIGIN): + def match_x(self, mobject_or_point, direction=ORIGIN): """Match x coord. to the x coord. of another :class:`~.OpenGLMobject`.""" - return self.match_coord(mobject, 0, direction) + return self.match_coord(mobject_or_point, 0, direction) - def match_y(self, mobject, direction=ORIGIN): + def match_y(self, mobject_or_point, direction=ORIGIN): """Match y coord. to the x coord. of another :class:`~.OpenGLMobject`.""" - return self.match_coord(mobject, 1, direction) + return self.match_coord(mobject_or_point, 1, direction) - def match_z(self, mobject, direction=ORIGIN): + def match_z(self, mobject_or_point, direction=ORIGIN): """Match z coord. to the x coord. of another :class:`~.OpenGLMobject`.""" - return self.match_coord(mobject, 2, direction) + return self.match_coord(mobject_or_point, 2, direction) def align_to( self, @@ -2305,9 +2609,9 @@ def align_data_and_family(self, mobject): self.align_family(mobject) self.align_data(mobject) - def align_data(self, mobject): + def align_data(self, mobject) -> None: # In case any data arrays get resized when aligned to shader data - # self.refresh_shader_data() + self.refresh_shader_data() for mob1, mob2 in zip(self.get_family(), mobject.get_family()): # Separate out how points are treated so that subclasses # can handle that case differently if they choose @@ -2315,20 +2619,20 @@ def align_data(self, mobject): for key in mob1.data.keys() & mob2.data.keys(): if key == "points": continue - arr1 = mob1.data[key] + arr1 = mob1.data[key] # type: ignore arr2 = mob2.data[key] if len(arr2) > len(arr1): - mob1.data[key] = resize_preserving_order(arr1, len(arr2)) + mob1.data[key] = resize_preserving_order(arr1, len(arr2)) # type: ignore elif len(arr1) > len(arr2): mob2.data[key] = resize_preserving_order(arr2, len(arr1)) - def align_points(self, mobject): + def align_points(self, mobject) -> Self: max_len = max(self.get_num_points(), mobject.get_num_points()) for mob in (self, mobject): mob.resize_points(max_len, resize_func=resize_preserving_order) return self - def align_family(self, mobject): + def align_family(self, mobject) -> Self: mob1 = self mob2 = mobject n1 = len(mob1) @@ -2341,14 +2645,14 @@ def align_family(self, mobject): sm1.align_family(sm2) return self - def push_self_into_submobjects(self): + def push_self_into_submobjects(self) -> Self: copy = self.deepcopy() copy.submobjects = [] - self.resize_points(0) + self.clear_points() self.add(copy) return self - def add_n_more_submobjects(self, n): + def add_n_more_submobjects(self, n) -> Self: if n == 0: return self @@ -2377,7 +2681,7 @@ def add_n_more_submobjects(self, n): # Interpolate - def interpolate(self, mobject1, mobject2, alpha, path_func=straight_path()): + def interpolate(self, mobject1, mobject2, alpha, path_func=straight_path) -> Self: """Turns this :class:`~.OpenGLMobject` into an interpolation between ``mobject1`` and ``mobject2``. @@ -2401,7 +2705,7 @@ def construct(self): for key in self.data: if key in self.locked_data_keys: continue - if len(self.data[key]) == 0: + if len(self.data[key]) == 0: # type: ignore continue if key not in mobject1.data or key not in mobject2.data: continue @@ -2411,23 +2715,11 @@ def construct(self): else: func = interpolate - self.data[key][:] = func(mobject1.data[key], mobject2.data[key], alpha) - + self.data[key][:] = func(mobject1.data[key], mobject2.data[key], alpha) # type: ignore for key in self.uniforms: - if key != "fixed_orientation_center": - self.uniforms[key] = interpolate( - mobject1.uniforms[key], - mobject2.uniforms[key], - alpha, - ) - else: - self.uniforms["fixed_orientation_center"] = tuple( - interpolate( - np.array(mobject1.uniforms["fixed_orientation_center"]), - np.array(mobject2.uniforms["fixed_orientation_center"]), - alpha, - ) - ) + self.uniforms[key] = interpolate( # type: ignore + mobject1.uniforms[key], mobject2.uniforms[key], alpha + ) return self def pointwise_become_partial(self, mobject, a, b): @@ -2439,9 +2731,45 @@ def pointwise_become_partial(self, mobject, a, b): """ pass # To implement in subclass + # Locking data + + def lock_data(self, keys: Iterable[str]): + """ + To speed up some animations, particularly transformations, + it can be handy to acknowledge which pieces of data + won't change during the animation so that calls to + interpolate can skip this, and so that it's not + read into the shader_wrapper objects needlessly + """ + if self.has_updaters: + return + # Be sure shader data has most up to date information + self.refresh_shader_data() + self.locked_data_keys = set(keys) + + def lock_matching_data(self, mobject1: OpenGLMobject, mobject2: OpenGLMobject): + for sm, sm1, sm2 in zip( + self.get_family(), mobject1.get_family(), mobject2.get_family() + ): + keys = sm.data.keys() & sm1.data.keys() & sm2.data.keys() + sm.lock_data( + list( + filter( + lambda key: np.all(sm1.data[key] == sm2.data[key]), # type: ignore + keys, + ) + ) + ) + return self + + def unlock_data(self): + for mob in self.get_family(): + mob.locked_data_keys = set() + def become( self, mobject: OpenGLMobject, + match_updaters=False, match_height: bool = False, match_width: bool = False, match_depth: bool = False, @@ -2482,7 +2810,7 @@ def construct(self): circ.become(square) self.wait(0.5) """ - + # Manim CE Weird stretching thing which also modifies the original mobject if stretch: mobject.stretch_to_fit_height(self.height) mobject.stretch_to_fit_width(self.width) @@ -2498,74 +2826,92 @@ def construct(self): if match_center: mobject.move_to(self.get_center()) + # Original 3b1b/manim behaviour self.align_family(mobject) - for sm1, sm2 in zip(self.get_family(), mobject.get_family()): + family1 = self.get_family() + family2 = mobject.get_family() + for sm1, sm2 in zip(family1, family2): sm1.set_data(sm2.data) sm1.set_uniforms(sm2.uniforms) + sm1.shader_folder = sm2.shader_folder + sm1.texture_paths = sm2.texture_paths + sm1.depth_test = sm2.depth_test + sm1.render_primitive = sm2.render_primitive + # Make sure named family members carry over + for attr, value in list(mobject.__dict__.items()): + if isinstance(value, OpenGLMobject) and value in family2: + setattr(self, attr, family1[family2.index(value)]) self.refresh_bounding_box(recurse_down=True) - return self - - # Locking data - - def lock_data(self, keys): - """ - To speed up some animations, particularly transformations, - it can be handy to acknowledge which pieces of data - won't change during the animation so that calls to - interpolate can skip this, and so that it's not - read into the shader_wrapper objects needlessly - """ - if self.has_updaters: - return - # Be sure shader data has most up to date information - self.refresh_shader_data() - self.locked_data_keys = set(keys) + if match_updaters: + self.match_updaters(mobject) + return self + + def looks_identical(self, mobject: OpenGLMobject) -> bool: + fam1 = self.family_members_with_points() + fam2 = mobject.family_members_with_points() + if len(fam1) != len(fam2): + return False + for m1, m2 in zip(fam1, fam2): + for d1, d2 in [(m1.data, m2.data), (m1.uniforms, m2.uniforms)]: + if set(d1).difference(d2): + return False + for key in d1: + if ( + isinstance(d1[key], np.ndarray) + and isinstance(d2[key], np.ndarray) + and (d1[key].size != d2[key].size) + ): + return False + if not np.isclose(d1[key], d2[key]).all(): + return False + return True + + def has_same_shape_as(self, mobject: OpenGLMobject) -> bool: + # Normalize both point sets by centering and making height 1 + points1, points2 = ( + (m.get_all_points() - m.get_center()) / m.get_height() + for m in (self, mobject) + ) + if len(points1) != len(points2): + return False + return bool(np.isclose(points1, points2).all()) - def lock_matching_data(self, mobject1, mobject2): - for sm, sm1, sm2 in zip( - self.get_family(), - mobject1.get_family(), - mobject2.get_family(), - ): - keys = sm.data.keys() & sm1.data.keys() & sm2.data.keys() - sm.lock_data( - list( - filter( - lambda key: np.all(sm1.data[key] == sm2.data[key]), - keys, - ), - ), - ) - return self + # Operations touching shader uniforms - def unlock_data(self): - for mob in self.get_family(): - mob.locked_data_keys = set() + @staticmethod + def affects_shader_info_id(func): + @wraps(func) + def wrapper(self): + for mob in self.get_family(): + func(mob) + mob.refresh_shader_wrapper_id() + return self - # Operations touching shader uniforms + return wrapper @affects_shader_info_id - def fix_in_frame(self): - self.is_fixed_in_frame = 1.0 + def fix_in_frame(self) -> Self: + self.uniforms["is_fixed_in_frame"] = np.asarray(1.0) + self.is_fixed_in_frame = True return self @affects_shader_info_id - def fix_orientation(self): - self.is_fixed_orientation = 1.0 + def fix_orientation(self) -> Self: + self.uniforms["is_fixed_orientation"] = np.asarray(1.0) + self.is_fixed_orientation = True self.fixed_orientation_center = tuple(self.get_center()) - self.depth_test = True return self @affects_shader_info_id - def unfix_from_frame(self): - self.is_fixed_in_frame = 0.0 + def unfix_from_frame(self) -> Self: + self.uniforms["is_fixed_in_frame"] = np.asarray(0.0) + self.is_fixed_in_frame = False return self @affects_shader_info_id def unfix_orientation(self): self.is_fixed_orientation = 0.0 self.fixed_orientation_center = (0, 0, 0) - self.depth_test = False return self @affects_shader_info_id @@ -2625,26 +2971,27 @@ def set_color_by_xyz_func( return self # For shader data + def init_shader_data(self): + # TODO, only call this when needed? + self.shader_data = np.zeros(len(self.points), dtype=self.shader_dtype) + self.shader_indices = None + self.shader_wrapper = ShaderWrapper( + vert_data=self.shader_data, + shader_folder=self.shader_folder, + texture_paths=self.texture_paths, + depth_test=self.depth_test, + render_primitive=self.render_primitive, + ) def refresh_shader_wrapper_id(self): - self.get_shader_wrapper().refresh_id() + self.shader_wrapper.refresh_id() return self def get_shader_wrapper(self): - from manim.renderer.shader_wrapper import ShaderWrapper - - # if hasattr(self, "__shader_wrapper"): - # return self.__shader_wrapper - - self.shader_wrapper = ShaderWrapper( - vert_data=self.get_shader_data(), - vert_indices=self.get_shader_vert_indices(), - uniforms=self.get_shader_uniforms(), - depth_test=self.depth_test, - texture_paths=self.texture_paths, - render_primitive=self.render_primitive, - shader_folder=self.__class__.shader_folder, - ) + self.shader_wrapper.vert_data = self.get_shader_data() + self.shader_wrapper.vert_indices = self.get_shader_vert_indices() + self.shader_wrapper.uniforms = self.get_shader_uniforms() + self.shader_wrapper.depth_test = self.depth_test return self.shader_wrapper def get_shader_wrapper_list(self): @@ -2676,12 +3023,12 @@ def check_data_alignment(self, array, data_key): ) return self - def get_resized_shader_data_array(self, length): + def get_resized_shader_data_array(self, length: int) -> np.ndarray: # If possible, try to populate an existing array, rather # than recreating it each frame - points = self.points - shader_data = np.zeros(len(points), dtype=self.shader_dtype) - return shader_data + if len(self.shader_data) != length: + self.shader_data = resize_array(self.shader_data, length) + return self.shader_data def read_data_to_shader(self, shader_data, shader_data_key, data_key): if data_key in self.locked_data_keys: @@ -2703,14 +3050,98 @@ def get_shader_uniforms(self): def get_shader_vert_indices(self): return self.shader_indices - @property - def submobjects(self): - return self._submobjects if hasattr(self, "_submobjects") else [] + # Event Handlers + """ + Event handling follows the Event Bubbling model of DOM in javascript. + Return false to stop the event bubbling. + To learn more visit https://www.quirksmode.org/js/events_order.html - @submobjects.setter - def submobjects(self, submobject_list): - self.remove(*self.submobjects) - self.add(*submobject_list) + Event Callback Argument is a callable function taking two arguments: + 1. Mobject + 2. EventData + """ + + def init_event_listeners(self): + self.event_listeners: list[EventListener] = [] + + def add_event_listener( + self, + event_type: EventType, + event_callback: Callable[[OpenGLMobject, dict[str, str]], None], + ): + event_listener = EventListener(self, event_type, event_callback) + self.event_listeners.append(event_listener) + EVENT_DISPATCHER.add_listener(event_listener) + return self + + def remove_event_listener( + self, + event_type: EventType, + event_callback: Callable[[OpenGLMobject, dict[str, str]], None], + ): + event_listener = EventListener(self, event_type, event_callback) + while event_listener in self.event_listeners: + self.event_listeners.remove(event_listener) + EVENT_DISPATCHER.remove_listener(event_listener) + return self + + def clear_event_listeners(self, recurse: bool = True): + self.event_listeners = [] + if recurse: + for submob in self.submobjects: + submob.clear_event_listeners(recurse=recurse) + return self + + def get_event_listeners(self): + return self.event_listeners + + def get_family_event_listeners(self): + return list(it.chain(*[sm.get_event_listeners() for sm in self.get_family()])) + + def get_has_event_listener(self): + return any(mob.get_event_listeners() for mob in self.get_family()) + + def add_mouse_motion_listener(self, callback): + self.add_event_listener(EventType.MouseMotionEvent, callback) + + def remove_mouse_motion_listener(self, callback): + self.remove_event_listener(EventType.MouseMotionEvent, callback) + + def add_mouse_press_listener(self, callback): + self.add_event_listener(EventType.MousePressEvent, callback) + + def remove_mouse_press_listener(self, callback): + self.remove_event_listener(EventType.MousePressEvent, callback) + + def add_mouse_release_listener(self, callback): + self.add_event_listener(EventType.MouseReleaseEvent, callback) + + def remove_mouse_release_listener(self, callback): + self.remove_event_listener(EventType.MouseReleaseEvent, callback) + + def add_mouse_drag_listener(self, callback): + self.add_event_listener(EventType.MouseDragEvent, callback) + + def remove_mouse_drag_listener(self, callback): + self.remove_event_listener(EventType.MouseDragEvent, callback) + + def add_mouse_scroll_listener(self, callback): + self.add_event_listener(EventType.MouseScrollEvent, callback) + + def remove_mouse_scroll_listener(self, callback): + self.remove_event_listener(EventType.MouseScrollEvent, callback) + + def add_key_press_listener(self, callback): + self.add_event_listener(EventType.KeyPressEvent, callback) + + def remove_key_press_listener(self, callback): + self.remove_event_listener(EventType.KeyPressEvent, callback) + + def add_key_release_listener(self, callback): + self.add_event_listener(EventType.KeyReleaseEvent, callback) + + def remove_key_release_listener(self, callback): + self.remove_event_listener(EventType.KeyReleaseEvent, callback) # Errors @@ -2722,6 +3153,44 @@ def throw_error_if_no_points(self): caller_name = sys._getframe(1).f_code.co_name raise Exception(message.format(caller_name)) + @deprecated( + since="v0.17.2", + message="The usage of this method is discouraged please set attributes directly", + ) + def set(self, **kwargs) -> Self: + """Sets attributes. + + Mainly to be used along with :attr:`animate` to + animate setting attributes. + + Examples + -------- + :: + + >>> mob = OpenGLMobject() + >>> mob.set(foo=0) + OpenGLMobject + >>> mob.foo + 0 + + Parameters + ---------- + **kwargs + The attributes and corresponding values to set. + + Returns + ------- + :class:`OpenGLMobject` + ``self`` + + + """ + + for attr, value in kwargs.items(): + setattr(self, attr, value) + + return self + class OpenGLGroup(OpenGLMobject): def __init__(self, *mobjects, **kwargs): @@ -2730,6 +3199,10 @@ def __init__(self, *mobjects, **kwargs): super().__init__(**kwargs) self.add(*mobjects) + def __add__(self, other: OpenGLMobject | OpenGLGroup): + assert isinstance(other, OpenGLMobject) + return self.add(other) + class OpenGLPoint(OpenGLMobject): def __init__( @@ -2769,7 +3242,7 @@ def __init__(self, mobject): self.cannot_pass_args = False self.anim_args = {} - def __call__(self, **kwargs): + def __call__(self, **kwargs) -> _AnimationBuilder: if self.cannot_pass_args: raise ValueError( "Animation arguments must be passed before accessing methods and can only be passed once", diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 8dc174e12d..169c277714 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -3,7 +3,7 @@ import itertools as it import operator as op from functools import reduce, wraps -from typing import Callable, Iterable, Optional, Sequence +from typing import TYPE_CHECKING import moderngl import numpy as np @@ -11,55 +11,59 @@ from manim import config from manim.constants import * -from manim.mobject.opengl.opengl_mobject import OpenGLMobject, OpenGLPoint +from manim.mobject.opengl.opengl_mobject import ( + UNIFORM_DTYPE, + OpenGLMobject, + OpenGLPoint, +) from manim.renderer.shader_wrapper import ShaderWrapper from manim.utils.bezier import ( bezier, get_quadratic_approximation_of_cubic, get_smooth_cubic_bezier_handle_points, + get_smooth_quadratic_bezier_handle_points, integer_interpolate, interpolate, + inverse_interpolate, partial_quadratic_bezier_points, proportions_along_bezier_curve_for_point, quadratic_bezier_remap, ) from manim.utils.color import * -from manim.utils.config_ops import _Data -from manim.utils.iterables import listify, make_even, resize_with_interpolation +from manim.utils.iterables import ( + listify, + make_even, + resize_array, + resize_with_interpolation, +) from manim.utils.space_ops import ( angle_between_vectors, cross2d, earclip_triangulation, + get_norm, get_unit_normal, shoelace_direction, z_to_vector, ) +if TYPE_CHECKING: + from typing import Callable, Iterable, Optional, Sequence -def triggers_refreshed_triangulation(func): - @wraps(func) - def wrapper(self, *args, **kwargs): - old_points = np.empty((0, 3)) - for mob in self.family_members_with_points(): - old_points = np.concatenate((old_points, mob.points), axis=0) - func(self, *args, **kwargs) - new_points = np.empty((0, 3)) - for mob in self.family_members_with_points(): - new_points = np.concatenate((new_points, mob.points), axis=0) - if not np.array_equal(new_points, old_points): - self.refresh_triangulation() - self.refresh_unit_normal() - return self + from typing_extensions import Self - return wrapper +DEFAULT_STROKE_COLOR = GREY_A +DEFAULT_FILL_COLOR = GREY_C class OpenGLVMobject(OpenGLMobject): """A vectorized mobject.""" + n_points_per_curve: int = 3 + stroke_shader_folder = "quadratic_bezier_stroke" + fill_shader_folder = "quadratic_bezier_fill" fill_dtype = [ ("point", np.float32, (3,)), - ("unit_normal", np.float32, (3,)), + ("orientation", np.float32, (3,)), ("color", np.float32, (4,)), ("vert_index", np.float32, (1,)), ] @@ -67,89 +71,48 @@ class OpenGLVMobject(OpenGLMobject): ("point", np.float32, (3,)), ("prev_point", np.float32, (3,)), ("next_point", np.float32, (3,)), - ("unit_normal", np.float32, (3,)), ("stroke_width", np.float32, (1,)), ("color", np.float32, (4,)), ] - stroke_shader_folder = "quadratic_bezier_stroke" - fill_shader_folder = "quadratic_bezier_fill" + render_primitive: int = moderngl.TRIANGLES - fill_rgba = _Data() - stroke_rgba = _Data() - stroke_width = _Data() - unit_normal = _Data() + pre_function_handle_to_anchor_scale_factor: float = 0.01 + make_smooth_after_applying_functions: bool = False + tolerance_for_point_equality: float = 1e-8 def __init__( self, + color: Color | None = None, fill_color: Color | None = None, fill_opacity: float = 0.0, stroke_color: Color | None = None, stroke_opacity: float = 1.0, stroke_width: float = DEFAULT_STROKE_WIDTH, draw_stroke_behind_fill: bool = False, - # Indicates that it will not be displayed, but - # that it should count in parent mobject's path - pre_function_handle_to_anchor_scale_factor: float = 0.01, - make_smooth_after_applying_functions: float = False, background_image_file: str | None = None, - # This is within a pixel - # TODO, do we care about accounting for - # varying zoom levels? - tolerance_for_point_equality: float = 1e-8, - n_points_per_curve: int = 3, long_lines: bool = False, - should_subdivide_sharp_curves: bool = False, - should_remove_null_curves: bool = False, - # Could also be "bevel", "miter", "round" - joint_type: LineJointType | None = None, + joint_type: LineJointType = LineJointType.AUTO, flat_stroke: bool = True, - render_primitive=moderngl.TRIANGLES, - triangulation_locked: bool = False, + # Measured in pixel widths + anti_alias_width: float = 1.0, **kwargs, ): - self.data = {} + self.fill_color = fill_color or color or DEFAULT_FILL_COLOR self.fill_opacity = fill_opacity + self.stroke_color = stroke_color or color or DEFAULT_STROKE_COLOR self.stroke_opacity = stroke_opacity self.stroke_width = stroke_width self.draw_stroke_behind_fill = draw_stroke_behind_fill - # Indicates that it will not be displayed, but - # that it should count in parent mobject's path - self.pre_function_handle_to_anchor_scale_factor = ( - pre_function_handle_to_anchor_scale_factor - ) - self.make_smooth_after_applying_functions = make_smooth_after_applying_functions self.background_image_file = background_image_file - # This is within a pixel - # TODO, do we care about accounting for - # varying zoom levels? - self.tolerance_for_point_equality = tolerance_for_point_equality - self.n_points_per_curve = n_points_per_curve self.long_lines = long_lines - self.should_subdivide_sharp_curves = should_subdivide_sharp_curves - self.should_remove_null_curves = should_remove_null_curves - if joint_type is None: - joint_type = LineJointType.AUTO self.joint_type = joint_type self.flat_stroke = flat_stroke - self.render_primitive = render_primitive - self.triangulation_locked = triangulation_locked + self.anti_alias_width = anti_alias_width self.needs_new_triangulation = True self.triangulation = np.zeros(0, dtype="i4") - self.orientation = 1 - self.fill_data = None - self.stroke_data = None - self.fill_shader_wrapper = None - self.stroke_shader_wrapper = None - self.init_shader_data() super().__init__(**kwargs) - self.refresh_unit_normal() - - if fill_color: - self.fill_color = Color(fill_color) - if stroke_color: - self.stroke_color = Color(stroke_color) def get_group_class(self): return OpenGLVGroup @@ -158,13 +121,67 @@ def get_group_class(self): def get_mobject_type_class(): return OpenGLVMobject + @property + def rgbas(self): + raise NotImplementedError( + "rgbas is not implemented for OpenGLVMobject. please use fill_rgba and stroke_rgba." + ) + + @rgbas.setter + def rgbas(self, value): + raise NotImplementedError( + "rgbas is not implemented for OpenGLVMobject. please use fill_rgba and stroke_rgba." + ) + def init_data(self): super().init_data() self.data.pop("rgbas") - self.fill_rgba = np.zeros((1, 4)) - self.stroke_rgba = np.zeros((1, 4)) - self.unit_normal = np.zeros((1, 3)) - # stroke_width belongs to self.data, but is defined through init_colors+set_stroke + self.data.update( + { + "fill_rgba": np.zeros((1, 4)), + "stroke_rgba": np.zeros((1, 4)), + "stroke_width": np.zeros((1, 1)), + "orientation": np.zeros((1, 1)), + } + ) + + def init_uniforms(self): + super().init_uniforms() + self.uniforms["anti_alias_width"] = np.asarray( + self.anti_alias_width, dtype=UNIFORM_DTYPE + ) + self.uniforms["joint_type"] = np.asarray( + self.joint_type.value, dtype=UNIFORM_DTYPE + ) + self.uniforms["flat_stroke"] = np.asarray( + float(self.flat_stroke), dtype=UNIFORM_DTYPE + ) + + # These are here just to make type checkers happy + def get_family(self, recurse: bool = True) -> list[OpenGLVMobject]: # type: ignore + return super().get_family(recurse) # type: ignore + + def family_members_with_points(self) -> list[OpenGLVMobject]: # type: ignore + return super().family_members_with_points() # type: ignore + + def replicate(self, n: int) -> OpenGLVGroup: # type: ignore + return super().replicate(n) # type: ignore + + def get_grid(self, *args, **kwargs) -> OpenGLVGroup: # type: ignore + return super().get_grid(*args, **kwargs) # type: ignore + + def __getitem__(self, value: int | slice) -> Self: # type: ignore + return super().__getitem__(value) # type: ignore + + def add(self, *vmobjects: OpenGLVMobject): # type: ignore + if not all(isinstance(m, OpenGLVMobject) for m in vmobjects): + raise Exception("All submobjects must be of type OpenGLVMobject") + super().add(*vmobjects) + + def copy(self, deep: bool = False) -> Self: + result = super().copy(deep) + result.shader_wrapper_list = [sw.copy() for sw in self.shader_wrapper_list] + return result # Colors def init_colors(self): @@ -180,14 +197,30 @@ def init_colors(self): ) self.set_gloss(self.gloss) self.set_flat_stroke(self.flat_stroke) + self.color = self.get_color() + return self + + def set_rgba_array( + self, rgba_array: np.ndarray, name: str | None = None, recurse: bool = False + ) -> Self: + if name is None: + names = ["fill_rgba", "stroke_rgba"] + else: + names = [name] + + for name in names: + if name in self.data: + self.data[name] = rgba_array + else: + raise Exception(f"{name} is not a valid data name.") return self def set_fill( self, - color: Color | None = None, - opacity: float | None = None, + color: Color | Iterable[Color] | None = None, + opacity: float | Iterable[float] | None = None, recurse: bool = True, - ) -> OpenGLVMobject: + ) -> Self: """Set the fill color and fill opacity of a :class:`OpenGLVMobject`. Parameters @@ -223,13 +256,7 @@ def construct(self): -------- :meth:`~.OpenGLVMobject.set_style` """ - if opacity is not None: - self.fill_opacity = opacity - if recurse: - for submobject in self.submobjects: - submobject.set_fill(color, opacity, recurse) - - self.set_rgba_array(color, opacity, "fill_rgba", recurse) + self.set_rgba_array_by_color(color, opacity, "fill_rgba", recurse) return self def set_stroke( @@ -240,78 +267,98 @@ def set_stroke( background=None, recurse=True, ): - if opacity is not None: - self.stroke_opacity = opacity - if recurse: - for submobject in self.submobjects: - submobject.set_stroke( - color=color, - width=width, - opacity=opacity, - background=background, - recurse=recurse, - ) - - self.set_rgba_array(color, opacity, "stroke_rgba", recurse) + self.set_rgba_array_by_color(color, opacity, "stroke_rgba", recurse) if width is not None: for mob in self.get_family(recurse): - mob.stroke_width = np.array([[width] for width in listify(width)]) + if isinstance(width, np.ndarray): + arr = width.reshape((len(width), 1)) + else: + arr = np.array([[w] for w in listify(width)], dtype=float) + mob.data["stroke_width"] = arr if background is not None: for mob in self.get_family(recurse): mob.draw_stroke_behind_fill = background return self - def set_style( + def set_backstroke( self, - fill_color=None, - fill_opacity=None, - fill_rgba=None, - stroke_color=None, - stroke_opacity=None, - stroke_rgba=None, - stroke_width=None, - gloss=None, - shadow=None, - recurse=True, - ): - if fill_rgba is not None: - self.fill_rgba = resize_with_interpolation(fill_rgba, len(fill_rgba)) - else: - self.set_fill(color=fill_color, opacity=fill_opacity, recurse=recurse) + color: Color | Iterable[Color] | None = None, + width: float | Iterable[float] = 3, + background: bool = True, + ) -> Self: + self.set_stroke(color, width, background=background) + return self - if stroke_rgba is not None: - self.stroke_rgba = resize_with_interpolation(stroke_rgba, len(fill_rgba)) - self.set_stroke(width=stroke_width) - else: - self.set_stroke( - color=stroke_color, - width=stroke_width, - opacity=stroke_opacity, - recurse=recurse, + def align_stroke_width_data_to_points(self, recurse: bool = True) -> None: + for mob in self.get_family(recurse): + mob.data["stroke_width"] = resize_with_interpolation( + mob.data["stroke_width"], len(mob.points) ) - if gloss is not None: - self.set_gloss(gloss, recurse=recurse) - if shadow is not None: - self.set_shadow(shadow, recurse=recurse) + def set_style( + self, + fill_color: Color | Iterable[Color] | None = None, + fill_opacity: float | Iterable[float] | None = None, + fill_rgba: np.ndarray | None = None, + stroke_color: Color | Iterable[Color] | None = None, + stroke_opacity: float | Iterable[float] | None = None, + stroke_rgba: np.ndarray | None = None, + stroke_width: float | Iterable[float] | None = None, + stroke_background: bool = True, + reflectiveness: float | None = None, + gloss: float | None = None, + shadow: float | None = None, + recurse: bool = True, + ) -> Self: + for mob in self.get_family(recurse): + if fill_rgba is not None: + mob.data["fill_rgba"] = resize_with_interpolation( + fill_rgba, len(fill_rgba) + ) + else: + mob.set_fill(color=fill_color, opacity=fill_opacity, recurse=False) + + if stroke_rgba is not None: + mob.data["stroke_rgba"] = resize_with_interpolation( + stroke_rgba, len(stroke_rgba) + ) + mob.set_stroke( + width=stroke_width, + background=stroke_background, + recurse=False, + ) + else: + mob.set_stroke( + color=stroke_color, + width=stroke_width, + opacity=stroke_opacity, + recurse=False, + background=stroke_background, + ) + + if reflectiveness is not None: + mob.set_reflectiveness(reflectiveness, recurse=False) + if gloss is not None: + mob.set_gloss(gloss, recurse=False) + if shadow is not None: + mob.set_shadow(shadow, recurse=False) return self def get_style(self): return { - "fill_rgba": self.fill_rgba, - "stroke_rgba": self.stroke_rgba, - "stroke_width": self.stroke_width, - "gloss": self.gloss, - "shadow": self.shadow, + "fill_rgba": self.data["fill_rgba"].copy(), + "stroke_rgba": self.data["stroke_rgba"].copy(), + "stroke_width": self.data["stroke_width"].copy(), + "stroke_background": self.draw_stroke_behind_fill, + "reflectiveness": self.get_reflectiveness(), + "gloss": self.get_gloss(), + "shadow": self.get_shadow(), } - def match_style(self, vmobject, recurse=True): - vmobject_style = vmobject.get_style() - if config.renderer == RendererType.OPENGL: - vmobject_style["stroke_width"] = vmobject_style["stroke_width"][0][0] - self.set_style(**vmobject_style, recurse=False) + def match_style(self, vmobject: OpenGLVMobject, recurse: bool = True): + self.set_style(**vmobject.get_style(), recurse=False) if recurse: # Does its best to match up submobject lists, and # match styles accordingly @@ -324,112 +371,101 @@ def match_style(self, vmobject, recurse=True): sm1.match_style(sm2) return self - def set_color(self, color, opacity=None, recurse=True): - if opacity is not None: - self.opacity = opacity - + def set_color(self, color, opacity=None, recurse=True) -> Self: self.set_fill(color, opacity=opacity, recurse=recurse) self.set_stroke(color, opacity=opacity, recurse=recurse) return self - def set_opacity(self, opacity, recurse=True): + def set_opacity(self, opacity, recurse=True) -> Self: self.set_fill(opacity=opacity, recurse=recurse) self.set_stroke(opacity=opacity, recurse=recurse) return self - def fade(self, darkness=0.5, recurse=True): - factor = 1.0 - darkness - self.set_fill( - opacity=factor * self.get_fill_opacity(), - recurse=False, - ) - self.set_stroke( - opacity=factor * self.get_stroke_opacity(), - recurse=False, - ) - super().fade(darkness, recurse) + def fade(self, darkness=0.5, recurse=True) -> Self: + mobs = self.get_family() if recurse else [self] + for mob in mobs: + factor = 1.0 - darkness + mob.set_fill( + opacity=factor * mob.get_fill_opacity(), + recurse=False, + ) + mob.set_stroke( + opacity=factor * mob.get_stroke_opacity(), + recurse=False, + ) return self - def get_fill_colors(self): - return [Color(rgb_to_hex(rgba[:3])) for rgba in self.fill_rgba] + def get_fill_colors(self) -> list[str]: + return [rgb_to_hex(rgba[:3]) for rgba in self.data["fill_rgba"]] - def get_fill_opacities(self): - return self.fill_rgba[:, 3] + def get_fill_opacities(self) -> np.ndarray: + return self.data["fill_rgba"][:, 3] - def get_stroke_colors(self): - return [Color(rgb_to_hex(rgba[:3])) for rgba in self.stroke_rgba] + def get_stroke_colors(self) -> list[str]: + return [rgb_to_hex(rgba[:3]) for rgba in self.data["stroke_rgba"]] - def get_stroke_opacities(self): - return self.stroke_rgba[:, 3] + def get_stroke_opacities(self) -> np.ndarray: + return self.data["stroke_rgba"][:, 3] - def get_stroke_widths(self): - return self.stroke_width + def get_stroke_widths(self) -> np.ndarray: + return self.data["stroke_width"][:, 0] # TODO, it's weird for these to return the first of various lists # rather than the full information - def get_fill_color(self): + def get_fill_color(self) -> str: """ If there are multiple colors (for gradient) this returns the first one """ return self.get_fill_colors()[0] - def get_fill_opacity(self): + def get_fill_opacity(self) -> float: """ If there are multiple opacities, this returns the first """ return self.get_fill_opacities()[0] - def get_stroke_color(self): + def get_stroke_color(self) -> str: return self.get_stroke_colors()[0] - def get_stroke_width(self): + def get_stroke_width(self) -> float | np.ndarray: return self.get_stroke_widths()[0] - def get_stroke_opacity(self): + def get_stroke_opacity(self) -> float: return self.get_stroke_opacities()[0] - def get_color(self): - if self.has_stroke(): - return self.get_stroke_color() - return self.get_fill_color() - - def get_colors(self): - if self.has_stroke(): - return self.get_stroke_colors() - return self.get_fill_colors() - - stroke_color = property(get_stroke_color, set_stroke) - color = property(get_color, set_color) - fill_color = property(get_fill_color, set_fill) + def get_color(self) -> str: + if self.has_fill(): + return self.get_fill_color() + return self.get_stroke_color() - def has_stroke(self): - stroke_widths = self.get_stroke_widths() - stroke_opacities = self.get_stroke_opacities() - return ( - stroke_widths is not None - and stroke_opacities is not None - and any(stroke_widths) - and any(stroke_opacities) - ) + def has_stroke(self) -> bool: + return any(self.data["stroke_width"]) and any(self.data["stroke_rgba"][:, 3]) - def has_fill(self): - fill_opacities = self.get_fill_opacities() - return fill_opacities is not None and any(fill_opacities) + def has_fill(self) -> bool: + return any(self.data["fill_rgba"][:, 3]) - def get_opacity(self): + def get_opacity(self) -> float: if self.has_fill(): return self.get_fill_opacity() return self.get_stroke_opacity() - def set_flat_stroke(self, flat_stroke=True, recurse=True): + def set_flat_stroke(self, flat_stroke: bool = True, recurse: bool = True): for mob in self.get_family(recurse): - mob.flat_stroke = flat_stroke + mob.uniforms["flat_stroke"] = np.asarray(float(flat_stroke)) return self - def get_flat_stroke(self): - return self.flat_stroke + def get_flat_stroke(self) -> bool: + return self.uniforms["flat_stroke"] == 1.0 + + def set_joint_type(self, joint_type: LineJointType, recurse: bool = True): + for mob in self.get_family(recurse): + mob.uniforms["joint_type"] = np.asarray(joint_type.value) + return self + + def get_joint_type(self) -> LineJointType: + return LineJointType(int(self.uniforms["joint_type"][0])) # Points def set_anchors_and_handles(self, anchors1, handles, anchors2): @@ -479,7 +515,7 @@ def add_quadratic_bezier_curve_to(self, handle, anchor): else: self.append_points([self.get_last_point(), handle, anchor]) - def add_line_to(self, point: Sequence[float]) -> OpenGLVMobject: + def add_line_to(self, point: Sequence[float]) -> Self: """Add a straight line from the last point of OpenGLVMobject to the given point. Parameters @@ -511,9 +547,12 @@ def add_smooth_curve_to(self, point): self.add_quadratic_bezier_curve_to(new_handle, point) return self - def add_smooth_cubic_curve_to(self, handle, point): + def add_smooth_cubic_curve_to(self, handle: np.ndarray, point: np.ndarray): self.throw_error_if_no_points() - new_handle = self.get_reflection_of_last_handle() + if self.get_num_points() == 1: + new_handle = self.points[-1] + else: + new_handle = self.get_reflection_of_last_handle() self.add_cubic_bezier_curve_to(new_handle, handle, point) def has_new_path_started(self): @@ -558,7 +597,7 @@ def add_points_as_corners(self, points): self.add_line_to(point) return points - def set_points_as_corners(self, points: Iterable[float]) -> OpenGLVMobject: + def set_points_as_corners(self, points: Iterable[float]) -> Self: """Given an array of points, set them as corner of the vmobject. To achieve that, this algorithm sets handles aligned with the anchors such that the resultant bezier curve will be the segment @@ -581,12 +620,15 @@ def set_points_as_corners(self, points: Iterable[float]) -> OpenGLVMobject: ) return self - def set_points_smoothly(self, points, true_smooth=False): + def set_points_smoothly(self, points, true_smooth=False) -> Self: self.set_points_as_corners(points) - self.make_smooth() + if true_smooth: + self.make_smooth() + else: + self.make_approximately_smooth() return self - def change_anchor_mode(self, mode): + def change_anchor_mode(self, mode) -> Self: """Changes the anchor mode of the bezier curves. This will modify the handles. There can be only three modes, "jagged", "approx_smooth" and "true_smooth". @@ -605,17 +647,13 @@ def change_anchor_mode(self, mode): anchors = np.vstack([subpath[::nppc], subpath[-1:]]) new_subpath = np.array(subpath) if mode == "approx_smooth": - # TODO: get_smooth_quadratic_bezier_handle_points is not defined new_subpath[1::nppc] = get_smooth_quadratic_bezier_handle_points( - anchors, + anchors ) elif mode == "true_smooth": h1, h2 = get_smooth_cubic_bezier_handle_points(anchors) new_subpath = get_quadratic_approximation_of_cubic( - anchors[:-1], - h1, - h2, - anchors[1:], + anchors[:-1], h1, h2, anchors[1:] ) elif mode == "jagged": new_subpath[1::nppc] = 0.5 * (anchors[:-1] + anchors[1:]) @@ -823,6 +861,55 @@ def get_num_curves(self) -> int: """ return self.get_num_points() // self.n_points_per_curve + def quick_point_from_proportion(self, alpha: float) -> np.ndarray: + # Assumes all curves have the same length, so is inaccurate + num_curves = self.get_num_curves() + n, residue = integer_interpolate(0, num_curves, alpha) + curve_func = self.get_nth_curve_function(n) + return curve_func(residue) + + def point_from_proportion(self, alpha: float) -> np.ndarray: + """Gets the point at a proportion along the path of the :class:`OpenGLVMobject`. + + Parameters + ---------- + alpha + The proportion along the the path of the :class:`OpenGLVMobject`. + + Returns + ------- + :class:`numpy.ndarray` + The point on the :class:`OpenGLVMobject`. + + Raises + ------ + :exc:`ValueError` + If ``alpha`` is not between 0 and 1. + :exc:`Exception` + If the :class:`OpenGLVMobject` has no points. + """ + + if alpha <= 0: + return self.get_start() + elif alpha >= 1: + return self.get_end() + + partials = [0.0] + for tup in self.get_bezier_tuples(): + # Approximate length with straight line from start to end + arclen = get_norm(tup[0] - tup[-1]) + partials.append(partials[-1] + arclen) + full = partials[-1] + if full == 0: + return self.get_start() + # First index where the partial length is more alpha times the full length + i = next( + (i for i, x in enumerate(partials) if x >= full * alpha), + len(partials), # Default + ) + residue = inverse_interpolate(partials[i - 1] / full, partials[i] / full, alpha) + return self.get_nth_curve_function(i - 1)(residue) # type: ignore + def get_nth_curve_length( self, n: int, @@ -888,7 +975,7 @@ def get_nth_curve_length_pieces( curve = self.get_nth_curve_function(n) points = np.array([curve(a) for a in np.linspace(0, 1, sample_points)]) diffs = points[1:] - points[:-1] - norms = np.apply_along_axis(np.linalg.norm, 1, diffs) + norms = np.apply_along_axis(np.linalg.norm, 1, diffs) # type: ignore return norms @@ -913,50 +1000,6 @@ def get_curve_functions_with_lengths( for n in range(num_curves): yield self.get_nth_curve_function_with_length(n, **kwargs) - def point_from_proportion(self, alpha: float) -> np.ndarray: - """Gets the point at a proportion along the path of the :class:`OpenGLVMobject`. - - Parameters - ---------- - alpha - The proportion along the the path of the :class:`OpenGLVMobject`. - - Returns - ------- - :class:`numpy.ndarray` - The point on the :class:`OpenGLVMobject`. - - Raises - ------ - :exc:`ValueError` - If ``alpha`` is not between 0 and 1. - :exc:`Exception` - If the :class:`OpenGLVMobject` has no points. - """ - - if alpha < 0 or alpha > 1: - raise ValueError(f"Alpha {alpha} not between 0 and 1.") - - self.throw_error_if_no_points() - if alpha == 1: - return self.points[-1] - - curves_and_lengths = tuple(self.get_curve_functions_with_lengths()) - - target_length = alpha * np.sum(length for _, length in curves_and_lengths) - current_length = 0 - - for curve, length in curves_and_lengths: - if current_length + length >= target_length: - if length != 0: - residue = (target_length - current_length) / length - else: - residue = 0 - - return curve(residue) - - current_length += length - def proportion_from_point( self, point: Iterable[float | int], @@ -993,7 +1036,7 @@ def proportion_from_point( num_curves = self.get_num_curves() total_length = self.get_arc_length() - target_length = 0 + target_length = 0.0 for n in range(num_curves): control_points = self.get_nth_curve_points(n) length = self.get_nth_curve_length(n) @@ -1063,8 +1106,8 @@ def get_anchors(self) -> np.ndarray: self.get_start_anchors(), self.get_end_anchors(), ) - ), - ), + ) + ) ) def get_points_without_null_curves(self, atol=1e-9): @@ -1079,13 +1122,14 @@ def get_points_without_null_curves(self, atol=1e-9): ) return points[distinct_curves.repeat(nppc)] - def get_arc_length(self, sample_points_per_curve: int | None = None) -> float: + def get_arc_length(self, n_sample_points: int | None = None) -> float: """Return the approximated length of the whole curve. Parameters ---------- - sample_points_per_curve - Number of sample points per curve used to approximate the length. More points result in a better approximation. + n_sample_points + The number of points to sample. If ``None``, the number of points is calculated automatically. + Takes points on the outline of the :class:`OpenGLVMobject` and calculates the distance between them. Returns ------- @@ -1093,12 +1137,14 @@ def get_arc_length(self, sample_points_per_curve: int | None = None) -> float: The length of the :class:`OpenGLVMobject`. """ - return np.sum( - length - for _, length in self.get_curve_functions_with_lengths( - sample_points=sample_points_per_curve, - ) + if n_sample_points is None: + n_sample_points = 4 * self.get_num_curves() + 1 + points = np.array( + [self.point_from_proportion(a) for a in np.linspace(0, 1, n_sample_points)] ) + diffs = points[1:] - points[:-1] + norms = np.array([get_norm(d) for d in diffs]) + return norms.sum() def get_area_vector(self): # Returns a vector whose length is the area bound by @@ -1113,6 +1159,11 @@ def get_area_vector(self): p0 = points[0::nppc] p1 = points[nppc - 1 :: nppc] + if len(p0) != len(p1): + m = min(len(p0), len(p1)) + p0 = p0[:m] + p1 = p1[:m] + # Each term goes through all edges [(x1, y1, z1), (x2, y2, z2)] return 0.5 * np.array( [ @@ -1148,28 +1199,21 @@ def get_direction(self): """ return shoelace_direction(self.get_start_anchors()) - def get_unit_normal(self, recompute=False): - if not recompute: - return self.unit_normal[0] - - if len(self.points) < 3: + def get_unit_normal(self) -> np.ndarray: + if self.get_num_points() < 3: return OUT area_vect = self.get_area_vector() - area = np.linalg.norm(area_vect) + area = get_norm(area_vect) if area > 0: - return area_vect / area + normal = area_vect / area else: points = self.points - return get_unit_normal( + normal = get_unit_normal( points[1] - points[0], points[2] - points[1], ) - - def refresh_unit_normal(self): - for mob in self.get_family(): - mob.unit_normal[:] = mob.get_unit_normal(recompute=True) - return self + return normal # Alignment def align_points(self, vmobject): @@ -1202,14 +1246,14 @@ def get_nth_subpath(path_list, n): # Create a null path at the very end return [path_list[-1][-1]] * nppc path = path_list[n] - # Check for useless points at the end of the path and remove them - # https://github.com/ManimCommunity/manim/issues/1959 - while len(path) > nppc: - # If the last nppc points are all equal to the preceding point - if self.consider_points_equals(path[-nppc:], path[-nppc - 1]): - path = path[:-nppc] - else: - break + # # Check for useless points at the end of the path and remove them + # # https://github.com/ManimCommunity/manim/issues/1959 + # while len(path) > nppc: + # # If the last nppc points are all equal to the preceding point + # if self.consider_points_equals(path[-nppc:], path[-nppc - 1]): + # path = path[:-nppc] + # else: + # break return path for n in range(n_subpaths): @@ -1225,7 +1269,7 @@ def get_nth_subpath(path_list, n): vmobject.set_points(np.vstack(new_subpaths2)) return self - def insert_n_curves(self, n: int, recurse=True) -> OpenGLVMobject: + def insert_n_curves(self, n: int, recurse=True) -> Self: """Inserts n curves to the bezier curves of the vmobject. Parameters @@ -1269,7 +1313,7 @@ def insert_n_curves_to_point_list(self, n: int, points: np.ndarray) -> np.ndarra return np.repeat(points, nppc * n, 0) bezier_groups = self.get_bezier_tuples_from_points(points) - norms = np.array([np.linalg.norm(bg[nppc - 1] - bg[0]) for bg in bezier_groups]) + norms = np.array([get_norm(bg[nppc - 1] - bg[0]) for bg in bezier_groups]) total_norm = sum(norms) # Calculate insertions per curve (ipc) if total_norm < 1e-6: @@ -1295,6 +1339,7 @@ def insert_n_curves_to_point_list(self, n: int, points: np.ndarray) -> np.ndarra def interpolate(self, mobject1, mobject2, alpha, *args, **kwargs): super().interpolate(mobject1, mobject2, alpha, *args, **kwargs) + # TODO: Do we still need this? Because for many scenes it just doesn't work if config["use_projection_fill_shaders"]: self.refresh_triangulation() else: @@ -1305,9 +1350,10 @@ def interpolate(self, mobject1, mobject2, alpha, *args, **kwargs): self.refresh_triangulation() return self + # TODO: compare to 3b1b/manim again check if something changed so we don't need the cairo interpolation anymore def pointwise_become_partial( self, vmobject: OpenGLVMobject, a: float, b: float, remap: bool = True - ) -> OpenGLVMobject: + ) -> Self: """Given two bounds a and b, transforms the points of the self vmobject into the points of the vmobject passed as parameter with respect to the bounds. Points here stand for control points of the bezier curves (anchors and handles) @@ -1373,7 +1419,7 @@ def pointwise_become_partial( ) return self - def get_subcurve(self, a: float, b: float) -> OpenGLVMobject: + def get_subcurve(self, a: float, b: float) -> Self: """Returns the subcurve of the OpenGLVMobject between the interval [a, b]. The curve is a OpenGLVMobject itself. @@ -1399,45 +1445,43 @@ def get_subcurve(self, a: float, b: float) -> OpenGLVMobject: def refresh_triangulation(self): for mob in self.get_family(): mob.needs_new_triangulation = True + mob.data["orientation"] = resize_array( + mob.data["orientation"], mob.get_num_points() + ) return self - def get_triangulation(self, normal_vector=None): + def get_triangulation(self): # Figure out how to triangulate the interior to know # how to send the points as to the vertex shader. # First triangles come directly from the points - if normal_vector is None: - normal_vector = self.get_unit_normal() - if not self.needs_new_triangulation: return self.triangulation - points = self.points + points = self.get_points() if len(points) <= 1: self.triangulation = np.zeros(0, dtype="i4") self.needs_new_triangulation = False return self.triangulation - if not np.isclose(normal_vector, OUT).all(): - # Rotate points such that unit normal vector is OUT - points = np.dot(points, z_to_vector(normal_vector)) + normal_vector = self.get_unit_normal() indices = np.arange(len(points), dtype=int) - b0s = points[0::3] - b1s = points[1::3] - b2s = points[2::3] - v01s = b1s - b0s - v12s = b2s - b1s - - crosses = cross2d(v01s, v12s) - convexities = np.sign(crosses) + # Rotate points such that unit normal vector is OUT + if not np.isclose(normal_vector, OUT).all(): + points = np.dot(points, z_to_vector(normal_vector)) atol = self.tolerance_for_point_equality - end_of_loop = np.zeros(len(b0s), dtype=bool) - end_of_loop[:-1] = (np.abs(b2s[:-1] - b0s[1:]) > atol).any(1) + end_of_loop = np.zeros(len(points) // 3, dtype=bool) + end_of_loop[:-1] = (np.abs(points[2:-3:3] - points[3::3]) > atol).any(1) end_of_loop[-1] = True - concave_parts = convexities < 0 + v01s = points[1::3] - points[0::3] + v12s = points[2::3] - points[1::3] + curve_orientations = np.sign(cross2d(v01s, v12s)) + self.data["orientation"] = np.transpose([curve_orientations.repeat(3)]) + + concave_parts = curve_orientations < 0 # These are the vertices to which we'll apply a polygon triangulation inner_vert_indices = np.hstack( @@ -1445,7 +1489,7 @@ def get_triangulation(self, normal_vector=None): indices[0::3], indices[1::3][concave_parts], indices[2::3][end_of_loop], - ], + ] ) inner_vert_indices.sort() rings = np.arange(1, len(inner_vert_indices) + 1)[inner_vert_indices % 3 == 2] @@ -1461,11 +1505,28 @@ def get_triangulation(self, normal_vector=None): self.needs_new_triangulation = False return tri_indices + @staticmethod + def triggers_refreshed_triangulation(func: Callable): + @wraps(func) + def wrapper(self, *args, **kwargs): + func(self, *args, **kwargs) + self.refresh_triangulation() + + return wrapper + @triggers_refreshed_triangulation def set_points(self, points): super().set_points(points) return self + @triggers_refreshed_triangulation + def append_points(self, points): + return super().append_points(points) + + @triggers_refreshed_triangulation + def reverse_points(self): + return super().reverse_points() + @triggers_refreshed_triangulation def set_data(self, data): super().set_data(data) @@ -1496,36 +1557,42 @@ def init_shader_data(self): self.fill_shader_wrapper = ShaderWrapper( vert_data=self.fill_data, vert_indices=np.zeros(0, dtype="i4"), + uniforms=self.uniforms, shader_folder=self.fill_shader_folder, render_primitive=self.render_primitive, ) self.stroke_shader_wrapper = ShaderWrapper( vert_data=self.stroke_data, + uniforms=self.uniforms, shader_folder=self.stroke_shader_folder, render_primitive=self.render_primitive, ) + self.shader_wrapper_list = [ + self.stroke_shader_wrapper.copy(), # Use for back stroke + self.fill_shader_wrapper.copy(), + self.stroke_shader_wrapper.copy(), + ] + for sw in self.shader_wrapper_list: + sw.uniforms = self.uniforms + def refresh_shader_wrapper_id(self): for wrapper in [self.fill_shader_wrapper, self.stroke_shader_wrapper]: wrapper.refresh_id() return self - def get_fill_shader_wrapper(self): - self.update_fill_shader_wrapper() - return self.fill_shader_wrapper - - def update_fill_shader_wrapper(self): + def get_fill_shader_wrapper(self) -> ShaderWrapper: + self.fill_shader_wrapper.vert_indices = self.get_fill_shader_vert_indices() self.fill_shader_wrapper.vert_data = self.get_fill_shader_data() - self.fill_shader_wrapper.vert_indices = self.get_triangulation() - self.fill_shader_wrapper.uniforms = self.get_fill_uniforms() - - def get_stroke_shader_wrapper(self): - self.update_stroke_shader_wrapper() - return self.stroke_shader_wrapper + self.fill_shader_wrapper.uniforms = self.get_shader_uniforms() + self.fill_shader_wrapper.depth_test = self.depth_test + return self.fill_shader_wrapper - def update_stroke_shader_wrapper(self): + def get_stroke_shader_wrapper(self) -> ShaderWrapper: self.stroke_shader_wrapper.vert_data = self.get_stroke_shader_data() - self.stroke_shader_wrapper.uniforms = self.get_stroke_uniforms() + self.stroke_shader_wrapper.uniforms = self.get_shader_uniforms() + self.stroke_shader_wrapper.depth_test = self.depth_test + return self.stroke_shader_wrapper def get_shader_wrapper_list(self): # Build up data lists @@ -1533,9 +1600,9 @@ def get_shader_wrapper_list(self): stroke_shader_wrappers = [] back_stroke_shader_wrappers = [] for submob in self.family_members_with_points(): - if submob.has_fill() and not config["use_projection_fill_shaders"]: + if submob.has_fill(): fill_shader_wrappers.append(submob.get_fill_shader_wrapper()) - if submob.has_stroke() and not config["use_projection_stroke_shaders"]: + if submob.has_stroke(): ssw = submob.get_stroke_shader_wrapper() if submob.draw_stroke_behind_fill: back_stroke_shader_wrappers.append(ssw) @@ -1543,38 +1610,23 @@ def get_shader_wrapper_list(self): stroke_shader_wrappers.append(ssw) # Combine data lists - wrapper_lists = [ + sw_lists = [ back_stroke_shader_wrappers, fill_shader_wrappers, stroke_shader_wrappers, ] - result = [] - for wlist in wrapper_lists: - if wlist: - wrapper = wlist[0] - wrapper.combine_with(*wlist[1:]) - result.append(wrapper) - return result - - def get_stroke_uniforms(self): - result = dict(super().get_shader_uniforms()) - result["joint_type"] = self.joint_type.value - result["flat_stroke"] = float(self.flat_stroke) - return result - - def get_fill_uniforms(self): - return { - "is_fixed_in_frame": float(self.is_fixed_in_frame), - "is_fixed_orientation": float(self.is_fixed_orientation), - "fixed_orientation_center": self.fixed_orientation_center, - "gloss": self.gloss, - "shadow": self.shadow, - } - - def get_stroke_shader_data(self): + for sw, sw_list in zip(self.shader_wrapper_list, sw_lists): + if not sw_list: + continue + sw.read_in(*sw_list) + sw.depth_test = any(sw.depth_test for sw in sw_list) + sw.uniforms.update(sw_list[0].uniforms) + return list(filter(lambda sw: len(sw.vert_data) > 0, self.shader_wrapper_list)) + + def get_stroke_shader_data(self) -> np.ndarray: points = self.points if len(self.stroke_data) != len(points): - self.stroke_data = np.zeros(len(points), dtype=OpenGLVMobject.stroke_dtype) + self.stroke_data = resize_array(self.stroke_data, len(points)) if "points" not in self.locked_data_keys: nppc = self.n_points_per_curve @@ -1586,19 +1638,18 @@ def get_stroke_shader_data(self): self.read_data_to_shader(self.stroke_data, "color", "stroke_rgba") self.read_data_to_shader(self.stroke_data, "stroke_width", "stroke_width") - self.read_data_to_shader(self.stroke_data, "unit_normal", "unit_normal") return self.stroke_data - def get_fill_shader_data(self): + def get_fill_shader_data(self) -> np.ndarray: points = self.points if len(self.fill_data) != len(points): - self.fill_data = np.zeros(len(points), dtype=OpenGLVMobject.fill_dtype) + self.fill_data = resize_array(self.fill_data, len(points)) self.fill_data["vert_index"][:, 0] = range(len(points)) self.read_data_to_shader(self.fill_data, "point", "points") self.read_data_to_shader(self.fill_data, "color", "fill_rgba") - self.read_data_to_shader(self.fill_data, "unit_normal", "unit_normal") + self.read_data_to_shader(self.fill_data, "orientation", "orientation") return self.fill_data @@ -1606,7 +1657,7 @@ def refresh_shader_data(self): self.get_fill_shader_data() self.get_stroke_shader_data() - def get_fill_shader_vert_indices(self): + def get_fill_shader_vert_indices(self) -> np.ndarray: return self.get_triangulation() @@ -1693,7 +1744,7 @@ def __str__(self): f"submobject{'s' if len(self.submobjects) > 0 else ''}" ) - def add(self, *vmobjects: OpenGLVMobject): + def add(self, *vmobjects: OpenGLVMobject): # type: ignore """Checks if all passed elements are an instance of OpenGLVMobject and then add them to submobjects Parameters @@ -1790,7 +1841,7 @@ def __setitem__(self, key: int, value: OpenGLVMobject | Sequence[OpenGLVMobject] """ if not all(isinstance(m, OpenGLVMobject) for m in value): raise TypeError("All submobjects must be of type OpenGLVMobject") - self.submobjects[key] = value + self.submobjects[key] = value # type: ignore class OpenGLVectorizedPoint(OpenGLPoint, OpenGLVMobject): @@ -1800,15 +1851,15 @@ def __init__( color=BLACK, fill_opacity=0, stroke_width=0, - artificial_width=0.01, - artificial_height=0.01, **kwargs, ): - self.artificial_width = artificial_width - self.artificial_height = artificial_height - - super().__init__( - color=color, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs + OpenGLPoint.__init__(self, location, **kwargs) + OpenGLVMobject.__init__( + self, + color=color, + fill_opacity=fill_opacity, + stroke_width=stroke_width, + **kwargs, ) self.set_points(np.array([location])) @@ -1878,32 +1929,50 @@ def __init__( self, vmobject: OpenGLVMobject, num_dashes: int = 15, - dashed_ratio: float = 0.5, - color: Color = WHITE, + positive_space_ratio: float = 0.5, **kwargs, ): - self.dashed_ratio = dashed_ratio - self.num_dashes = num_dashes - super().__init__(color=color, **kwargs) - r = self.dashed_ratio - n = self.num_dashes + super().__init__(**kwargs) + if num_dashes > 0: - # Assuming total length is 1 - dash_len = r / n - if vmobject.is_closed(): - void_len = (1 - r) / n - else: - void_len = (1 - r) / (n - 1) + # End points of the unit interval for division + alphas = np.linspace(0, 1, num_dashes + 1) + + # This determines the length of each "dash" + full_d_alpha = 1.0 / num_dashes + partial_d_alpha = full_d_alpha * positive_space_ratio + + # Rescale so that the last point of vmobject will + # be the end of the last dash + alphas /= 1 - full_d_alpha + partial_d_alpha self.add( - *( - vmobject.get_subcurve( - i * (dash_len + void_len), - i * (dash_len + void_len) + dash_len, - ) - for i in range(n) - ) + *[ + vmobject.get_subcurve(alpha, alpha + partial_d_alpha) + for alpha in alphas[:-1] + ] ) # Family is already taken care of by get_subcurve # implementation self.match_style(vmobject, recurse=False) + + +class VHighlight(OpenGLVGroup): + def __init__( + self, + vmobject: OpenGLVMobject, + n_layers: int = 5, + color_bounds: tuple[Color, Color] = (GREY_C, GREY_E), + max_stroke_addition: float = 5.0, + ): + outline = vmobject.replicate(n_layers) + outline.set_fill(opacity=0) + added_widths = np.linspace(0, max_stroke_addition, n_layers + 1)[1:] + colors = color_gradient(color_bounds, n_layers) + for part, added_width, color in zip(reversed(outline), added_widths, colors): + for sm in part.family_members_with_points(): + sm.set_stroke( + width=sm.get_stroke_width() + added_width, + color=color, + ) + super().__init__(*outline) diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 36bf146263..b5cf76ec08 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -2410,7 +2410,6 @@ def __init__( equal_lengths=True, **kwargs, ): - self.dashed_ratio = dashed_ratio self.num_dashes = num_dashes super().__init__(color=color, **kwargs) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index aa0bdbebf4..837f9aa819 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -1,9 +1,14 @@ from __future__ import annotations import itertools as it +import math import sys import time -from typing import Any +from typing import Any, Iterable + +from manim.renderer.shader_wrapper import ShaderWrapper + +from ..constants import RADIANS if sys.version_info < (3, 8): from backports.cached_property import cached_property @@ -12,22 +17,25 @@ import moderngl import numpy as np +import OpenGL.GL as gl from PIL import Image +from scipy.spatial.transform import Rotation from manim import config, logger from manim.mobject.opengl.opengl_mobject import OpenGLMobject, OpenGLPoint from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.utils.caching import handle_caching_play -from manim.utils.color import color_to_rgba +from manim.utils.color import BLACK, color_to_rgba from manim.utils.exceptions import EndSceneEarlyException from ..constants import * from ..scene.scene_file_writer import SceneFileWriter from ..utils import opengl from ..utils.config_ops import _Data -from ..utils.simple_functions import clip +from ..utils.simple_functions import clip, fdiv from ..utils.space_ops import ( angle_of_vector, + normalize, quaternion_from_angle_axis, quaternion_mult, rotation_matrix_transpose, @@ -40,7 +48,495 @@ ) -class OpenGLCamera(OpenGLMobject): +class OpenGLCameraFrame(OpenGLMobject): + def __init__( + self, + frame_shape: tuple[float, float] = (config.frame_width, config.frame_height), + center_point: np.ndarray = ORIGIN, + focal_dist_to_height: float = 2.0, + **kwargs, + ): + self.frame_shape = frame_shape + self.center_point = center_point + self.focal_dist_to_height = focal_dist_to_height + super().__init__(**kwargs) + + def init_uniforms(self): + super().init_uniforms() + # as a quarternion + self.uniforms["orientation"] = Rotation.identity().as_quat() + self.uniforms["focal_dist_to_height"] = self.focal_dist_to_height + + def init_points(self) -> None: + self.set_points([ORIGIN, LEFT, RIGHT, DOWN, UP]) + self.set_width(self.frame_shape[0], stretch=True) + self.set_height(self.frame_shape[1], stretch=True) + self.move_to(self.center_point) + + def set_orientation(self, rotation: Rotation): + self.uniforms["orientation"] = rotation.as_quat() + return self + + def get_orientation(self): + return Rotation.from_quat(self.uniforms["orientation"]) + + def to_default_state(self): + self.center() + self.set_height(config.frame_width) + self.set_width(config.frame_height) + self.set_orientation(Rotation.identity()) + return self + + def get_euler_angles(self): + return self.get_orientation().as_euler("zxz")[::-1] + + def get_theta(self): + return self.get_euler_angles()[0] + + def get_phi(self): + return self.get_euler_angles()[1] + + def get_gamma(self): + return self.get_euler_angles()[2] + + def get_inverse_camera_rotation_matrix(self): + return self.get_orientation().as_matrix().T + + def rotate(self, angle: float, axis: np.ndarray = OUT, **kwargs): # type: ignore + rot = Rotation.from_rotvec(axis * normalize(axis)) # type: ignore + self.set_orientation(rot * self.get_orientation()) + + def set_euler_angles( + self, + theta: float | None = None, + phi: float | None = None, + gamma: float | None = None, + units: float = RADIANS, + ): + eulers = self.get_euler_angles() # theta, phi, gamma + for i, var in enumerate([theta, phi, gamma]): + if var is not None: + eulers[i] = var * units + self.set_orientation(Rotation.from_euler("zxz", eulers[::-1])) + return self + + def reorient( + self, + theta_degrees: float | None = None, + phi_degrees: float | None = None, + gamma_degrees: float | None = None, + ): + """ + Shortcut for set_euler_angles, defaulting to taking + in angles in degrees + """ + self.set_euler_angles(theta_degrees, phi_degrees, gamma_degrees, units=DEGREES) + return self + + def set_theta(self, theta: float): + return self.set_euler_angles(theta=theta) + + def set_phi(self, phi: float): + return self.set_euler_angles(phi=phi) + + def set_gamma(self, gamma: float): + return self.set_euler_angles(gamma=gamma) + + def increment_theta(self, dtheta: float): + self.rotate(dtheta, OUT) + return self + + def increment_phi(self, dphi: float): + self.rotate(dphi, self.get_inverse_camera_rotation_matrix()[0]) + return self + + def increment_gamma(self, dgamma: float): + self.rotate(dgamma, self.get_inverse_camera_rotation_matrix()[2]) + return self + + def set_focal_distance(self, focal_distance: float): + self.uniforms["focal_dist_to_height"] = focal_distance / self.get_height() + return self + + def set_field_of_view(self, field_of_view: float): + self.uniforms["focal_dist_to_height"] = 2 * math.tan(field_of_view / 2) + return self + + def get_shape(self): + return (self.get_width(), self.get_height()) + + def get_center(self) -> np.ndarray: + # Assumes first point is at the center + return self.points[0] + + def get_width(self) -> float: + points = self.points + return points[2, 0] - points[1, 0] + + def get_height(self) -> float: + points = self.points + return points[4, 1] - points[3, 1] + + def get_focal_distance(self) -> float: + return self.uniforms["focal_dist_to_height"] * self.get_height() # type: ignore + + def get_field_of_view(self) -> float: + return 2 * math.atan(self.uniforms["focal_dist_to_height"] / 2) + + def get_implied_camera_location(self) -> np.ndarray: + to_camera = self.get_inverse_camera_rotation_matrix()[2] + dist = self.get_focal_distance() + return self.get_center() + dist * to_camera + + +class OpenGLCamera: + def __init__( + self, + ctx: moderngl.Context | None = None, + background_image: str | None = None, + frame_config: dict = {}, + pixel_width: int = config.pixel_width, + pixel_height: int = config.pixel_height, + fps: int = config.frame_rate, + # Note: frame height and width will be resized to match the pixel aspect rati + background_color=BLACK, + background_opacity: float = 1.0, + # Points in vectorized mobjects with norm greater + # than this value will be rescaled + max_allowable_norm: float = 1.0, + image_mode: str = "RGBA", + n_channels: int = 4, + pixel_array_dtype: type = np.uint8, + light_source_position: np.ndarray = np.array([-10, 10, 10]), + # Although vector graphics handle antialiasing fine + # without multisampling, for 3d scenes one might want + # to set samples to be greater than 0. + samples: int = 0, + ) -> None: + self.background_image = background_image + self.pixel_width = pixel_width + self.pixel_height = pixel_height + self.fps = fps + self.max_allowable_norm = max_allowable_norm + self.image_mode = image_mode + self.n_channels = n_channels + self.pixel_array_dtype = pixel_array_dtype + self.light_source_position = light_source_position + self.samples = samples + + self.rgb_max_val: float = np.iinfo(self.pixel_array_dtype).max + self.background_color: list[float] = list( + color_to_rgba(background_color, background_opacity) + ) + self.init_frame(**frame_config) + self.init_context(ctx) + self.init_shaders() + self.init_textures() + self.init_light_source() + self.refresh_perspective_uniforms() + # A cached map from mobjects to their associated list of render groups + # so that these render groups are not regenerated unnecessarily for static + # mobjects + self.mob_to_render_groups: dict = {} + + def init_frame(self, **config) -> None: + self.frame = OpenGLCameraFrame(**config) + + def init_context(self, ctx: moderngl.Context | None = None) -> None: + if ctx is None: + ctx = moderngl.create_standalone_context() + fbo = self.get_fbo(ctx, 0) + else: + fbo = ctx.detect_framebuffer() + + self.ctx = ctx + self.fbo = fbo + self.set_ctx_blending() + + # For multisample antisampling + fbo_msaa = self.get_fbo(ctx, self.samples) + fbo_msaa.use() + self.fbo_msaa = fbo_msaa + + def set_ctx_blending(self, enable: bool = True) -> None: + if enable: + self.ctx.enable(moderngl.BLEND) + else: + self.ctx.disable(moderngl.BLEND) + + def set_ctx_depth_test(self, enable: bool = True) -> None: + if enable: + self.ctx.enable(moderngl.DEPTH_TEST) + else: + self.ctx.disable(moderngl.DEPTH_TEST) + + def init_light_source(self) -> None: + self.light_source = OpenGLPoint(self.light_source_position) + + # Methods associated with the frame buffer + def get_fbo(self, ctx: moderngl.Context, samples: int = 0) -> moderngl.Framebuffer: + pw = self.pixel_width + ph = self.pixel_height + return ctx.framebuffer( + color_attachments=ctx.texture( + (pw, ph), components=self.n_channels, samples=samples + ), + depth_attachment=ctx.depth_renderbuffer((pw, ph), samples=samples), + ) + + def clear(self) -> None: + self.fbo.clear(*self.background_color) + self.fbo_msaa.clear(*self.background_color) + + def reset_pixel_shape(self, new_width: int, new_height: int) -> None: + self.pixel_width = new_width + self.pixel_height = new_height + self.refresh_perspective_uniforms() + + def get_raw_fbo_data(self, dtype: str = "f1") -> bytes: + # Copy blocks from the fbo_msaa to the drawn fbo using Blit + pw, ph = (self.pixel_width, self.pixel_height) + gl.glBindFrameBuffer(gl.GL_READ_FRAMEBUFFER, self.fbo_msaa.glo) + gl.glBindFrameBuffer(gl.GL_DRAW_FRAMEBUFFER, self.fbo.glo) + gl.glBlitFramebuffer( + 0, 0, pw, ph, 0, 0, pw, ph, gl.GL_COLOR_BUFFER_BIT, gl.GL_LINEAR + ) + return self.fbo.read( + viewport=self.fbo.viewport, + components=self.n_channels, + dtype=dtype, + ) + + def get_image(self) -> Image.Image: + return Image.frombytes( + "RGBA", + self.get_pixel_shape(), + self.get_raw_fbo_data(), + "raw", + "RGBA", + 0, + -1, + ) + + def get_pixel_array(self) -> np.ndarray: + raw = self.get_raw_fbo_data(dtype="f4") + flat_arr = np.frombuffer(raw, dtype="f4") + arr = flat_arr.reshape([*reversed(self.fbo.size), self.n_channels]) + arr = arr[::-1] + # Convert from float + return (self.rgb_max_val * arr).astype(self.pixel_array_dtype) + + def get_texture(self): + texture = self.ctx.texture( + size=self.fbo.size, components=4, data=self.get_raw_fbo_data(), dtype="f4" + ) + return texture + + # Getting camera attributes + def get_pixel_shape(self) -> tuple[int, int]: + return self.fbo.viewport[2:4] + # return (self.pixel_width, self.pixel_height) + + def get_pixel_width(self) -> int: + return self.get_pixel_shape()[0] + + def get_pixel_height(self) -> int: + return self.get_pixel_shape()[1] + + def get_frame_height(self) -> float: + return self.frame.get_height() + + def get_frame_width(self) -> float: + return self.frame.get_width() + + def get_frame_shape(self) -> tuple[float, float]: + return (self.get_frame_width(), self.get_frame_height()) + + def get_frame_center(self) -> np.ndarray: + return self.frame.get_center() + + def get_location(self) -> tuple[float, float, float] | np.ndarray: + return self.frame.get_implied_camera_location() + + def resize_frame_shape(self, fixed_dimension: bool = False) -> None: + """ + Changes frame_shape to match the aspect ratio + of the pixels, where fixed_dimension determines + whether frame_height or frame_width + remains fixed while the other changes accordingly. + """ + pixel_height = self.get_pixel_height() + pixel_width = self.get_pixel_width() + frame_height = self.get_frame_height() + frame_width = self.get_frame_width() + aspect_ratio = fdiv(pixel_width, pixel_height) + if not fixed_dimension: + frame_height = frame_width / aspect_ratio + else: + frame_width = aspect_ratio * frame_height + self.frame.set_height(frame_height) + self.frame.set_width(frame_width) + + # Rendering + def capture(self, *mobjects: OpenGLMobject) -> None: + self.refresh_perspective_uniforms() + for mobject in mobjects: + for render_group in self.get_render_group_list(mobject): + self.render(render_group) + + def render(self, render_group: dict[str, Any]) -> None: + shader_wrapper: ShaderWrapper = render_group["shader_wrapper"] + shader_program = render_group["prog"] + self.set_shader_uniforms(shader_program, shader_wrapper) + self.set_ctx_depth_test(shader_wrapper.depth_test) + render_group["vao"].render(int(shader_wrapper.render_primitive)) + if render_group["single_use"]: + self.release_render_group(render_group) + + def get_render_group_list(self, mobject: OpenGLMobject) -> Iterable[dict[str, Any]]: + if mobject.is_changing(): + return self.generate_render_group_list(mobject) + + # Otherwise, cache result for later use + key = id(mobject) + if key not in self.mob_to_render_groups: + self.mob_to_render_groups[key] = list( + self.generate_render_group_list(mobject) + ) + return self.mob_to_render_groups[key] + + def generate_render_group_list( + self, mobject: OpenGLMobject + ) -> Iterable[dict[str, Any]]: + return ( + self.get_render_group(sw, single_use=mobject.is_changing()) + for sw in mobject.get_shader_wrapper_list() + ) + + def get_render_group( + self, shader_wrapper: ShaderWrapper, single_use: bool = True + ) -> dict[str, Any]: + # Data buffers + vbo = self.ctx.buffer(shader_wrapper.vert_data.tobytes()) + if shader_wrapper.vert_indices is None: + ibo = None + else: + vert_index_data = shader_wrapper.vert_indices.astype("i4").tobytes() + if vert_index_data: + ibo = self.ctx.buffer(vert_index_data) + else: + ibo = None + + # Program an vertex array + shader_program, vert_format = self.get_shader_program(shader_wrapper) # type: ignore + vao = self.ctx.vertex_array( + program=shader_program, + content=[(vbo, vert_format, *shader_wrapper.vert_attributes)], + index_buffer=ibo, + ) + return { + "vbo": vbo, + "ibo": ibo, + "vao": vao, + "prog": shader_program, + "shader_wrapper": shader_wrapper, + "single_use": single_use, + } + + def release_render_group(self, render_group: dict[str, Any]) -> None: + for key in ["vbo", "ibo", "vao"]: + if render_group[key] is not None: + render_group[key].release() + + def refresh_static_mobjects(self) -> None: + for render_group in it.chain(*self.mob_to_render_groups.values()): + self.release_render_group(render_group) + self.mob_to_render_groups = {} + + # Shaders + def init_shaders(self) -> None: + # Initialize with the null id going to None + self.id_to_shader_program: dict[int, tuple[moderngl.Program, str] | None] = { + hash(""): None + } + + def get_shader_program( + self, shader_wrapper: ShaderWrapper + ) -> tuple[moderngl.Program, str] | None: + sid = shader_wrapper.get_program_id() + if sid not in self.id_to_shader_program: + # Create shader program for the first time, then cache + # in the id_to_shader_program dictionary + program = self.ctx.program(**shader_wrapper.get_program_code()) + vert_format = moderngl.detect_format( + program, shader_wrapper.vert_attributes + ) + self.id_to_shader_program[sid] = (program, vert_format) + + return self.id_to_shader_program[sid] + + def set_shader_uniforms( + self, + shader: moderngl.Program, + shader_wrapper: ShaderWrapper, + ) -> None: + for name, path in shader_wrapper.texture_paths.items(): + tid = self.get_texture_id(path) + shader[name].value = tid + for name, value in it.chain( + self.perspective_uniforms.items(), shader_wrapper.uniforms.items() + ): + if name in shader: + if isinstance(value, np.ndarray) and value.ndim > 0: + value = tuple(value) + shader[name].value = value + + def refresh_perspective_uniforms(self) -> None: + frame = self.frame + # Orient light + rotation = frame.get_inverse_camera_rotation_matrix() + offset = frame.get_center() + light_pos = np.dot(rotation, self.light_source.get_location() + offset) + cam_pos = self.frame.get_implied_camera_location() # TODO + + self.perspective_uniforms = { + "frame_shape": frame.get_shape(), + "pixel_shape": self.get_pixel_shape(), + "camera_offset": tuple(offset), + "camera_rotation": tuple(np.array(rotation).T.flatten()), + "camera_position": tuple(cam_pos), + "light_source_position": tuple(light_pos), + "focal_distance": frame.get_focal_distance(), + } + + def init_textures(self) -> None: + self.n_textures: int = 0 + self.path_to_texture: dict[str, tuple[int, moderngl.Texture]] = {} + + def get_texture_id(self, path: str) -> int: + if path not in self.path_to_texture: + if self.n_textures == 15: # I have no clue why this is needed + self.n_textures += 1 + tid = self.n_textures + self.n_textures += 1 + im = Image.open(path).convert("RGBA") + texture = self.ctx.texture( + size=im.size, + components=len(im.getbands()), + data=im.tobytes(), + ) + texture.use(location=tid) + self.path_to_texture[path] = (tid, texture) + return self.path_to_texture[path][0] + + def release_texture(self, path: str): + tid_and_texture = self.path_to_texture.pop(path, None) + if tid_and_texture: + tid_and_texture[1].release() + return self + + +class OpenGLCameraLegacy(OpenGLMobject): euler_angles = _Data() def __init__( @@ -465,8 +961,6 @@ def update_frame(self, scene): self.refresh_perspective_uniforms(scene.camera) for mobject in scene.mobjects: - if not mobject.should_render: - continue self.render_mobject(mobject) for obj in scene.meshes: diff --git a/manim/renderer/shader_wrapper.py b/manim/renderer/shader_wrapper.py index 8eff1772c1..f80c29c474 100644 --- a/manim/renderer/shader_wrapper.py +++ b/manim/renderer/shader_wrapper.py @@ -2,11 +2,14 @@ import copy import re +from functools import lru_cache from pathlib import Path import moderngl import numpy as np +from manim.utils.iterables import resize_array + from .. import logger # Mobjects that should be rendered with @@ -55,6 +58,29 @@ def __init__( self.init_program_code() self.refresh_id() + def __eq__(self, shader_wrapper: object): + if not isinstance(shader_wrapper, ShaderWrapper): + raise TypeError( + f"Cannot compare ShaderWrapper with non-ShaderWrapper object of type {type(shader_wrapper)}" + ) + return all( + ( + np.all(self.vert_data == shader_wrapper.vert_data), + np.all(self.vert_indices == shader_wrapper.vert_indices), + self.shader_folder == shader_wrapper.shader_folder, + all( + np.all(self.uniforms[key] == shader_wrapper.uniforms[key]) + for key in self.uniforms + ), + all( + self.texture_paths[key] == shader_wrapper.texture_paths[key] + for key in self.texture_paths + ), + self.depth_test == shader_wrapper.depth_test, + self.render_primitive == shader_wrapper.render_primitive, + ) + ) + def copy(self): result = copy.copy(self) result.vert_data = np.array(self.vert_data) @@ -125,30 +151,34 @@ def get_program_code(self): def replace_code(self, old, new): code_map = self.program_code - for (name, _code) in code_map.items(): + for name, _code in code_map.items(): if code_map[name] is None: continue code_map[name] = re.sub(old, new, code_map[name]) self.refresh_id() - def combine_with(self, *shader_wrappers): - # Assume they are of the same type - if len(shader_wrappers) == 0: - return + def combine_with(self, *shader_wrappers: ShaderWrapper) -> ShaderWrapper: + self.read_in(self.copy(), *shader_wrappers) + return self + + def read_in(self, *shader_wrappers: ShaderWrapper) -> ShaderWrapper: + # Assume all are of the same type + total_len = sum(len(sw.vert_data) for sw in shader_wrappers) + self.vert_data = resize_array(self.vert_data, total_len) if self.vert_indices is not None: - num_verts = len(self.vert_data) - indices_list = [self.vert_indices] - data_list = [self.vert_data] - for sw in shader_wrappers: - indices_list.append(sw.vert_indices + num_verts) - data_list.append(sw.vert_data) - num_verts += len(sw.vert_data) - self.vert_indices = np.hstack(indices_list) - self.vert_data = np.hstack(data_list) - else: - self.vert_data = np.hstack( - [self.vert_data, *(sw.vert_data for sw in shader_wrappers)], - ) + total_verts = sum(len(sw.vert_indices) for sw in shader_wrappers) + self.vert_indices = resize_array(self.vert_indices, total_verts) + + n_points = 0 + n_verts = 0 + for sw in shader_wrappers: + new_n_points = n_points + len(sw.vert_data) + self.vert_data[n_points:new_n_points] = sw.vert_data + if self.vert_indices is not None and sw.vert_indices is not None: + new_n_verts = n_verts + len(sw.vert_indices) + self.vert_indices[n_verts:new_n_verts] = sw.vert_indices + n_points + n_verts = new_n_verts + n_points = new_n_points return self @@ -156,6 +186,7 @@ def combine_with(self, *shader_wrappers): filename_to_code_map: dict = {} +@lru_cache(maxsize=12) def get_shader_code_from_file(filename: Path) -> str | None: if filename in filename_to_code_map: return filename_to_code_map[filename] diff --git a/manim/scene/scene.py b/manim/scene/scene.py index bf5753750e..a21f40a64b 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -1,1667 +1,943 @@ -"""Basic canvas for animations.""" - from __future__ import annotations -__all__ = ["Scene"] - -import copy -import datetime import inspect +import os import platform import random -import threading import time -import types -from queue import Queue -from typing import Callable - -import srt - -from manim.scene.section import DefaultSectionType - -try: - import dearpygui.dearpygui as dpg +from collections import OrderedDict +from typing import TYPE_CHECKING - dearpygui_imported = True -except ImportError: - dearpygui_imported = False import numpy as np -from tqdm import tqdm -from watchdog.events import FileSystemEventHandler -from watchdog.observers import Observer - -from manim.mobject.mobject import Mobject -from manim.mobject.opengl.opengl_mobject import OpenGLPoint - -from .. import config, logger -from ..animation.animation import Animation, Wait, prepare_animation -from ..camera.camera import Camera -from ..constants import * -from ..gui.gui import configure_pygui -from ..renderer.cairo_renderer import CairoRenderer -from ..renderer.opengl_renderer import OpenGLRenderer -from ..renderer.shader import Object3D -from ..utils import opengl, space_ops -from ..utils.exceptions import EndSceneEarlyException, RerunSceneException -from ..utils.family import extract_mobject_family_members -from ..utils.family_ops import restructure_list_to_exclude_certain_family_members -from ..utils.file_ops import open_media_file -from ..utils.iterables import list_difference_update, list_update - - -class RerunSceneHandler(FileSystemEventHandler): - """A class to handle rerunning a Scene after the input file is modified.""" - - def __init__(self, queue): - super().__init__() - self.queue = queue - - def on_modified(self, event): - self.queue.put(("rerun_file", [], {})) +import pyperclip +from IPython.core.getipython import get_ipython +from IPython.terminal import pt_inputhooks +from IPython.terminal.embed import InteractiveShellEmbed +from tqdm import tqdm as ProgressDisplay + +from manim._config import logger as log +from manim.animation.animation import prepare_animation +from manim.animation.fading import VFadeInThenOut +from manim.camera.camera import Camera +from manim.config import get_module +from manim.constants import ( + ARROW_SYMBOLS, + COMMAND_MODIFIER, + DEFAULT_WAIT_TIME, + RED, + SHIFT_MODIFIER, +) +from manim.event_handler import EVENT_DISPATCHER +from manim.event_handler.event_type import EventType +from manim.mobject.frame import FullScreenRectangle +from manim.mobject.mobject import Group, Mobject, Point, _AnimationBuilder +from manim.mobject.types.vectorized_mobject import VGroup, VMobject +from manim.scene.scene_file_writer import SceneFileWriter +from manim.utils.family_ops import ( + extract_mobject_family_members, + recursive_mobject_remove, +) + +if TYPE_CHECKING: + from typing import Callable, Iterable + + from PIL.Image import Image + + from manim.animation.animation import Animation + + +PAN_3D_KEY = "d" +FRAME_SHIFT_KEY = "f" +ZOOM_KEY = "z" +RESET_FRAME_KEY = "r" +QUIT_KEY = "q" class Scene: - """A Scene is the canvas of your animation. - - The primary role of :class:`Scene` is to provide the user with tools to manage - mobjects and animations. Generally speaking, a manim script consists of a class - that derives from :class:`Scene` whose :meth:`Scene.construct` method is overridden - by the user's code. - - Mobjects are displayed on screen by calling :meth:`Scene.add` and removed from - screen by calling :meth:`Scene.remove`. All mobjects currently on screen are kept - in :attr:`Scene.mobjects`. Animations are played by calling :meth:`Scene.play`. - - A :class:`Scene` is rendered internally by calling :meth:`Scene.render`. This in - turn calls :meth:`Scene.setup`, :meth:`Scene.construct`, and - :meth:`Scene.tear_down`, in that order. - - It is not recommended to override the ``__init__`` method in user Scenes. For code - that should be ran before a Scene is rendered, use :meth:`Scene.setup` instead. - - Examples - -------- - Override the :meth:`Scene.construct` method with your code. - - .. code-block:: python - - class MyScene(Scene): - def construct(self): - self.play(Write(Text("Hello World!"))) - - """ + random_seed: int = 0 + pan_sensitivity: float = 3.0 + max_num_saved_states: int = 50 + default_camera_config: dict = {} + default_window_config: dict = {} + default_file_writer_config: dict = {} def __init__( self, - renderer=None, - camera_class=Camera, - always_update_mobjects=False, - random_seed=None, - skip_animations=False, + window_config: dict = {}, + camera_config: dict = {}, + file_writer_config: dict = {}, + skip_animations: bool = False, + always_update_mobjects: bool = False, + start_at_animation_number: int | None = None, + end_at_animation_number: int | None = None, + leave_progress_bars: bool = False, + preview: bool = True, + presenter_mode: bool = False, + show_animation_progress: bool = False, + embed_exception_mode: str = "", + embed_error_sound: bool = False, ): - self.camera_class = camera_class - self.always_update_mobjects = always_update_mobjects - self.random_seed = random_seed self.skip_animations = skip_animations - - self.animations = None - self.stop_condition = None - self.moving_mobjects = [] - self.static_mobjects = [] - self.time_progression = None - self.duration = None - self.last_t = None - self.queue = Queue() - self.skip_animation_preview = False - self.meshes = [] - self.camera_target = ORIGIN - self.widgets = [] - self.dearpygui_imported = dearpygui_imported - self.updaters = [] - self.point_lights = [] - self.ambient_light = None - self.key_to_function_map = {} - self.mouse_press_callbacks = [] - self.interactive_mode = False - - if config.renderer == RendererType.OPENGL: - # Items associated with interaction - self.mouse_point = OpenGLPoint() - self.mouse_drag_point = OpenGLPoint() - if renderer is None: - renderer = OpenGLRenderer() - - if renderer is None: - self.renderer = CairoRenderer( - camera_class=self.camera_class, - skip_animations=self.skip_animations, - ) + self.always_update_mobjects = always_update_mobjects + self.start_at_animation_number = start_at_animation_number + self.end_at_animation_number = end_at_animation_number + self.leave_progress_bars = leave_progress_bars + self.preview = preview + self.presenter_mode = presenter_mode + self.show_animation_progress = show_animation_progress + self.embed_exception_mode = embed_exception_mode + self.embed_error_sound = embed_error_sound + + self.camera_config = {**self.default_camera_config, **camera_config} + self.window_config = {**self.default_window_config, **window_config} + self.file_writer_config = { + **self.default_file_writer_config, + **file_writer_config, + } + + # Initialize window, if applicable + if self.preview: + from manimlib.window import Window + + self.window = Window(scene=self, **self.window_config) + self.camera_config["ctx"] = self.window.ctx + self.camera_config["fps"] = 30 # Where's that 30 from? else: - self.renderer = renderer - self.renderer.init_scene(self) + self.window = None + + # Core state of the scene + self.camera: Camera = Camera(**self.camera_config) + self.file_writer = SceneFileWriter(self, **self.file_writer_config) + self.mobjects: list[Mobject] = [self.camera.frame] + self.id_to_mobject_map: dict[int, Mobject] = {} + self.num_plays: int = 0 + self.time: float = 0 + self.skip_time: float = 0 + self.original_skipping_status: bool = self.skip_animations + self.checkpoint_states: dict[str, list[tuple[Mobject, Mobject]]] = {} + self.undo_stack = [] + self.redo_stack = [] + + if self.start_at_animation_number is not None: + self.skip_animations = True + if self.file_writer.has_progress_display(): + self.show_animation_progress = False + + # Items associated with interaction + self.mouse_point = Point() + self.mouse_drag_point = Point() + self.hold_on_wait = self.presenter_mode + self.quit_interaction = False - self.mobjects = [] - # TODO, remove need for foreground mobjects - self.foreground_mobjects = [] + # Much nicer to work with deterministic scenes if self.random_seed is not None: random.seed(self.random_seed) np.random.seed(self.random_seed) - @property - def camera(self): - return self.renderer.camera - - def __deepcopy__(self, clone_from_id): - cls = self.__class__ - result = cls.__new__(cls) - clone_from_id[id(self)] = result - for k, v in self.__dict__.items(): - if k in ["renderer", "time_progression"]: - continue - if k == "camera_class": - setattr(result, k, v) - setattr(result, k, copy.deepcopy(v, clone_from_id)) - result.mobject_updater_lists = [] - - # Update updaters - for mobject in self.mobjects: - cloned_updaters = [] - for updater in mobject.updaters: - # Make the cloned updater use the cloned Mobjects as free variables - # rather than the original ones. Analyzing function bytecode with the - # dis module will help in understanding this. - # https://docs.python.org/3/library/dis.html - # TODO: Do the same for function calls recursively. - free_variable_map = inspect.getclosurevars(updater).nonlocals - cloned_co_freevars = [] - cloned_closure = [] - for free_variable_name in updater.__code__.co_freevars: - free_variable_value = free_variable_map[free_variable_name] - - # If the referenced variable has not been cloned, raise. - if id(free_variable_value) not in clone_from_id: - raise Exception( - f"{free_variable_name} is referenced from an updater " - "but is not an attribute of the Scene, which isn't " - "allowed.", - ) - - # Add the cloned object's name to the free variable list. - cloned_co_freevars.append(free_variable_name) - - # Add a cell containing the cloned object's reference to the - # closure list. - cloned_closure.append( - types.CellType(clone_from_id[id(free_variable_value)]), - ) - - cloned_updater = types.FunctionType( - updater.__code__.replace(co_freevars=tuple(cloned_co_freevars)), - updater.__globals__, - updater.__name__, - updater.__defaults__, - tuple(cloned_closure), - ) - cloned_updaters.append(cloned_updater) - mobject_clone = clone_from_id[id(mobject)] - mobject_clone.updaters = cloned_updaters - if len(cloned_updaters) > 0: - result.mobject_updater_lists.append((mobject_clone, cloned_updaters)) - return result - - def render(self, preview: bool = False): - """ - Renders this Scene. + def __str__(self) -> str: + return self.__class__.__name__ + + def run(self) -> None: + self.virtual_animation_start_time: float = 0 + self.real_animation_start_time: float = time.time() + self.file_writer.begin() - Parameters - --------- - preview - If true, opens scene in a file viewer. - """ self.setup() try: self.construct() - except EndSceneEarlyException: + self.interact() + except EndScene: pass - except RerunSceneException as e: - self.remove(*self.mobjects) - self.renderer.clear_screen() - self.renderer.num_plays = 0 - return True + except KeyboardInterrupt: + # Get rid keyboard interrupt symbols + print("", end="\r") + self.file_writer.ended_with_interrupt = True self.tear_down() - # We have to reset these settings in case of multiple renders. - self.renderer.scene_finished(self) - # Show info only if animations are rendered or to get image - if ( - self.renderer.num_plays - or config["format"] == "png" - or config["save_last_frame"] - ): - logger.info( - f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations", - ) - - # If preview open up the render after rendering. - if preview: - config["preview"] = True - - if config["preview"] or config["show_in_file_browser"]: - open_media_file(self.renderer.file_writer) - - def setup(self): + def setup(self) -> None: """ - This is meant to be implemented by any scenes which - are commonly subclassed, and have some common setup + This is meant to be implement by any scenes which + are comonly subclassed, and have some common setup involved before the construct method is called. """ pass - def tear_down(self): - """ - This is meant to be implemented by any scenes which - are commonly subclassed, and have some common method - to be invoked before the scene ends. - """ + def construct(self) -> None: + # Where all the animation happens + # To be implemented in subclasses pass - def construct(self): - """Add content to the Scene. - - From within :meth:`Scene.construct`, display mobjects on screen by calling - :meth:`Scene.add` and remove them from screen by calling :meth:`Scene.remove`. - All mobjects currently on screen are kept in :attr:`Scene.mobjects`. Play - animations by calling :meth:`Scene.play`. - - Notes - ----- - Initialization code should go in :meth:`Scene.setup`. Termination code should - go in :meth:`Scene.tear_down`. - - Examples - -------- - A typical manim script includes a class derived from :class:`Scene` with an - overridden :meth:`Scene.contruct` method: - - .. code-block:: python - - class MyScene(Scene): - def construct(self): - self.play(Write(Text("Hello World!"))) - - See Also - -------- - :meth:`Scene.setup` - :meth:`Scene.render` - :meth:`Scene.tear_down` + def tear_down(self) -> None: + self.stop_skipping() + self.file_writer.finish() + if self.window: + self.window.destroy() + self.window = None + def interact(self) -> None: + """ + If there is a window, enter a loop + which updates the frame while under + the hood calling the pyglet event loop """ - pass # To be implemented in subclasses + if self.window is None: + return + log.info( + "\nTips: Using the keys `d`, `f`, or `z` " + + "you can interact with the scene. " + + "Press `command + q` or `esc` to quit" + ) + self.skip_animations = False + self.refresh_static_mobjects() + while not self.is_window_closing(): + self.update_frame(1 / self.camera.fps) - def next_section( + def embed( self, - name: str = "unnamed", - type: str = DefaultSectionType.NORMAL, - skip_animations: bool = False, + close_scene_on_exit: bool = True, + show_animation_progress: bool = True, ) -> None: - """Create separation here; the last section gets finished and a new one gets created. - ``skip_animations`` skips the rendering of all animations in this section. - Refer to :doc:`the documentation` on how to use sections. - """ - self.renderer.file_writer.next_section(name, type, skip_animations) + if not self.preview: + return # Embed is only relevant with a preview + self.stop_skipping() + self.update_frame() + self.save_state() + self.show_animation_progress = show_animation_progress + + # Create embedded IPython terminal to be configured + shell = InteractiveShellEmbed.instance() + + # Use the locals namespace of the caller + caller_frame = inspect.currentframe().f_back + local_ns = dict(caller_frame.f_locals) + + # Add a few custom shortcuts + local_ns.update( + play=self.play, + wait=self.wait, + add=self.add, + remove=self.remove, + clear=self.clear, + save_state=self.save_state, + undo=self.undo, + redo=self.redo, + i2g=self.i2g, + i2m=self.i2m, + checkpoint_paste=self.checkpoint_paste, + ) - def __str__(self): - return self.__class__.__name__ + # Enables gui interactions during the embed + def inputhook(context): + while not context.input_is_ready(): + if not self.is_window_closing(): + self.update_frame(dt=0) + if self.is_window_closing(): + shell.ask_exit() + + pt_inputhooks.register("manim", inputhook) + shell.enable_gui("manim") + + # This is hacky, but there's an issue with ipython which is that + # when you define lambda's or list comprehensions during a shell session, + # they are not aware of local variables in the surrounding scope. Because + # That comes up a fair bit during scene construction, to get around this, + # we (admittedly sketchily) update the global namespace to match the local + # namespace, since this is just a shell session anyway. + shell.events.register( + "pre_run_cell", lambda: shell.user_global_ns.update(shell.user_ns) + ) - def get_attrs(self, *keys: str): - """ - Gets attributes of a scene given the attribute's identifier/name. + # Operation to run after each ipython command + def post_cell_func(): + self.refresh_static_mobjects() + if not self.is_window_closing(): + self.update_frame(dt=0, ignore_skipping=True) + self.save_state() + + shell.events.register("post_run_cell", post_cell_func) + + # Flash border, and potentially play sound, on exceptions + def custom_exc(shell, etype, evalue, tb, tb_offset=None): + # still show the error don't just swallow it + shell.showtraceback((etype, evalue, tb), tb_offset=tb_offset) + if self.embed_error_sound: + os.system("printf '\a'") + rect = FullScreenRectangle().set_stroke(RED, 30).set_fill(opacity=0) + rect.fix_in_frame() + self.play(VFadeInThenOut(rect, run_time=0.5)) + + shell.set_custom_exc((Exception,), custom_exc) + + # Set desired exception mode + shell.magic(f"xmode {self.embed_exception_mode}") + + # Launch shell + shell( + local_ns=local_ns, + # Pretend like we're embeding in the caller function, not here + stack_depth=2, + # Specify that the present module is the caller's, not here + module=get_module(caller_frame.f_globals["__file__"]), + ) - Parameters - ---------- - *keys - Name(s) of the argument(s) to return the attribute of. + # End scene when exiting an embed + if close_scene_on_exit: + raise EndScene() - Returns - ------- - list - List of attributes of the passed identifiers. - """ - return [getattr(self, key) for key in keys] + # Only these methods should touch the camera - def update_mobjects(self, dt: float): - """ - Begins updating all mobjects in the Scene. + def get_image(self) -> Image: + return self.camera.get_image() - Parameters - ---------- - dt - Change in time between updates. Defaults (mostly) to 1/frames_per_second - """ - for mobject in self.mobjects: - mobject.update(dt) + def show(self) -> None: + self.update_frame(ignore_skipping=True) + self.get_image().show() - def update_meshes(self, dt): - for obj in self.meshes: - for mesh in obj.get_family(): - mesh.update(dt) + def update_frame(self, dt: float = 0, ignore_skipping: bool = False) -> None: + self.increment_time(dt) + self.update_mobjects(dt) + if self.skip_animations and not ignore_skipping: + return - def update_self(self, dt: float): - """Run all scene updater functions. + if self.is_window_closing(): + raise EndScene() - Among all types of update functions (mobject updaters, mesh updaters, - scene updaters), scene update functions are called last. + if self.window: + self.window.clear() + self.camera.clear() + self.camera.capture(*self.mobjects) - Parameters - ---------- - dt - Scene time since last update. + if self.window: + self.window.swap_buffers() + vt = self.time - self.virtual_animation_start_time + rt = time.time() - self.real_animation_start_time + if rt < vt: + self.update_frame(0) - See Also - -------- - :meth:`.Scene.add_updater` - :meth:`.Scene.remove_updater` - """ - for func in self.updaters: - func(dt) + def emit_frame(self) -> None: + if not self.skip_animations: + self.file_writer.write_frame(self.camera) + + # Related to updating + + def update_mobjects(self, dt: float) -> None: + for mobject in self.mobjects: + mobject.update(dt) def should_update_mobjects(self) -> bool: - """ - Returns True if the mobjects of this scene should be updated. + return self.always_update_mobjects or any( + [len(mob.get_family_updaters()) > 0 for mob in self.mobjects] + ) - In particular, this checks whether + def has_time_based_updaters(self) -> bool: + return any( + [ + sm.has_time_based_updater() + for mob in self.mobjects() + for sm in mob.get_family() + ] + ) - - the :attr:`always_update_mobjects` attribute of :class:`.Scene` - is set to ``True``, - - the :class:`.Scene` itself has time-based updaters attached, - - any mobject in this :class:`.Scene` has time-based updaters attached. + # Related to time - This is only called when a single Wait animation is played. - """ - wait_animation = self.animations[0] - if wait_animation.is_static_wait is None: - should_update = ( - self.always_update_mobjects - or self.updaters - or any( - [ - mob.has_time_based_updater() - for mob in self.get_mobject_family_members() - ], - ) - ) - wait_animation.is_static_wait = not should_update - return not wait_animation.is_static_wait + def get_time(self) -> float: + return self.time - def get_top_level_mobjects(self): - """ - Returns all mobjects which are not submobjects. + def increment_time(self, dt: float) -> None: + self.time += dt - Returns - ------- - list - List of top level mobjects. - """ + # Related to internal mobject organization + + def get_top_level_mobjects(self) -> list[Mobject]: # Return only those which are not in the family # of another mobject from the scene - families = [m.get_family() for m in self.mobjects] + mobjects = self.get_mobjects() + families = [m.get_family() for m in mobjects] def is_top_level(mobject): - num_families = sum((mobject in family) for family in families) + num_families = sum([(mobject in family) for family in families]) return num_families == 1 - return list(filter(is_top_level, self.mobjects)) + return list(filter(is_top_level, mobjects)) - def get_mobject_family_members(self): - """ - Returns list of family-members of all mobjects in scene. - If a Circle() and a VGroup(Rectangle(),Triangle()) were added, - it returns not only the Circle(), Rectangle() and Triangle(), but - also the VGroup() object. - - Returns - ------- - list - List of mobject family members. - """ - if config.renderer == RendererType.OPENGL: - family_members = [] - for mob in self.mobjects: - family_members.extend(mob.get_family()) - return family_members - elif config.renderer == RendererType.CAIRO: - return extract_mobject_family_members( - self.mobjects, - use_z_index=self.renderer.camera.use_z_index, - ) + def get_mobject_family_members(self) -> list[Mobject]: + return extract_mobject_family_members(self.mobjects) - def add(self, *mobjects: Mobject): + def add(self, *new_mobjects: Mobject): """ Mobjects will be displayed, from background to foreground in the order with which they are added. - - Parameters - --------- - *mobjects - Mobjects to add. - - Returns - ------- - Scene - The same scene after adding the Mobjects in. - """ - if config.renderer == RendererType.OPENGL: - new_mobjects = [] - new_meshes = [] - for mobject_or_mesh in mobjects: - if isinstance(mobject_or_mesh, Object3D): - new_meshes.append(mobject_or_mesh) - else: - new_mobjects.append(mobject_or_mesh) - self.remove(*new_mobjects) - self.mobjects += new_mobjects - self.remove(*new_meshes) - self.meshes += new_meshes - elif config.renderer == RendererType.CAIRO: - mobjects = [*mobjects, *self.foreground_mobjects] - self.restructure_mobjects(to_remove=mobjects) - self.mobjects += mobjects - if self.moving_mobjects: - self.restructure_mobjects( - to_remove=mobjects, - mobject_list_name="moving_mobjects", - ) - self.moving_mobjects += mobjects + self.remove(*new_mobjects) + self.mobjects += new_mobjects + self.id_to_mobject_map.update( + {id(sm): sm for m in new_mobjects for sm in m.get_family()} + ) return self - def add_mobjects_from_animations(self, animations): - curr_mobjects = self.get_mobject_family_members() - for animation in animations: - if animation.is_introducer(): - continue - # Anything animated that's not already in the - # scene gets added to the scene - mob = animation.mobject - if mob is not None and mob not in curr_mobjects: - self.add(mob) - curr_mobjects += mob.get_family() - - def remove(self, *mobjects: Mobject): - """ - Removes mobjects in the passed list of mobjects - from the scene and the foreground, by removing them - from "mobjects" and "foreground_mobjects" - - Parameters - ---------- - *mobjects - The mobjects to remove. + def add_mobjects_among(self, values: Iterable): """ - if config.renderer == RendererType.OPENGL: - mobjects_to_remove = [] - meshes_to_remove = set() - for mobject_or_mesh in mobjects: - if isinstance(mobject_or_mesh, Object3D): - meshes_to_remove.add(mobject_or_mesh) - else: - mobjects_to_remove.append(mobject_or_mesh) - self.mobjects = restructure_list_to_exclude_certain_family_members( - self.mobjects, - mobjects_to_remove, - ) - self.meshes = list( - filter(lambda mesh: mesh not in set(meshes_to_remove), self.meshes), - ) - return self - elif config.renderer == RendererType.CAIRO: - for list_name in "mobjects", "foreground_mobjects": - self.restructure_mobjects(mobjects, list_name, False) - return self - - def add_updater(self, func: Callable[[float], None]) -> None: - """Add an update function to the scene. - - The scene updater functions are run every frame, - and they are the last type of updaters to run. - - .. WARNING:: - - When using the Cairo renderer, scene updaters that - modify mobjects are not detected in the same way - that mobject updaters are. To be more concrete, - a mobject only modified via a scene updater will - not necessarily be added to the list of *moving - mobjects* and thus might not be updated every frame. - - TL;DR: Use mobject updaters to update mobjects. - - Parameters - ---------- - func - The updater function. It takes a float, which is the - time difference since the last update (usually equal - to the frame rate). - - See also - -------- - :meth:`.Scene.remove_updater` - :meth:`.Scene.update_self` - """ - self.updaters.append(func) - - def remove_updater(self, func: Callable[[float], None]) -> None: - """Remove an update function from the scene. - - Parameters - ---------- - func - The updater function to be removed. - - See also - -------- - :meth:`.Scene.add_updater` - :meth:`.Scene.update_self` + This is meant mostly for quick prototyping, + e.g. to add all mobjects defined up to a point, + call self.add_mobjects_among(locals().values()) """ - self.updaters = [f for f in self.updaters if f is not func] - - def restructure_mobjects( - self, - to_remove: Mobject, - mobject_list_name: str = "mobjects", - extract_families: bool = True, - ): - """ - tl:wr - If your scene has a Group(), and you removed a mobject from the Group, - this dissolves the group and puts the rest of the mobjects directly - in self.mobjects or self.foreground_mobjects. - - In cases where the scene contains a group, e.g. Group(m1, m2, m3), but one - of its submobjects is removed, e.g. scene.remove(m1), the list of mobjects - will be edited to contain other submobjects, but not m1, e.g. it will now - insert m2 and m3 to where the group once was. - - Parameters - ---------- - to_remove - The Mobject to remove. - - mobject_list_name - The list of mobjects ("mobjects", "foreground_mobjects" etc) to remove from. - - extract_families - Whether the mobject's families should be recursively extracted. - - Returns - ------- - Scene - The Scene mobject with restructured Mobjects. - """ - if extract_families: - to_remove = extract_mobject_family_members( - to_remove, - use_z_index=self.renderer.camera.use_z_index, - ) - _list = getattr(self, mobject_list_name) - new_list = self.get_restructured_mobject_list(_list, to_remove) - setattr(self, mobject_list_name, new_list) + self.add(*filter(lambda m: isinstance(m, Mobject), values)) return self - def get_restructured_mobject_list(self, mobjects: list, to_remove: list): - """ - Given a list of mobjects and a list of mobjects to be removed, this - filters out the removable mobjects from the list of mobjects. - - Parameters - ---------- - - mobjects - The Mobjects to check. - - to_remove - The list of mobjects to remove. - - Returns - ------- - list - The list of mobjects with the mobjects to remove removed. - """ - - new_mobjects = [] - - def add_safe_mobjects_from_list(list_to_examine, set_to_remove): - for mob in list_to_examine: - if mob in set_to_remove: - continue - intersect = set_to_remove.intersection(mob.get_family()) - if intersect: - add_safe_mobjects_from_list(mob.submobjects, intersect) - else: - new_mobjects.append(mob) - - add_safe_mobjects_from_list(mobjects, set(to_remove)) - return new_mobjects - - # TODO, remove this, and calls to this - def add_foreground_mobjects(self, *mobjects: Mobject): - """ - Adds mobjects to the foreground, and internally to the list - foreground_mobjects, and mobjects. - - Parameters - ---------- - *mobjects - The Mobjects to add to the foreground. - - Returns - ------ - Scene - The Scene, with the foreground mobjects added. - """ - self.foreground_mobjects = list_update(self.foreground_mobjects, mobjects) - self.add(*mobjects) + def replace(self, mobject: Mobject, *replacements: Mobject): + if mobject in self.mobjects: + index = self.mobjects.index(mobject) + self.mobjects = [ + *self.mobjects[:index], + *replacements, + *self.mobjects[index + 1 :], + ] return self - def add_foreground_mobject(self, mobject: Mobject): - """ - Adds a single mobject to the foreground, and internally to the list - foreground_mobjects, and mobjects. - - Parameters - ---------- - mobject - The Mobject to add to the foreground. - - Returns - ------ - Scene - The Scene, with the foreground mobject added. - """ - return self.add_foreground_mobjects(mobject) - - def remove_foreground_mobjects(self, *to_remove: Mobject): + def remove(self, *mobjects_to_remove: Mobject): """ - Removes mobjects from the foreground, and internally from the list - foreground_mobjects. - - Parameters - ---------- - *to_remove - The mobject(s) to remove from the foreground. - - Returns - ------ - Scene - The Scene, with the foreground mobjects removed. - """ - self.restructure_mobjects(to_remove, "foreground_mobjects") - return self + Removes anything in mobjects from scenes mobject list, but in the event that one + of the items to be removed is a member of the family of an item in mobject_list, + the other family members are added back into the list. - def remove_foreground_mobject(self, mobject: Mobject): - """ - Removes a single mobject from the foreground, and internally from the list - foreground_mobjects. - - Parameters - ---------- - mobject - The mobject to remove from the foreground. - - Returns - ------ - Scene - The Scene, with the foreground mobject removed. + For example, if the scene includes Group(m1, m2, m3), and we call scene.remove(m1), + the desired behavior is for the scene to then include m2 and m3 (ungrouped). """ - return self.remove_foreground_mobjects(mobject) + to_remove = set(extract_mobject_family_members(mobjects_to_remove)) + new_mobjects, _ = recursive_mobject_remove(self.mobjects, to_remove) + self.mobjects = new_mobjects def bring_to_front(self, *mobjects: Mobject): - """ - Adds the passed mobjects to the scene again, - pushing them to he front of the scene. - - Parameters - ---------- - *mobjects - The mobject(s) to bring to the front of the scene. - - Returns - ------ - Scene - The Scene, with the mobjects brought to the front - of the scene. - """ self.add(*mobjects) return self def bring_to_back(self, *mobjects: Mobject): - """ - Removes the mobject from the scene and - adds them to the back of the scene. - - Parameters - ---------- - *mobjects - The mobject(s) to push to the back of the scene. - - Returns - ------ - Scene - The Scene, with the mobjects pushed to the back - of the scene. - """ self.remove(*mobjects) self.mobjects = list(mobjects) + self.mobjects return self def clear(self): - """ - Removes all mobjects present in self.mobjects - and self.foreground_mobjects from the scene. - - Returns - ------ - Scene - The Scene, with all of its mobjects in - self.mobjects and self.foreground_mobjects - removed. - """ self.mobjects = [] - self.foreground_mobjects = [] return self - def get_moving_mobjects(self, *animations: Animation): - """ - Gets all moving mobjects in the passed animation(s). - - Parameters - ---------- - *animations - The animations to check for moving mobjects. - - Returns - ------ - list - The list of mobjects that could be moving in - the Animation(s) - """ - # Go through mobjects from start to end, and - # as soon as there's one that needs updating of - # some kind per frame, return the list from that - # point forward. - animation_mobjects = [anim.mobject for anim in animations] - mobjects = self.get_mobject_family_members() - for i, mob in enumerate(mobjects): - update_possibilities = [ - mob in animation_mobjects, - len(mob.get_family_updaters()) > 0, - mob in self.foreground_mobjects, - ] - if any(update_possibilities): - return mobjects[i:] - return [] - - def get_moving_and_static_mobjects(self, animations): - all_mobjects = list_update(self.mobjects, self.foreground_mobjects) - all_mobject_families = extract_mobject_family_members( - all_mobjects, - use_z_index=self.renderer.camera.use_z_index, - only_those_with_points=True, - ) - moving_mobjects = self.get_moving_mobjects(*animations) - all_moving_mobject_families = extract_mobject_family_members( - moving_mobjects, - use_z_index=self.renderer.camera.use_z_index, - ) - static_mobjects = list_difference_update( - all_mobject_families, - all_moving_mobject_families, - ) - return all_moving_mobject_families, static_mobjects + def get_mobjects(self) -> list[Mobject]: + return list(self.mobjects) - def compile_animations(self, *args: Animation, **kwargs): - """ - Creates _MethodAnimations from any _AnimationBuilders and updates animation - kwargs with kwargs passed to play(). - - Parameters - ---------- - *args - Animations to be played. - **kwargs - Configuration for the call to play(). - - Returns - ------- - Tuple[:class:`Animation`] - Animations to be played. - """ - animations = [] - for arg in args: - try: - animations.append(prepare_animation(arg)) - except TypeError: - if inspect.ismethod(arg): - raise TypeError( - "Passing Mobject methods to Scene.play is no longer" - " supported. Use Mobject.animate instead.", - ) - else: - raise TypeError( - f"Unexpected argument {arg} passed to Scene.play().", - ) - - for animation in animations: - for k, v in kwargs.items(): - setattr(animation, k, v) - - return animations - - def _get_animation_time_progression( - self, animations: list[Animation], duration: float - ): - """ - You will hardly use this when making your own animations. - This method is for Manim's internal use. - - Uses :func:`~.get_time_progression` to obtain a - CommandLine ProgressBar whose ``fill_time`` is - dependent on the qualities of the passed Animation, - - Parameters - ---------- - animations - The list of animations to get - the time progression for. - - duration - duration of wait time - - Returns - ------- - time_progression - The CommandLine Progress Bar. - """ - if len(animations) == 1 and isinstance(animations[0], Wait): - stop_condition = animations[0].stop_condition - if stop_condition is not None: - time_progression = self.get_time_progression( - duration, - f"Waiting for {stop_condition.__name__}", - n_iterations=-1, # So it doesn't show % progress - override_skip_animations=True, - ) - else: - time_progression = self.get_time_progression( - duration, - f"Waiting {self.renderer.num_plays}", - ) - else: - time_progression = self.get_time_progression( - duration, - "".join( - [ - f"Animation {self.renderer.num_plays}: ", - str(animations[0]), - (", etc." if len(animations) > 1 else ""), - ], - ), - ) - return time_progression + def get_mobject_copies(self) -> list[Mobject]: + return [m.copy() for m in self.mobjects] - def get_time_progression( + def point_to_mobject( self, - run_time: float, - description, - n_iterations: int | None = None, - override_skip_animations: bool = False, - ): - """ - You will hardly use this when making your own animations. - This method is for Manim's internal use. - - Returns a CommandLine ProgressBar whose ``fill_time`` - is dependent on the ``run_time`` of an animation, - the iterations to perform in that animation - and a bool saying whether or not to consider - the skipped animations. - - Parameters - ---------- - run_time - The ``run_time`` of the animation. - - n_iterations - The number of iterations in the animation. - - override_skip_animations - Whether or not to show skipped animations in the progress bar. - - Returns - ------- - time_progression - The CommandLine Progress Bar. - """ - if self.renderer.skip_animations and not override_skip_animations: - times = [run_time] + point: np.ndarray, + search_set: Iterable[Mobject] | None = None, + buff: float = 0, + ) -> Mobject | None: + """ + E.g. if clicking on the scene, this returns the top layer mobject + under a given point + """ + if search_set is None: + search_set = self.mobjects + for mobject in reversed(search_set): + if mobject.is_point_touching(point, buff=buff): + return mobject + return None + + def get_group(self, *mobjects): + if all(isinstance(m, VMobject) for m in mobjects): + return VGroup(*mobjects) else: - step = 1 / config["frame_rate"] - times = np.arange(0, run_time, step) - time_progression = tqdm( - times, - desc=description, - total=n_iterations, - leave=config["progress_bar"] == "leave", - ascii=True if platform.system() == "Windows" else None, - disable=config["progress_bar"] == "none", + return Group(*mobjects) + + def id_to_mobject(self, id_value): + return self.id_to_mobject_map[id_value] + + def ids_to_group(self, *id_values): + return self.get_group( + *filter(lambda x: x is not None, map(self.id_to_mobject, id_values)) ) - return time_progression - def get_run_time(self, animations: list[Animation]): - """ - Gets the total run time for a list of animations. - - Parameters - ---------- - animations - A list of the animations whose total - ``run_time`` is to be calculated. - - Returns - ------- - float - The total ``run_time`` of all of the animations in the list. - """ + def i2g(self, *id_values): + return self.ids_to_group(*id_values) - if len(animations) == 1 and isinstance(animations[0], Wait): - if animations[0].stop_condition is not None: - return 0 - else: - return animations[0].duration + def i2m(self, id_value): + return self.id_to_mobject(id_value) - else: - return np.max([animation.run_time for animation in animations]) + # Related to skipping - def play( - self, - *args, - subcaption=None, - subcaption_duration=None, - subcaption_offset=0, - **kwargs, - ): - r"""Plays an animation in this scene. - - Parameters - ---------- - - args - Animations to be played. - subcaption - The content of the external subcaption that should - be added during the animation. - subcaption_duration - The duration for which the specified subcaption is - added. If ``None`` (the default), the run time of the - animation is taken. - subcaption_offset - An offset (in seconds) for the start time of the - added subcaption. - kwargs - All other keywords are passed to the renderer. + def update_skipping_status(self) -> None: + if (self.start_at_animation_number is not None) and ( + self.num_plays == self.start_at_animation_number + ): + self.skip_time = self.time + if not self.original_skipping_status: + self.stop_skipping() + if (self.end_at_animation_number is not None) and ( + self.num_plays >= self.end_at_animation_number + ): + raise EndScene() - """ - # Make sure this is running on the main thread - if threading.current_thread().name != "MainThread": - kwargs.update( - { - "subcaption": subcaption, - "subcaption_duration": subcaption_duration, - "subcaption_offset": subcaption_offset, - } - ) - self.queue.put( - ( - "play", - args, - kwargs, - ) - ) - return + def stop_skipping(self) -> None: + self.virtual_animation_start_time = self.time + self.skip_animations = False - start_time = self.renderer.time - self.renderer.play(self, *args, **kwargs) - run_time = self.renderer.time - start_time - if subcaption: - if subcaption_duration is None: - subcaption_duration = run_time - # The start of the subcaption needs to be offset by the - # run_time of the animation because it is added after - # the animation has already been played (and Scene.renderer.time - # has already been updated). - self.add_subcaption( - content=subcaption, - duration=subcaption_duration, - offset=-run_time + subcaption_offset, - ) + # Methods associated with running animations - def wait( + def get_time_progression( self, - duration: float = DEFAULT_WAIT_TIME, - stop_condition: Callable[[], bool] | None = None, - frozen_frame: bool | None = None, - ): - """Plays a "no operation" animation. - - Parameters - ---------- - duration - The run time of the animation. - stop_condition - A function without positional arguments that is evaluated every time - a frame is rendered. The animation only stops when the return value - of the function is truthy. Overrides any value passed to ``duration``. - frozen_frame - If True, updater functions are not evaluated, and the animation outputs - a frozen frame. If False, updater functions are called and frames - are rendered as usual. If None (the default), the scene tries to - determine whether or not the frame is frozen on its own. - - See also - -------- - :class:`.Wait`, :meth:`.should_mobjects_update` - """ - self.play( - Wait( - run_time=duration, - stop_condition=stop_condition, - frozen_frame=frozen_frame, - ) - ) + run_time: float, + n_iterations: int | None = None, + desc: str = "", + override_skip_animations: bool = False, + ) -> list[float] | np.ndarray | ProgressDisplay: + if self.skip_animations and not override_skip_animations: + return [run_time] - def pause(self, duration: float = DEFAULT_WAIT_TIME): - """Pauses the scene (i.e., displays a frozen frame). + times = np.arange(0, run_time, 1 / self.camera.fps) - This is an alias for :meth:`.wait` with ``frozen_frame`` - set to ``True``. + self.file_writer.set_progress_display_description(sub_desc=desc) - Parameters - ---------- - duration - The duration of the pause. + if self.show_animation_progress: + return ProgressDisplay( + times, + total=n_iterations, + leave=self.leave_progress_bars, + ascii=True if platform.system() == "Windows" else None, + desc=desc, + ) + else: + return times + + def get_run_time(self, animations: Iterable[Animation]) -> float: + return np.max([animation.get_run_time() for animation in animations]) + + def get_animation_time_progression( + self, animations: Iterable[Animation] + ) -> list[float] | np.ndarray | ProgressDisplay: + animations = list(animations) + run_time = self.get_run_time(animations) + description = f"{self.num_plays} {animations[0]}" + if len(animations) > 1: + description += ", etc." + time_progression = self.get_time_progression(run_time, desc=description) + return time_progression - See also - -------- - :meth:`.wait`, :class:`.Wait` - """ - self.wait(duration=duration, frozen_frame=True) + def get_wait_time_progression( + self, duration: float, stop_condition: Callable[[], bool] | None = None + ) -> list[float] | np.ndarray | ProgressDisplay: + kw = {"desc": f"{self.num_plays} Waiting"} + if stop_condition is not None: + kw["n_iterations"] = -1 # So it doesn't show % progress + kw["override_skip_animations"] = True + return self.get_time_progression(duration, **kw) - def wait_until(self, stop_condition: Callable[[], bool], max_time: float = 60): - """ - Like a wrapper for wait(). - You pass a function that determines whether to continue waiting, - and a max wait time if that is never fulfilled. + def pre_play(self): + if self.presenter_mode and self.num_plays == 0: + self.hold_loop() - Parameters - ---------- - stop_condition - The function whose boolean return value determines whether to continue waiting + self.update_skipping_status() - max_time - The maximum wait time in seconds, if the stop_condition is never fulfilled. - """ - self.wait(max_time, stop_condition=stop_condition) + if not self.skip_animations: + self.file_writer.begin_animation() - def compile_animation_data(self, *animations: Animation, **play_kwargs): - """Given a list of animations, compile the corresponding - static and moving mobjects, and gather the animation durations. + if self.window: + self.real_animation_start_time = time.time() + self.virtual_animation_start_time = self.time - This also begins the animations. + self.refresh_static_mobjects() - Parameters - ---------- - animations - Animation or mobject with mobject method and params - play_kwargs - Named parameters affecting what was passed in ``animations``, - e.g. ``run_time``, ``lag_ratio`` and so on. + def post_play(self): + if not self.skip_animations: + self.file_writer.end_animation() - Returns - ------- - self, None - None if there is nothing to play, or self otherwise. - """ - # NOTE TODO : returns statement of this method are wrong. It should return nothing, as it makes a little sense to get any information from this method. - # The return are kept to keep webgl renderer from breaking. - if len(animations) == 0: - raise ValueError("Called Scene.play with no animations") - - self.animations = self.compile_animations(*animations, **play_kwargs) - self.add_mobjects_from_animations(self.animations) - - self.last_t = 0 - self.stop_condition = None - self.moving_mobjects = [] - self.static_mobjects = [] - - if len(self.animations) == 1 and isinstance(self.animations[0], Wait): - if self.should_update_mobjects(): - self.update_mobjects(dt=0) # Any problems with this? - self.stop_condition = self.animations[0].stop_condition - else: - self.duration = self.animations[0].duration - # Static image logic when the wait is static is done by the renderer, not here. - self.animations[0].is_static_wait = True - return None - self.duration = self.get_run_time(self.animations) - return self + if self.skip_animations and self.window is not None: + # Show some quick frames along the way + self.update_frame(dt=0, ignore_skipping=True) - def begin_animations(self) -> None: - """Start the animations of the scene.""" - for animation in self.animations: - animation._setup_scene(self) - animation.begin() + self.num_plays += 1 - if config.renderer == RendererType.CAIRO: - # Paint all non-moving objects onto the screen, so they don't - # have to be rendered every frame - ( - self.moving_mobjects, - self.static_mobjects, - ) = self.get_moving_and_static_mobjects(self.animations) - - def is_current_animation_frozen_frame(self) -> bool: - """Returns whether the current animation produces a static frame (generally a Wait).""" - return ( - isinstance(self.animations[0], Wait) - and len(self.animations) == 1 - and self.animations[0].is_static_wait - ) + def refresh_static_mobjects(self) -> None: + self.camera.refresh_static_mobjects() - def play_internal(self, skip_rendering: bool = False): - """ - This method is used to prep the animations for rendering, - apply the arguments and parameters required to them, - render them, and write them to the video file. - - Parameters - ---------- - skip_rendering - Whether the rendering should be skipped, by default False - """ - self.duration = self.get_run_time(self.animations) - self.time_progression = self._get_animation_time_progression( - self.animations, - self.duration, - ) - for t in self.time_progression: - self.update_to_time(t) - if not skip_rendering and not self.skip_animation_preview: - self.renderer.render(self, t, self.moving_mobjects) - if self.stop_condition is not None and self.stop_condition(): - self.time_progression.close() - break - - for animation in self.animations: + def begin_animations(self, animations: Iterable[Animation]) -> None: + for animation in animations: + animation.begin() + # Anything animated that's not already in the + # scene gets added to the scene. Note, for + # animated mobjects that are in the family of + # those on screen, this can result in a restructuring + # of the scene.mobjects list, which is usually desired. + if animation.mobject not in self.mobjects: + self.add(animation.mobject) + + def progress_through_animations(self, animations: Iterable[Animation]) -> None: + last_t = 0 + for t in self.get_animation_time_progression(animations): + dt = t - last_t + last_t = t + for animation in animations: + animation.update_mobjects(dt) + alpha = t / animation.run_time + animation.interpolate(alpha) + self.update_frame(dt) + self.emit_frame() + + def finish_animations(self, animations: Iterable[Animation]) -> None: + for animation in animations: animation.finish() animation.clean_up_from_scene(self) - if not self.renderer.skip_animations: + if self.skip_animations: + self.update_mobjects(self.get_run_time(animations)) + else: self.update_mobjects(0) - self.renderer.static_image = None - # Closing the progress bar at the end of the play. - self.time_progression.close() - - def check_interactive_embed_is_valid(self): - if config["force_window"]: - return True - if self.skip_animation_preview: - logger.warning( - "Disabling interactive embed as 'skip_animation_preview' is enabled", - ) - return False - elif config["write_to_movie"]: - logger.warning("Disabling interactive embed as 'write_to_movie' is enabled") - return False - elif config["format"]: - logger.warning( - "Disabling interactive embed as '--format' is set as " - + config["format"], - ) - return False - elif not self.renderer.window: - logger.warning("Disabling interactive embed as no window was created") - return False - elif config.dry_run: - logger.warning("Disabling interactive embed as dry_run is enabled") - return False - return True - - def interactive_embed(self): - """ - Like embed(), but allows for screen interaction. - """ - if not self.check_interactive_embed_is_valid(): + + def play( + self, + *proto_animations: Animation | _AnimationBuilder, + run_time: float | None = None, + rate_func: Callable[[float], float] | None = None, + lag_ratio: float | None = None, + ) -> None: + if len(proto_animations) == 0: + log.warning("Called Scene.play with no animations") return - self.interactive_mode = True + animations = list(map(prepare_animation, proto_animations)) + for anim in animations: + anim.update_rate_info(run_time, rate_func, lag_ratio) + self.pre_play() + self.begin_animations(animations) + self.progress_through_animations(animations) + self.finish_animations(animations) + self.post_play() - def ipython(shell, namespace): - import manim.opengl + def wait( + self, + duration: float = DEFAULT_WAIT_TIME, + stop_condition: Callable[[], bool] = None, + note: str = None, + ignore_presenter_mode: bool = False, + ): + self.pre_play() + self.update_mobjects(dt=0) # Any problems with this? + if ( + self.presenter_mode + and not self.skip_animations + and not ignore_presenter_mode + ): + if note: + log.info(note) + self.hold_loop() + else: + time_progression = self.get_wait_time_progression(duration, stop_condition) + last_t = 0 + for t in time_progression: + dt = t - last_t + last_t = t + self.update_frame(dt) + self.emit_frame() + if stop_condition is not None and stop_condition(): + break + self.refresh_static_mobjects() + self.post_play() - def load_module_into_namespace(module, namespace): - for name in dir(module): - namespace[name] = getattr(module, name) + def hold_loop(self): + while self.hold_on_wait: + self.update_frame(dt=1 / self.camera.fps) + self.hold_on_wait = True - load_module_into_namespace(manim, namespace) - load_module_into_namespace(manim.opengl, namespace) + def wait_until(self, stop_condition: Callable[[], bool], max_time: float = 60): + self.wait(max_time, stop_condition=stop_condition) - def embedded_rerun(*args, **kwargs): - self.queue.put(("rerun_keyboard", args, kwargs)) - shell.exiter() + def force_skipping(self): + self.original_skipping_status = self.skip_animations + self.skip_animations = True + return self - namespace["rerun"] = embedded_rerun + def revert_to_original_skipping_status(self): + if hasattr(self, "original_skipping_status"): + self.skip_animations = self.original_skipping_status + return self - shell(local_ns=namespace) - self.queue.put(("exit_keyboard", [], {})) + def add_sound( + self, + sound_file: str, + time_offset: float = 0, + gain: float | None = None, + gain_to_background: float | None = None, + ): + if self.skip_animations: + return + time = self.get_time() + time_offset + self.file_writer.add_sound(sound_file, time, gain, gain_to_background) - def get_embedded_method(method_name): - return lambda *args, **kwargs: self.queue.put((method_name, args, kwargs)) + # Helpers for interactive development - local_namespace = inspect.currentframe().f_back.f_locals - for method in ("play", "wait", "add", "remove"): - embedded_method = get_embedded_method(method) - # Allow for calling scene methods without prepending 'self.'. - local_namespace[method] = embedded_method + def get_state(self) -> SceneState: + return SceneState(self) - from IPython.terminal.embed import InteractiveShellEmbed - from traitlets.config import Config + def restore_state(self, scene_state: SceneState): + scene_state.restore_scene(self) - cfg = Config() - cfg.TerminalInteractiveShell.confirm_exit = False - shell = InteractiveShellEmbed(config=cfg) + def save_state(self) -> None: + if not self.preview: + return + state = self.get_state() + if self.undo_stack and state.mobjects_match(self.undo_stack[-1]): + return + self.redo_stack = [] + self.undo_stack.append(state) + if len(self.undo_stack) > self.max_num_saved_states: + self.undo_stack.pop(0) + + def undo(self): + if self.undo_stack: + self.redo_stack.append(self.get_state()) + self.restore_state(self.undo_stack.pop()) + self.refresh_static_mobjects() + + def redo(self): + if self.redo_stack: + self.undo_stack.append(self.get_state()) + self.restore_state(self.redo_stack.pop()) + self.refresh_static_mobjects() + + def checkpoint_paste(self, skip: bool = False): + """ + Used during interactive development to run (or re-run) + a block of scene code. + + If the copied selection starts with a comment, this will + revert to the state of the scene the first time this function + was called on a block of code starting with that comment. + """ + shell = get_ipython() + if shell is None: + raise Exception( + "Scene.checkpoint_paste cannot be called outside of " + + "an ipython shell" + ) - keyboard_thread = threading.Thread( - target=ipython, - args=(shell, local_namespace), - ) - # run as daemon to kill thread when main thread exits - if not shell.pt_app: - keyboard_thread.daemon = True - keyboard_thread.start() - - if self.dearpygui_imported and config["enable_gui"]: - if not dpg.is_dearpygui_running(): - gui_thread = threading.Thread( - target=configure_pygui, - args=(self.renderer, self.widgets), - kwargs={"update": False}, - ) - gui_thread.start() + pasted = pyperclip.paste() + line0 = pasted.lstrip().split("\n")[0] + if line0.startswith("#"): + if line0 not in self.checkpoint_states: + self.checkpoint(line0) else: - configure_pygui(self.renderer, self.widgets, update=True) + self.revert_to_checkpoint(line0) - self.camera.model_matrix = self.camera.default_model_matrix + prev_skipping = self.skip_animations + self.skip_animations = skip - self.interact(shell, keyboard_thread) + shell.run_cell(pasted) - def interact(self, shell, keyboard_thread): - event_handler = RerunSceneHandler(self.queue) - file_observer = Observer() - file_observer.schedule(event_handler, config["input_file"], recursive=True) - file_observer.start() + self.skip_animations = prev_skipping - self.quit_interaction = False - keyboard_thread_needs_join = shell.pt_app is not None - assert self.queue.qsize() == 0 - - last_time = time.time() - while not (self.renderer.window.is_closing or self.quit_interaction): - if not self.queue.empty(): - tup = self.queue.get_nowait() - if tup[0].startswith("rerun"): - # Intentionally skip calling join() on the file thread to save time. - if not tup[0].endswith("keyboard"): - if shell.pt_app: - shell.pt_app.app.exit(exception=EOFError) - file_observer.unschedule_all() - raise RerunSceneException - keyboard_thread.join() - - kwargs = tup[2] - if "from_animation_number" in kwargs: - config["from_animation_number"] = kwargs[ - "from_animation_number" - ] - # # TODO: This option only makes sense if interactive_embed() is run at the - # # end of a scene by default. - # if "upto_animation_number" in kwargs: - # config["upto_animation_number"] = kwargs[ - # "upto_animation_number" - # ] - - keyboard_thread.join() - file_observer.unschedule_all() - raise RerunSceneException - elif tup[0].startswith("exit"): - # Intentionally skip calling join() on the file thread to save time. - if not tup[0].endswith("keyboard") and shell.pt_app: - shell.pt_app.app.exit(exception=EOFError) - keyboard_thread.join() - # Remove exit_keyboard from the queue if necessary. - while self.queue.qsize() > 0: - self.queue.get() - keyboard_thread_needs_join = False - break - else: - method, args, kwargs = tup - getattr(self, method)(*args, **kwargs) - else: - self.renderer.animation_start_time = 0 - dt = time.time() - last_time - last_time = time.time() - self.renderer.render(self, dt, self.moving_mobjects) - self.update_mobjects(dt) - self.update_meshes(dt) - self.update_self(dt) - - # Join the keyboard thread if necessary. - if shell is not None and keyboard_thread_needs_join: - shell.pt_app.app.exit(exception=EOFError) - keyboard_thread.join() - # Remove exit_keyboard from the queue if necessary. - while self.queue.qsize() > 0: - self.queue.get() - - file_observer.stop() - file_observer.join() - - if self.dearpygui_imported and config["enable_gui"]: - dpg.stop_dearpygui() - - if self.renderer.window.is_closing: - self.renderer.window.destroy() - - def embed(self): - if not config["preview"]: - logger.warning("Called embed() while no preview window is available.") - return - if config["write_to_movie"]: - logger.warning("embed() is skipped while writing to a file.") - return + def checkpoint(self, key: str): + self.checkpoint_states[key] = self.get_state() - self.renderer.animation_start_time = 0 - self.renderer.render(self, -1, self.moving_mobjects) + def revert_to_checkpoint(self, key: str): + if key not in self.checkpoint_states: + log.error(f"No checkpoint at {key}") + return + all_keys = list(self.checkpoint_states.keys()) + index = all_keys.index(key) + for later_key in all_keys[index + 1 :]: + self.checkpoint_states.pop(later_key) - # Configure IPython shell. - from IPython.terminal.embed import InteractiveShellEmbed + self.restore_state(self.checkpoint_states[key]) - shell = InteractiveShellEmbed() + def clear_checkpoints(self): + self.checkpoint_states = {} - # Have the frame update after each command - shell.events.register( - "post_run_cell", - lambda *a, **kw: self.renderer.render(self, -1, self.moving_mobjects), - ) - - # Use the locals of the caller as the local namespace - # once embedded, and add a few custom shortcuts. - local_ns = inspect.currentframe().f_back.f_locals - # local_ns["touch"] = self.interact - for method in ( - "play", - "wait", - "add", - "remove", - "interact", - # "clear", - # "save_state", - # "restore", - ): - local_ns[method] = getattr(self, method) - shell(local_ns=local_ns, stack_depth=2) - - # End scene when exiting an embed. - raise Exception("Exiting scene.") - - def update_to_time(self, t): - dt = t - self.last_t - self.last_t = t - for animation in self.animations: - animation.update_mobjects(dt) - alpha = t / animation.run_time - animation.interpolate(alpha) - self.update_mobjects(dt) - self.update_meshes(dt) - self.update_self(dt) - - def add_subcaption( - self, content: str, duration: float = 1, offset: float = 0 + def save_mobject_to_file( + self, mobject: Mobject, file_path: str | None = None ) -> None: - r"""Adds an entry in the corresponding subcaption file - at the current time stamp. - - The current time stamp is obtained from ``Scene.renderer.time``. + if file_path is None: + file_path = self.file_writer.get_saved_mobject_path(mobject) + if file_path is None: + return + mobject.save_to_file(file_path) + + def load_mobject(self, file_name): + if os.path.exists(file_name): + path = file_name + else: + directory = self.file_writer.get_saved_mobject_directory() + path = os.path.join(directory, file_name) + return Mobject.load(path) - Parameters - ---------- + def is_window_closing(self): + return self.window and (self.window.is_closing or self.quit_interaction) - content - The subcaption content. - duration - The duration (in seconds) for which the subcaption is shown. - offset - This offset (in seconds) is added to the starting time stamp - of the subcaption. + # Event handling - Examples - -------- + def on_mouse_motion(self, point: np.ndarray, d_point: np.ndarray) -> None: + self.mouse_point.move_to(point) - This example illustrates both possibilities for adding - subcaptions to Manimations:: + event_data = {"point": point, "d_point": d_point} + propagate_event = EVENT_DISPATCHER.dispatch( + EventType.MouseMotionEvent, **event_data + ) + if propagate_event is not None and propagate_event is False: + return - class SubcaptionExample(Scene): - def construct(self): - square = Square() - circle = Circle() + frame = self.camera.frame + # Handle perspective changes + if self.window.is_key_pressed(ord(PAN_3D_KEY)): + frame.increment_theta(-self.pan_sensitivity * d_point[0]) + frame.increment_phi(self.pan_sensitivity * d_point[1]) + # Handle frame movements + elif self.window.is_key_pressed(ord(FRAME_SHIFT_KEY)): + shift = -d_point + shift[0] *= frame.get_width() / 2 + shift[1] *= frame.get_height() / 2 + transform = frame.get_inverse_camera_rotation_matrix() + shift = np.dot(np.transpose(transform), shift) + frame.shift(shift) - # first option: via the add_subcaption method - self.add_subcaption("Hello square!", duration=1) - self.play(Create(square)) + def on_mouse_drag( + self, point: np.ndarray, d_point: np.ndarray, buttons: int, modifiers: int + ) -> None: + self.mouse_drag_point.move_to(point) - # second option: within the call to Scene.play - self.play( - Transform(square, circle), - subcaption="The square transforms." - ) + event_data = { + "point": point, + "d_point": d_point, + "buttons": buttons, + "modifiers": modifiers, + } + propagate_event = EVENT_DISPATCHER.dispatch( + EventType.MouseDragEvent, **event_data + ) + if propagate_event is not None and propagate_event is False: + return - """ - subtitle = srt.Subtitle( - index=len(self.renderer.file_writer.subcaptions), - content=content, - start=datetime.timedelta(seconds=self.renderer.time + offset), - end=datetime.timedelta(seconds=self.renderer.time + offset + duration), + def on_mouse_press(self, point: np.ndarray, button: int, mods: int) -> None: + self.mouse_drag_point.move_to(point) + event_data = {"point": point, "button": button, "mods": mods} + propagate_event = EVENT_DISPATCHER.dispatch( + EventType.MousePressEvent, **event_data ) - self.renderer.file_writer.subcaptions.append(subtitle) + if propagate_event is not None and propagate_event is False: + return - def add_sound( - self, - sound_file: str, - time_offset: float = 0, - gain: float | None = None, - **kwargs, - ): - """ - This method is used to add a sound to the animation. - - Parameters - ---------- - - sound_file - The path to the sound file. - time_offset - The offset in the sound file after which - the sound can be played. - gain - Amplification of the sound. - - Examples - -------- - .. manim:: SoundExample - :no_autoplay: - - class SoundExample(Scene): - # Source of sound under Creative Commons 0 License. https://freesound.org/people/Druminfected/sounds/250551/ - def construct(self): - dot = Dot().set_color(GREEN) - self.add_sound("click.wav") - self.add(dot) - self.wait() - self.add_sound("click.wav") - dot.set_color(BLUE) - self.wait() - self.add_sound("click.wav") - dot.set_color(RED) - self.wait() - - Download the resource for the previous example `here `_ . - """ - if self.renderer.skip_animations: + def on_mouse_release(self, point: np.ndarray, button: int, mods: int) -> None: + event_data = {"point": point, "button": button, "mods": mods} + propagate_event = EVENT_DISPATCHER.dispatch( + EventType.MouseReleaseEvent, **event_data + ) + if propagate_event is not None and propagate_event is False: return - time = self.renderer.time + time_offset - self.renderer.file_writer.add_sound(sound_file, time, gain, **kwargs) - def on_mouse_motion(self, point, d_point): - self.mouse_point.move_to(point) - if SHIFT_VALUE in self.renderer.pressed_keys: - shift = -d_point - shift[0] *= self.camera.get_width() / 2 - shift[1] *= self.camera.get_height() / 2 - transform = self.camera.inverse_rotation_matrix - shift = np.dot(np.transpose(transform), shift) - self.camera.shift(shift) + def on_mouse_scroll(self, point: np.ndarray, offset: np.ndarray) -> None: + event_data = {"point": point, "offset": offset} + propagate_event = EVENT_DISPATCHER.dispatch( + EventType.MouseScrollEvent, **event_data + ) + if propagate_event is not None and propagate_event is False: + return - def on_mouse_scroll(self, point, offset): - if not config.use_projection_stroke_shaders: - factor = 1 + np.arctan(-2.1 * offset[1]) - self.camera.scale(factor, about_point=self.camera_target) - self.mouse_scroll_orbit_controls(point, offset) + frame = self.camera.frame + if self.window.is_key_pressed(ord(ZOOM_KEY)): + factor = 1 + np.arctan(10 * offset[1]) + frame.scale(1 / factor, about_point=point) + else: + transform = frame.get_inverse_camera_rotation_matrix() + shift = np.dot(np.transpose(transform), offset) + frame.shift(-20.0 * shift) + + def on_key_release(self, symbol: int, modifiers: int) -> None: + event_data = {"symbol": symbol, "modifiers": modifiers} + propagate_event = EVENT_DISPATCHER.dispatch( + EventType.KeyReleaseEvent, **event_data + ) + if propagate_event is not None and propagate_event is False: + return - def on_key_press(self, symbol, modifiers): + def on_key_press(self, symbol: int, modifiers: int) -> None: try: char = chr(symbol) except OverflowError: - logger.warning("The value of the pressed key is too large.") + log.warning("The value of the pressed key is too large.") return - if char == "r": - self.camera.to_default_state() - self.camera_target = np.array([0, 0, 0], dtype=np.float32) - elif char == "q": + event_data = {"symbol": symbol, "modifiers": modifiers} + propagate_event = EVENT_DISPATCHER.dispatch( + EventType.KeyPressEvent, **event_data + ) + if propagate_event is not None and propagate_event is False: + return + + if char == RESET_FRAME_KEY: + self.play(self.camera.frame.animate.to_default_state()) + elif char == "z" and modifiers == COMMAND_MODIFIER: + self.undo() + elif char == "z" and modifiers == COMMAND_MODIFIER | SHIFT_MODIFIER: + self.redo() + # command + q + elif char == QUIT_KEY and modifiers == COMMAND_MODIFIER: self.quit_interaction = True - else: - if char in self.key_to_function_map: - self.key_to_function_map[char]() + # Space or right arrow + elif char == " " or symbol == ARROW_SYMBOLS[2]: + self.hold_on_wait = False - def on_key_release(self, symbol, modifiers): - pass + def on_resize(self, width: int, height: int) -> None: + self.camera.reset_pixel_shape(width, height) - def on_mouse_drag(self, point, d_point, buttons, modifiers): - self.mouse_drag_point.move_to(point) - if buttons == 1: - self.camera.increment_theta(-d_point[0]) - self.camera.increment_phi(d_point[1]) - elif buttons == 4: - camera_x_axis = self.camera.model_matrix[:3, 0] - horizontal_shift_vector = -d_point[0] * camera_x_axis - vertical_shift_vector = -d_point[1] * np.cross(OUT, camera_x_axis) - total_shift_vector = horizontal_shift_vector + vertical_shift_vector - self.camera.shift(1.1 * total_shift_vector) - - self.mouse_drag_orbit_controls(point, d_point, buttons, modifiers) - - def mouse_scroll_orbit_controls(self, point, offset): - camera_to_target = self.camera_target - self.camera.get_position() - camera_to_target *= np.sign(offset[1]) - shift_vector = 0.01 * camera_to_target - self.camera.model_matrix = ( - opengl.translation_matrix(*shift_vector) @ self.camera.model_matrix - ) + def on_show(self) -> None: + pass - def mouse_drag_orbit_controls(self, point, d_point, buttons, modifiers): - # Left click drag. - if buttons == 1: - # Translate to target the origin and rotate around the z axis. - self.camera.model_matrix = ( - opengl.rotation_matrix(z=-d_point[0]) - @ opengl.translation_matrix(*-self.camera_target) - @ self.camera.model_matrix - ) + def on_hide(self) -> None: + pass - # Rotation off of the z axis. - camera_position = self.camera.get_position() - camera_y_axis = self.camera.model_matrix[:3, 1] - axis_of_rotation = space_ops.normalize( - np.cross(camera_y_axis, camera_position), - ) - rotation_matrix = space_ops.rotation_matrix( - d_point[1], - axis_of_rotation, - homogeneous=True, - ) + def on_close(self) -> None: + pass - maximum_polar_angle = self.camera.maximum_polar_angle - minimum_polar_angle = self.camera.minimum_polar_angle - potential_camera_model_matrix = rotation_matrix @ self.camera.model_matrix - potential_camera_location = potential_camera_model_matrix[:3, 3] - potential_camera_y_axis = potential_camera_model_matrix[:3, 1] - sign = ( - np.sign(potential_camera_y_axis[2]) - if potential_camera_y_axis[2] != 0 - else 1 - ) - potential_polar_angle = sign * np.arccos( - potential_camera_location[2] - / np.linalg.norm(potential_camera_location), - ) - if minimum_polar_angle <= potential_polar_angle <= maximum_polar_angle: - self.camera.model_matrix = potential_camera_model_matrix +class SceneState: + def __init__(self, scene: Scene, ignore: list[Mobject] | None = None): + self.time = scene.time + self.num_plays = scene.num_plays + self.mobjects_to_copies = OrderedDict.fromkeys(scene.mobjects) + if ignore: + for mob in ignore: + self.mobjects_to_copies.pop(mob, None) + + last_m2c = scene.undo_stack[-1].mobjects_to_copies if scene.undo_stack else {} + for mob in self.mobjects_to_copies: + # If it hasn't changed since the last state, just point to the + # same copy as before + if mob in last_m2c and last_m2c[mob].looks_identical(mob): + self.mobjects_to_copies[mob] = last_m2c[mob] else: - sign = np.sign(camera_y_axis[2]) if camera_y_axis[2] != 0 else 1 - current_polar_angle = sign * np.arccos( - camera_position[2] / np.linalg.norm(camera_position), - ) - if potential_polar_angle > maximum_polar_angle: - polar_angle_delta = maximum_polar_angle - current_polar_angle - else: - polar_angle_delta = minimum_polar_angle - current_polar_angle - rotation_matrix = space_ops.rotation_matrix( - polar_angle_delta, - axis_of_rotation, - homogeneous=True, - ) - self.camera.model_matrix = rotation_matrix @ self.camera.model_matrix - - # Translate to target the original target. - self.camera.model_matrix = ( - opengl.translation_matrix(*self.camera_target) - @ self.camera.model_matrix - ) - # Right click drag. - elif buttons == 4: - camera_x_axis = self.camera.model_matrix[:3, 0] - horizontal_shift_vector = -d_point[0] * camera_x_axis - vertical_shift_vector = -d_point[1] * np.cross(OUT, camera_x_axis) - total_shift_vector = horizontal_shift_vector + vertical_shift_vector - - self.camera.model_matrix = ( - opengl.translation_matrix(*total_shift_vector) - @ self.camera.model_matrix + self.mobjects_to_copies[mob] = mob.copy() + + def __eq__(self, state: SceneState): + return all( + ( + self.time == state.time, + self.num_plays == state.num_plays, + self.mobjects_to_copies == state.mobjects_to_copies, ) - self.camera_target += total_shift_vector + ) + + def mobjects_match(self, state: SceneState): + return self.mobjects_to_copies == state.mobjects_to_copies + + def n_changes(self, state: SceneState): + m2c = state.mobjects_to_copies + return sum( + 1 - int(mob in m2c and mob.looks_identical(m2c[mob])) + for mob in self.mobjects_to_copies + ) + + def restore_scene(self, scene: Scene): + scene.time = self.time + scene.num_plays = self.num_plays + scene.mobjects = [ + mob.become(mob_copy) for mob, mob_copy in self.mobjects_to_copies.items() + ] - def set_key_function(self, char, func): - self.key_to_function_map[char] = func - def on_mouse_press(self, point, button, modifiers): - for func in self.mouse_press_callbacks: - func() +class EndScene(Exception): + pass diff --git a/manim/utils/bezier.py b/manim/utils/bezier.py index ce5fff437f..8943bfd2a5 100644 --- a/manim/utils/bezier.py +++ b/manim/utils/bezier.py @@ -288,6 +288,37 @@ def match_interpolate( # Figuring out which bezier curves most smoothly connect a sequence of points +def get_smooth_quadratic_bezier_handle_points(points: FloatArray) -> FloatArray: + """ + Figuring out which bezier curves most smoothly connect a sequence of points. + + Given three successive points, P0, P1 and P2, you can compute that by defining + h = (1/4) P0 + P1 - (1/4)P2, the bezier curve defined by (P0, h, P1) will pass + through the point P2. + + So for a given set of four successive points, P0, P1, P2, P3, if we want to add + a handle point h between P1 and P2 so that the quadratic bezier (P1, h, P2) is + part of a smooth curve passing through all four points, we calculate one solution + for h that would produce a parbola passing through P3, call it smooth_to_right, and + another that would produce a parabola passing through P0, call it smooth_to_left, + and use the midpoint between the two. + """ + if len(points) == 2: + return midpoint(*points) + smooth_to_right, smooth_to_left = ( + 0.25 * ps[0:-2] + ps[1:-1] - 0.25 * ps[2:] for ps in (points, points[::-1]) + ) + if np.isclose(points[0], points[-1]).all(): + last_str = 0.25 * points[-2] + points[-1] - 0.25 * points[1] + last_stl = 0.25 * points[1] + points[0] - 0.25 * points[-2] + else: + last_str = smooth_to_left[0] + last_stl = smooth_to_right[0] + handles = 0.5 * np.vstack([smooth_to_right, [last_str]]) + handles += 0.5 * np.vstack([last_stl, smooth_to_left[::-1]]) + return handles + + def get_smooth_cubic_bezier_handle_points(points): points = np.array(points) num_handles = len(points) - 1 diff --git a/manim/utils/color.py b/manim/utils/color.py index 6356fb3f04..c48525a4ed 100644 --- a/manim/utils/color.py +++ b/manim/utils/color.py @@ -2,6 +2,8 @@ from __future__ import annotations +from manim.utils.iterables import resize_with_interpolation + __all__ = [ "color_to_rgb", "color_to_rgba", @@ -550,3 +552,28 @@ def get_shaded_rgb( factor *= 0.5 result = rgb + factor return result + + +COLORMAP_3B1B: list[Color] = [BLUE_E, GREEN, YELLOW, RED] + + +def get_colormap_list(map_name: str = "viridis", n_colors: int = 9) -> np.ndarray: + """ + Options for map_name: + 3b1b_colormap + magma + inferno + plasma + viridis + cividis + twilight + twilight_shifted + turbo + """ + from matplotlib.cm import get_cmap + + if map_name == "3b1b_colormap": + rgbs = np.array([color_to_rgb(color) for color in COLORMAP_3B1B]) + else: + rgbs = get_cmap(map_name).colors # Make more general? + return resize_with_interpolation(np.array(rgbs), n_colors) diff --git a/manim/utils/directories.py b/manim/utils/directories.py new file mode 100644 index 0000000000..e51f3c3c59 --- /dev/null +++ b/manim/utils/directories.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +import os + +from manim._config import config +from manim.utils.file_ops import guarantee_existence + + +def get_directories() -> dict[str, str]: + return config["directories"] + + +def get_temp_dir() -> str: + return get_directories()["temporary_storage"] + + +def get_tex_dir() -> str: + return guarantee_existence(os.path.join(get_temp_dir(), "Tex")) + + +def get_text_dir() -> str: + return guarantee_existence(os.path.join(get_temp_dir(), "Text")) + + +def get_mobject_data_dir() -> str: + return guarantee_existence(os.path.join(get_temp_dir(), "mobject_data")) + + +def get_downloads_dir() -> str: + return guarantee_existence(os.path.join(get_temp_dir(), "manim_downloads")) + + +def get_output_dir() -> str: + return guarantee_existence(get_directories()["output"]) + + +def get_raster_image_dir() -> str: + return get_directories()["raster_images"] + + +def get_vector_image_dir() -> str: + return get_directories()["vector_images"] + + +def get_sound_dir() -> str: + return get_directories()["sounds"] + + +def get_shader_dir() -> str: + return get_directories()["shaders"] diff --git a/manim/utils/file_ops.py b/manim/utils/file_ops.py index 1bbb048214..21bda0b8c6 100644 --- a/manim/utils/file_ops.py +++ b/manim/utils/file_ops.py @@ -27,8 +27,11 @@ from shutil import copyfile from typing import TYPE_CHECKING +import validators + if TYPE_CHECKING: from ..scene.scene_file_writer import SceneFileWriter + from typing import Iterable from manim import __version__, config, logger diff --git a/manim/utils/simple_functions.py b/manim/utils/simple_functions.py index 2a4a7afed6..c7f617bf59 100644 --- a/manim/utils/simple_functions.py +++ b/manim/utils/simple_functions.py @@ -117,6 +117,19 @@ def clip(a, min_a, max_a): return a +def fdiv( + a: Scalable, b: Scalable, zero_over_zero_value: Scalable | None = None +) -> Scalable: + if zero_over_zero_value is not None: + out = np.full_like(a, zero_over_zero_value) + where = np.logical_or(a != 0, b != 0) + else: + out = None + where = True + + return np.true_divide(a, b, out=out, where=where) + + def get_parameters(function: Callable) -> MappingProxyType[str, inspect.Parameter]: """Return the parameters of ``function`` as an ordered mapping of parameters' names to their corresponding ``Parameter`` objects. diff --git a/manim/utils/space_ops.py b/manim/utils/space_ops.py index 203462057a..43b8b140c1 100644 --- a/manim/utils/space_ops.py +++ b/manim/utils/space_ops.py @@ -285,6 +285,32 @@ def rotation_about_z(angle: float) -> np.ndarray: ) +def get_norm(vector: np.ndarray) -> float: + """Returns the norm of the vector. + + Parameters + ---------- + vector + The vector for which you want to find the norm. + + Returns + ------- + float + The norm of the vector. + """ + return np.linalg.norm(vector) + + +def normalize(vect: list[float], fall_back: list[float] | None = None) -> np.ndarray: + norm = get_norm(vect) + if norm > 0: + return np.array(vect) / norm + elif fall_back is not None: + return np.array(fall_back) + else: + return np.zeros(len(vect)) + + def z_to_vector(vector: np.ndarray) -> np.ndarray: """ Returns some matrix in SO(3) which takes the z-axis to the From 31cebcced1d4e33cb05a1f41bc4b17714d79d06b Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Tue, 3 Jan 2023 13:21:19 +0100 Subject: [PATCH 002/106] replace manimlib import --- manim/scene/scene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index a21f40a64b..21c81554c8 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -97,7 +97,7 @@ def __init__( # Initialize window, if applicable if self.preview: - from manimlib.window import Window + from manim.renderer.opengl_renderer_window import Window self.window = Window(scene=self, **self.window_config) self.camera_config["ctx"] = self.window.ctx From 59ab3925b75c1dda09db89edb07f02f6dec28470 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Tue, 3 Jan 2023 13:27:35 +0100 Subject: [PATCH 003/106] removed checkpoint feature (for now) --- manim/scene/scene.py | 51 +------------------------------------------- 1 file changed, 1 insertion(+), 50 deletions(-) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 21c81554c8..2e9a1a8eef 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -9,8 +9,6 @@ from typing import TYPE_CHECKING import numpy as np -import pyperclip -from IPython.core.getipython import get_ipython from IPython.terminal import pt_inputhooks from IPython.terminal.embed import InteractiveShellEmbed from tqdm import tqdm as ProgressDisplay @@ -114,7 +112,6 @@ def __init__( self.time: float = 0 self.skip_time: float = 0 self.original_skipping_status: bool = self.skip_animations - self.checkpoint_states: dict[str, list[tuple[Mobject, Mobject]]] = {} self.undo_stack = [] self.redo_stack = [] @@ -223,7 +220,6 @@ def embed( redo=self.redo, i2g=self.i2g, i2m=self.i2m, - checkpoint_paste=self.checkpoint_paste, ) # Enables gui interactions during the embed @@ -701,53 +697,8 @@ def redo(self): self.restore_state(self.redo_stack.pop()) self.refresh_static_mobjects() - def checkpoint_paste(self, skip: bool = False): - """ - Used during interactive development to run (or re-run) - a block of scene code. - - If the copied selection starts with a comment, this will - revert to the state of the scene the first time this function - was called on a block of code starting with that comment. - """ - shell = get_ipython() - if shell is None: - raise Exception( - "Scene.checkpoint_paste cannot be called outside of " - + "an ipython shell" - ) - - pasted = pyperclip.paste() - line0 = pasted.lstrip().split("\n")[0] - if line0.startswith("#"): - if line0 not in self.checkpoint_states: - self.checkpoint(line0) - else: - self.revert_to_checkpoint(line0) - - prev_skipping = self.skip_animations - self.skip_animations = skip - - shell.run_cell(pasted) - - self.skip_animations = prev_skipping - - def checkpoint(self, key: str): - self.checkpoint_states[key] = self.get_state() - - def revert_to_checkpoint(self, key: str): - if key not in self.checkpoint_states: - log.error(f"No checkpoint at {key}") - return - all_keys = list(self.checkpoint_states.keys()) - index = all_keys.index(key) - for later_key in all_keys[index + 1 :]: - self.checkpoint_states.pop(later_key) - - self.restore_state(self.checkpoint_states[key]) + # TODO: reimplement checkpoint feature with CE's section API - def clear_checkpoints(self): - self.checkpoint_states = {} def save_mobject_to_file( self, mobject: Mobject, file_path: str | None = None From 334f5d787793eed2cc5a212baa6b0a33d4fdb977 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Tue, 3 Jan 2023 13:27:49 +0100 Subject: [PATCH 004/106] added ipython as dependency --- poetry.lock | 59 +++++++++++++++++++++++++++++++++++--------------- pyproject.toml | 1 + 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/poetry.lock b/poetry.lock index 37cdd234fa..d7ad98bc91 100644 --- a/poetry.lock +++ b/poetry.lock @@ -38,7 +38,7 @@ name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, @@ -155,7 +155,7 @@ name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, @@ -206,7 +206,7 @@ name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, @@ -934,7 +934,7 @@ name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, @@ -1394,7 +1394,7 @@ name = "ipython" version = "8.7.0" description = "IPython: Productive Interactive Computing" category = "main" -optional = true +optional = false python-versions = ">=3.8" files = [ {file = "ipython-8.7.0-py3-none-any.whl", hash = "sha256:352042ddcb019f7c04e48171b4dd78e4c4bb67bf97030d170e154aac42b656d9"}, @@ -1493,7 +1493,7 @@ name = "jedi" version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." category = "main" -optional = true +optional = false python-versions = ">=3.6" files = [ {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, @@ -2120,13 +2120,14 @@ packaging = ">=20.0" pillow = ">=6.2.0" pyparsing = ">=2.2.1" python-dateutil = ">=2.7" +setuptools_scm = ">=7" [[package]] name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" category = "main" -optional = true +optional = false python-versions = ">=3.5" files = [ {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, @@ -2662,7 +2663,7 @@ name = "parso" version = "0.8.3" description = "A Python Parser" category = "main" -optional = true +optional = false python-versions = ">=3.6" files = [ {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, @@ -2690,7 +2691,7 @@ name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, @@ -2705,7 +2706,7 @@ name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, @@ -2871,7 +2872,7 @@ name = "prompt-toolkit" version = "3.0.36" description = "Library for building powerful interactive command lines in Python" category = "main" -optional = true +optional = false python-versions = ">=3.6.2" files = [ {file = "prompt_toolkit-3.0.36-py3-none-any.whl", hash = "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"}, @@ -2939,7 +2940,7 @@ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -2951,7 +2952,7 @@ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, @@ -3177,7 +3178,7 @@ files = [ cffi = ">=1.4.1" [package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +docs = ["sphinx (>=1.6.5)", "sphinx_rtd_theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] @@ -3767,6 +3768,28 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "setuptools-scm" +version = "7.1.0" +description = "the blessed package to manage your versions by scm tags" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools_scm-7.1.0-py3-none-any.whl", hash = "sha256:73988b6d848709e2af142aa48c986ea29592bbcfca5375678064708205253d8e"}, + {file = "setuptools_scm-7.1.0.tar.gz", hash = "sha256:6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27"}, +] + +[package.dependencies] +packaging = ">=20.0" +setuptools = "*" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +typing-extensions = "*" + +[package.extras] +test = ["pytest (>=6.2)", "virtualenv (>20)"] +toml = ["setuptools (>=42)"] + [[package]] name = "six" version = "1.16.0" @@ -4097,7 +4120,7 @@ name = "stack-data" version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, @@ -4247,7 +4270,7 @@ name = "traitlets" version = "5.6.0" description = "Traitlets Python configuration system" category = "main" -optional = true +optional = false python-versions = ">=3.7" files = [ {file = "traitlets-5.6.0-py3-none-any.whl", hash = "sha256:1410755385d778aed847d68deb99b3ba30fbbf489e17a1e8cbb753060d5cce73"}, @@ -4472,7 +4495,7 @@ name = "wcwidth" version = "0.2.5" description = "Measures the displayed width of unicode strings in a terminal" category = "main" -optional = true +optional = false python-versions = "*" files = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -4617,4 +4640,4 @@ jupyterlab = ["jupyterlab", "notebook"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "9df7ccd72cfd7f4a98b9a39546c11e4302f0390eecedd60882a8f4cdb7ffb22b" +content-hash = "2343a8347fc6b7e8b4f0d28bbb6cc74e1ea9bff65ce31a6a00b576f987fb71e8" diff --git a/pyproject.toml b/pyproject.toml index d8e4491d87..81e11cdd6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,6 +57,7 @@ screeninfo = "^0.8" Pygments = "^2.10.0" "backports.cached-property" = { version = "^1.0.1", python = "<3.8" } svgelements = "^1.8.0" +ipython = "^8.7.0" [tool.poetry.extras] jupyterlab = ["jupyterlab", "notebook"] From 120db6fceadef0e25535892751f1d29e729291e9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 12:29:35 +0000 Subject: [PATCH 005/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/scene/scene.py | 1 - 1 file changed, 1 deletion(-) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 2e9a1a8eef..195ab383a1 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -699,7 +699,6 @@ def redo(self): # TODO: reimplement checkpoint feature with CE's section API - def save_mobject_to_file( self, mobject: Mobject, file_path: str | None = None ) -> None: From 9f55388fea3cded2943a8b376d9818df236d5ec7 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Tue, 3 Jan 2023 15:14:30 +0100 Subject: [PATCH 006/106] fix imports: CLI works again (rendering doesn't yet) --- manim/animation/fading.py | 5 ++++- manim/constants.py | 2 -- manim/mobject/mobject.py | 39 +++++++++++++++++++++++++++++++++++++++ manim/scene/scene.py | 27 +++++++++++++-------------- manim/utils/family_ops.py | 26 ++++++++++++++++++++++++++ manim/utils/file_ops.py | 2 -- poetry.lock | 15 ++++++++++++++- pyproject.toml | 1 + 8 files changed, 97 insertions(+), 20 deletions(-) diff --git a/manim/animation/fading.py b/manim/animation/fading.py index 33f38a5027..eff1c67c52 100644 --- a/manim/animation/fading.py +++ b/manim/animation/fading.py @@ -21,13 +21,16 @@ def construct(self): ] import numpy as np +from typing import TYPE_CHECKING from manim.mobject.opengl.opengl_mobject import OpenGLMobject from ..animation.transform import Transform from ..constants import ORIGIN from ..mobject.mobject import Group, Mobject -from ..scene.scene import Scene + +if TYPE_CHECKING: + from ..scene import Scene class _Fade(Transform): diff --git a/manim/constants.py b/manim/constants.py index efbb86e1d4..e787584ecc 100644 --- a/manim/constants.py +++ b/manim/constants.py @@ -240,8 +240,6 @@ DEFAULT_QUALITY: str = "high_quality" EPILOG = "Made with <3 by Manim Community developers." -SHIFT_VALUE = 65505 -CTRL_VALUE = 65507 CONTEXT_SETTINGS = Context.settings( align_option_groups=True, diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 7b6515068c..dcb5f44108 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -2806,6 +2806,45 @@ def __init__(self, *mobjects, **kwargs): self.add(*mobjects) +class Point(Mobject): + def __init__( + self, + location: np.ndarray = ORIGIN, + artificial_width: float = 1e-6, + artificial_height: float = 1e-6, + **kwargs + ): + self.artificial_width = artificial_width + self.artificial_height = artificial_height + super().__init__(**kwargs) + self.set_location(location) + + @property + def width(self): + return self.artificial_width + + @property + def height(self): + return self.artificial_height + + # TODO: properties vs. getter methods? + + def get_width(self): + return self.artificial_width + + def get_height(self): + return self.artificial_height + + def get_location(self): + return self.points[0].copy() + + def get_bounding_box_point(self, *args, **kwargs): + return self.get_location() + + def set_location(self, new_loc): + self.set_points(np.array(new_loc, ndmin=2, dtype=float)) + + class _AnimationBuilder: def __init__(self, mobject): self.mobject = mobject diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 2e9a1a8eef..92fbde3e78 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -11,20 +11,15 @@ import numpy as np from IPython.terminal import pt_inputhooks from IPython.terminal.embed import InteractiveShellEmbed +from pyglet.window import key from tqdm import tqdm as ProgressDisplay from manim._config import logger as log from manim.animation.animation import prepare_animation -from manim.animation.fading import VFadeInThenOut from manim.camera.camera import Camera -from manim.config import get_module -from manim.constants import ( - ARROW_SYMBOLS, - COMMAND_MODIFIER, - DEFAULT_WAIT_TIME, - RED, - SHIFT_MODIFIER, -) +from manim.utils.color import RED +from manim.utils.module_ops import get_module +from manim.constants import DEFAULT_WAIT_TIME from manim.event_handler import EVENT_DISPATCHER from manim.event_handler.event_type import EventType from manim.mobject.frame import FullScreenRectangle @@ -43,6 +38,7 @@ from manim.animation.animation import Animation +## TODO: these keybindings should be made configureable PAN_3D_KEY = "d" FRAME_SHIFT_KEY = "f" @@ -260,7 +256,10 @@ def custom_exc(shell, etype, evalue, tb, tb_offset=None): os.system("printf '\a'") rect = FullScreenRectangle().set_stroke(RED, 30).set_fill(opacity=0) rect.fix_in_frame() - self.play(VFadeInThenOut(rect, run_time=0.5)) + + from manim.animation.fading import FadeIn + from manim.utils.rate_functions import there_and_back + self.play(FadeIn(rect, run_time=0.5, rate_func=there_and_back, remover=True)) shell.set_custom_exc((Exception,), custom_exc) @@ -821,15 +820,15 @@ def on_key_press(self, symbol: int, modifiers: int) -> None: if char == RESET_FRAME_KEY: self.play(self.camera.frame.animate.to_default_state()) - elif char == "z" and modifiers == COMMAND_MODIFIER: + elif char == "z" and modifiers == key.MOD_COMMAND: self.undo() - elif char == "z" and modifiers == COMMAND_MODIFIER | SHIFT_MODIFIER: + elif char == "z" and modifiers == key.MOD_COMMAND | key.MOD_SHIFT: self.redo() # command + q - elif char == QUIT_KEY and modifiers == COMMAND_MODIFIER: + elif char == QUIT_KEY and modifiers == key.MOD_COMMAND: self.quit_interaction = True # Space or right arrow - elif char == " " or symbol == ARROW_SYMBOLS[2]: + elif char == " " or symbol == key.RIGHT: self.hold_on_wait = False def on_resize(self, width: int, height: int) -> None: diff --git a/manim/utils/family_ops.py b/manim/utils/family_ops.py index 4a47e0591d..1aaebac270 100644 --- a/manim/utils/family_ops.py +++ b/manim/utils/family_ops.py @@ -35,3 +35,29 @@ def add_safe_mobjects_from_list(list_to_examine, set_to_remove): add_safe_mobjects_from_list(mobject_list, set(to_remove)) return new_list + + +def recursive_mobject_remove(mobjects: List[Mobject], to_remove: Set[Mobject]) -> Tuple[List[Mobject], bool]: + """ + Takes in a list of mobjects, together with a set of mobjects to remove. + The first component of what's removed is a new list such that any mobject + with one of the elements from `to_remove` in its family is no longer in + the list, and in its place are its family members which aren't in `to_remove` + The second component is a boolean value indicating whether any removals were made + """ + result = [] + found_in_list = False + for mob in mobjects: + if mob in to_remove: + found_in_list = True + continue + # Recursive call + sub_list, found_in_submobjects = recursive_mobject_remove( + mob.submobjects, to_remove + ) + if found_in_submobjects: + result.extend(sub_list) + found_in_list = True + else: + result.append(mob) + return result, found_in_list \ No newline at end of file diff --git a/manim/utils/file_ops.py b/manim/utils/file_ops.py index 21bda0b8c6..ea2701bca7 100644 --- a/manim/utils/file_ops.py +++ b/manim/utils/file_ops.py @@ -27,8 +27,6 @@ from shutil import copyfile from typing import TYPE_CHECKING -import validators - if TYPE_CHECKING: from ..scene.scene_file_writer import SceneFileWriter from typing import Iterable diff --git a/poetry.lock b/poetry.lock index d7ad98bc91..5a965a0430 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3218,6 +3218,19 @@ files = [ [package.dependencies] pyobjc-core = ">=9.0" +[[package]] +name = "pyopengl" +version = "3.1.6" +description = "Standard OpenGL bindings for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "PyOpenGL-3.1.6-py2-none-any.whl", hash = "sha256:57c597d989178e1413002df6b923619f6d29807501dece1c60cc6f12c0c8e8a7"}, + {file = "PyOpenGL-3.1.6-py3-none-any.whl", hash = "sha256:a7139bc3e15d656feae1f7e3ef68c799941ed43fadc78177a23db7e946c20738"}, + {file = "PyOpenGL-3.1.6.tar.gz", hash = "sha256:8ea6c8773927eda7405bffc6f5bb93be81569a7b05c8cac50cd94e969dce5e27"}, +] + [[package]] name = "pyparsing" version = "3.0.9" @@ -4640,4 +4653,4 @@ jupyterlab = ["jupyterlab", "notebook"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "2343a8347fc6b7e8b4f0d28bbb6cc74e1ea9bff65ce31a6a00b576f987fb71e8" +content-hash = "2bd894cf77fece8109391b2b9028f4671e414f244d4b9747766f2fe36bc588c0" diff --git a/pyproject.toml b/pyproject.toml index 81e11cdd6c..d2535ad243 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,6 +58,7 @@ Pygments = "^2.10.0" "backports.cached-property" = { version = "^1.0.1", python = "<3.8" } svgelements = "^1.8.0" ipython = "^8.7.0" +pyopengl = "^3.1.6" [tool.poetry.extras] jupyterlab = ["jupyterlab", "notebook"] From be45dcafa428b853eae26c1471c7a4d09c33fc4c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 14:15:44 +0000 Subject: [PATCH 007/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/animation/fading.py | 3 ++- manim/mobject/mobject.py | 2 +- manim/scene/scene.py | 9 ++++++--- manim/utils/family_ops.py | 6 ++++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/manim/animation/fading.py b/manim/animation/fading.py index eff1c67c52..fdfbfc27e8 100644 --- a/manim/animation/fading.py +++ b/manim/animation/fading.py @@ -20,9 +20,10 @@ def construct(self): "FadeIn", ] -import numpy as np from typing import TYPE_CHECKING +import numpy as np + from manim.mobject.opengl.opengl_mobject import OpenGLMobject from ..animation.transform import Transform diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index dcb5f44108..3d80171379 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -2812,7 +2812,7 @@ def __init__( location: np.ndarray = ORIGIN, artificial_width: float = 1e-6, artificial_height: float = 1e-6, - **kwargs + **kwargs, ): self.artificial_width = artificial_width self.artificial_height = artificial_height diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 59ead19144..cb2998463d 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -17,8 +17,6 @@ from manim._config import logger as log from manim.animation.animation import prepare_animation from manim.camera.camera import Camera -from manim.utils.color import RED -from manim.utils.module_ops import get_module from manim.constants import DEFAULT_WAIT_TIME from manim.event_handler import EVENT_DISPATCHER from manim.event_handler.event_type import EventType @@ -26,10 +24,12 @@ from manim.mobject.mobject import Group, Mobject, Point, _AnimationBuilder from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.scene.scene_file_writer import SceneFileWriter +from manim.utils.color import RED from manim.utils.family_ops import ( extract_mobject_family_members, recursive_mobject_remove, ) +from manim.utils.module_ops import get_module if TYPE_CHECKING: from typing import Callable, Iterable @@ -259,7 +259,10 @@ def custom_exc(shell, etype, evalue, tb, tb_offset=None): from manim.animation.fading import FadeIn from manim.utils.rate_functions import there_and_back - self.play(FadeIn(rect, run_time=0.5, rate_func=there_and_back, remover=True)) + + self.play( + FadeIn(rect, run_time=0.5, rate_func=there_and_back, remover=True) + ) shell.set_custom_exc((Exception,), custom_exc) diff --git a/manim/utils/family_ops.py b/manim/utils/family_ops.py index 1aaebac270..58f7ddf5b7 100644 --- a/manim/utils/family_ops.py +++ b/manim/utils/family_ops.py @@ -37,7 +37,9 @@ def add_safe_mobjects_from_list(list_to_examine, set_to_remove): return new_list -def recursive_mobject_remove(mobjects: List[Mobject], to_remove: Set[Mobject]) -> Tuple[List[Mobject], bool]: +def recursive_mobject_remove( + mobjects: List[Mobject], to_remove: Set[Mobject] +) -> Tuple[List[Mobject], bool]: """ Takes in a list of mobjects, together with a set of mobjects to remove. The first component of what's removed is a new list such that any mobject @@ -60,4 +62,4 @@ def recursive_mobject_remove(mobjects: List[Mobject], to_remove: Set[Mobject]) - found_in_list = True else: result.append(mob) - return result, found_in_list \ No newline at end of file + return result, found_in_list From e77e6c876629645bd3083692cf8185328e8c6d25 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Tue, 3 Jan 2023 17:07:29 +0100 Subject: [PATCH 008/106] removed a bunch of config.renderer comparisons --- manim/animation/transform.py | 14 +- manim/cli/render/commands.py | 9 +- manim/mobject/geometry/boolean_ops.py | 30 +- manim/mobject/geometry/line.py | 14 +- manim/mobject/graphing/coordinate_systems.py | 19 +- manim/mobject/table.py | 3 +- manim/mobject/text/tex_mobject.py | 6 - manim/mobject/text/text_mobject.py | 6 - manim/mobject/three_d/three_dimensions.py | 19 +- manim/mobject/utils.py | 107 ---- manim/mobject/vector_field.py | 5 +- manim/scene/scene_file_writer.py | 25 +- manim/scene/three_d_scene.py | 552 ------------------- manim/utils/ipython_magic.py | 12 +- manim/utils/space_ops.py | 50 +- 15 files changed, 62 insertions(+), 809 deletions(-) delete mode 100644 manim/mobject/utils.py delete mode 100644 manim/scene/three_d_scene.py diff --git a/manim/animation/transform.py b/manim/animation/transform.py index 20e5192fe0..cfd86073dd 100644 --- a/manim/animation/transform.py +++ b/manim/animation/transform.py @@ -197,10 +197,7 @@ def begin(self) -> None: self.target_copy = self.target_mobject.copy() # Note, this potentially changes the structure # of both mobject and target_mobject - if config.renderer == RendererType.OPENGL: - self.mobject.align_data_and_family(self.target_copy) - else: - self.mobject.align_data(self.target_copy) + self.mobject.align_data_and_family(self.target_copy) super().begin() def create_target(self) -> Mobject: @@ -228,9 +225,7 @@ def get_all_families_zipped(self) -> Iterable[tuple]: # more precise typing? self.starting_mobject, self.target_copy, ] - if config.renderer == RendererType.OPENGL: - return zip(*(mob.get_family() for mob in mobs)) - return zip(*(mob.family_members_with_points() for mob in mobs)) + return zip(*(mob.get_family() for mob in mobs)) def interpolate_submobject( self, @@ -836,10 +831,7 @@ def __init__(self, mobject, target_mobject, stretch=True, dim_to_match=1, **kwar self.stretch = stretch self.dim_to_match = dim_to_match mobject.save_state() - if config.renderer == RendererType.OPENGL: - group = OpenGLGroup(mobject, target_mobject.copy()) - else: - group = Group(mobject, target_mobject.copy()) + group = Group(mobject, target_mobject.copy()) super().__init__(group, **kwargs) def begin(self): diff --git a/manim/cli/render/commands.py b/manim/cli/render/commands.py index eca0091660..4aa13396eb 100644 --- a/manim/cli/render/commands.py +++ b/manim/cli/render/commands.py @@ -108,14 +108,7 @@ def __repr__(self): error_console.print_exception() sys.exit(1) else: - for SceneClass in scene_classes_from_file(file): - try: - with tempconfig({}): - scene = SceneClass() - scene.render() - except Exception: - error_console.print_exception() - sys.exit(1) + raise NotImplementedError if config.notify_outdated_version: manim_info_url = "https://pypi.org/pypi/manim/json" diff --git a/manim/mobject/geometry/boolean_ops.py b/manim/mobject/geometry/boolean_ops.py index 9d3ccf034c..35b8d84023 100644 --- a/manim/mobject/geometry/boolean_ops.py +++ b/manim/mobject/geometry/boolean_ops.py @@ -84,27 +84,15 @@ def _convert_vmobject_to_skia_path(self, vmobject: VMobject) -> SkiaPath: return path # In OpenGL it's quadratic beizer curves while on Cairo it's cubic... - if config.renderer == RendererType.OPENGL: - subpaths = vmobject.get_subpaths_from_points(points) - for subpath in subpaths: - quads = vmobject.get_bezier_tuples_from_points(subpath) - start = subpath[0] - path.moveTo(*start[:2]) - for p0, p1, p2 in quads: - path.quadTo(*p1[:2], *p2[:2]) - if vmobject.consider_points_equals(subpath[0], subpath[-1]): - path.close() - elif config.renderer == RendererType.CAIRO: - subpaths = vmobject.gen_subpaths_from_points_2d(points) - for subpath in subpaths: - quads = vmobject.gen_cubic_bezier_tuples_from_points(subpath) - start = subpath[0] - path.moveTo(*start[:2]) - for p0, p1, p2, p3 in quads: - path.cubicTo(*p1[:2], *p2[:2], *p3[:2]) - - if vmobject.consider_points_equals_2d(subpath[0], subpath[-1]): - path.close() + subpaths = vmobject.get_subpaths_from_points(points) + for subpath in subpaths: + quads = vmobject.get_bezier_tuples_from_points(subpath) + start = subpath[0] + path.moveTo(*start[:2]) + for p0, p1, p2 in quads: + path.quadTo(*p1[:2], *p2[:2]) + if vmobject.consider_points_equals(subpath[0], subpath[-1]): + path.close() return path diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index 695881ae9b..1879ef59f9 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -598,16 +598,10 @@ def get_default_tip_length(self) -> float: def _set_stroke_width_from_length(self): """Sets stroke width based on length.""" max_ratio = self.max_stroke_width_to_length_ratio - if config.renderer == RendererType.OPENGL: - self.set_stroke( - width=min(self.initial_stroke_width, max_ratio * self.get_length()), - recurse=False, - ) - else: - self.set_stroke( - width=min(self.initial_stroke_width, max_ratio * self.get_length()), - family=False, - ) + self.set_stroke( + width=min(self.initial_stroke_width, max_ratio * self.get_length()), + recurse=False, + ) return self diff --git a/manim/mobject/graphing/coordinate_systems.py b/manim/mobject/graphing/coordinate_systems.py index 03f96b838f..5c028b3b7d 100644 --- a/manim/mobject/graphing/coordinate_systems.py +++ b/manim/mobject/graphing/coordinate_systems.py @@ -874,21 +874,8 @@ def param_trig(u, v): ) self.add(axes, trig_plane) """ - if config.renderer == RendererType.CAIRO: + if config.renderer == RendererType.OPENGL: surface = Surface( - lambda u, v: self.c2p(u, v, function(u, v)), - u_range=u_range, - v_range=v_range, - **kwargs, - ) - if colorscale: - surface.set_fill_by_value( - axes=self.copy(), - colorscale=colorscale, - axis=colorscale_axis, - ) - elif config.renderer == RendererType.OPENGL: - surface = OpenGLSurface( lambda u, v: self.c2p(u, v, function(u, v)), u_range=u_range, v_range=v_range, @@ -897,6 +884,9 @@ def param_trig(u, v): colorscale_axis=colorscale_axis, **kwargs, ) + elif config.renderer == RendererType.CAIRO: + # TODO: CairoSurface? + raise NotImplementedError return surface @@ -2340,6 +2330,7 @@ def __init__( self.z_axis = z_axis if config.renderer == RendererType.CAIRO: + # TODO: check in how far these methods are supported by new VMobject class self._add_3d_pieces() self._set_axis_shading() diff --git a/manim/mobject/table.py b/manim/mobject/table.py index 7e8e45fca3..7a5023cc96 100644 --- a/manim/mobject/table.py +++ b/manim/mobject/table.py @@ -83,7 +83,6 @@ def construct(self): from ..animation.fading import FadeIn from ..mobject.types.vectorized_mobject import VGroup, VMobject from ..utils.color import BLACK, YELLOW -from .utils import get_vectorized_mobject_class class Table(VGroup): @@ -329,7 +328,7 @@ def _add_labels(self, mob_table: VGroup) -> VGroup: else: # Placeholder to use arrange_in_grid if top_left_entry is not set. # Import OpenGLVMobject to work with --renderer=opengl - dummy_mobject = get_vectorized_mobject_class()() + dummy_mobject = VMobject() col_labels = [dummy_mobject] + self.col_labels mob_table.insert(0, col_labels) else: diff --git a/manim/mobject/text/tex_mobject.py b/manim/mobject/text/tex_mobject.py index 92a4bd2cc2..c61df8395b 100644 --- a/manim/mobject/text/tex_mobject.py +++ b/manim/mobject/text/tex_mobject.py @@ -213,12 +213,6 @@ def _organize_submobjects_left_to_right(self): def get_tex_string(self): return self.tex_string - def init_colors(self, propagate_colors=True): - if config.renderer == RendererType.OPENGL: - super().init_colors() - elif config.renderer == RendererType.CAIRO: - super().init_colors(propagate_colors=propagate_colors) - class MathTex(SingleStringMathTex): r"""A string compiled with LaTeX in math mode. diff --git a/manim/mobject/text/text_mobject.py b/manim/mobject/text/text_mobject.py index 471e74c133..6c198a1a54 100644 --- a/manim/mobject/text/text_mobject.py +++ b/manim/mobject/text/text_mobject.py @@ -774,12 +774,6 @@ def _text2svg(self, color: Color): return svg_file - def init_colors(self, propagate_colors=True): - if config.renderer == RendererType.OPENGL: - super().init_colors() - elif config.renderer == RendererType.CAIRO: - super().init_colors(propagate_colors=propagate_colors) - class MarkupText(SVGMobject): r"""Display (non-LaTeX) text rendered using `Pango `_. diff --git a/manim/mobject/three_d/three_dimensions.py b/manim/mobject/three_d/three_dimensions.py index 6ee0371a07..e4f813b37f 100644 --- a/manim/mobject/three_d/three_dimensions.py +++ b/manim/mobject/three_d/three_dimensions.py @@ -315,10 +315,7 @@ def param_surface(u, v): new_colors[i], color_index, ) - if config.renderer == RendererType.OPENGL: - mob.set_color(mob_color, recurse=False) - elif config.renderer == RendererType.CAIRO: - mob.set_color(mob_color, family=False) + mob.set_color(mob_color, recurse=False) break return self @@ -787,12 +784,14 @@ def func(self, u: float, v: float) -> np.ndarray: def add_bases(self) -> None: """Adds the end caps of the cylinder.""" - if config.renderer == RendererType.OPENGL: - color = self.color - opacity = self.opacity - elif config.renderer == RendererType.CAIRO: - color = self.fill_color - opacity = self.fill_opacity + if config.renderer == RendererType.CAIRO: + # TODO: Surface should be made a separate mobject type + # (like it is for OpenGL) for the Cairo renderer too, + # to make them have the same interface. + raise NotImplementedError + + color = self.color + opacity = self.opacity self.base_top = Circle( radius=self.radius, diff --git a/manim/mobject/utils.py b/manim/mobject/utils.py deleted file mode 100644 index b38bb57f2e..0000000000 --- a/manim/mobject/utils.py +++ /dev/null @@ -1,107 +0,0 @@ -"""Utilities for working with mobjects.""" - -from __future__ import annotations - -__all__ = [ - "get_mobject_class", - "get_point_mobject_class", - "get_vectorized_mobject_class", -] - -from .._config import config -from ..constants import RendererType -from .mobject import Mobject -from .opengl.opengl_mobject import OpenGLMobject -from .opengl.opengl_point_cloud_mobject import OpenGLPMobject -from .opengl.opengl_vectorized_mobject import OpenGLVMobject -from .types.point_cloud_mobject import PMobject -from .types.vectorized_mobject import VMobject - - -def get_mobject_class() -> type: - """Gets the base mobject class, depending on the currently active renderer. - - .. NOTE:: - - This method is intended to be used in the code base of Manim itself - or in plugins where code should work independent of the selected - renderer. - - Examples - -------- - - The function has to be explicitly imported. We test that - the name of the returned class is one of the known mobject - base classes:: - - >>> from manim.mobject.utils import get_mobject_class - >>> get_mobject_class().__name__ in ['Mobject', 'OpenGLMobject'] - True - """ - if config.renderer == RendererType.CAIRO: - return Mobject - if config.renderer == RendererType.OPENGL: - return OpenGLMobject - raise NotImplementedError( - "Base mobjects are not implemented for the active renderer." - ) - - -def get_vectorized_mobject_class() -> type: - """Gets the vectorized mobject class, depending on the currently - active renderer. - - .. NOTE:: - - This method is intended to be used in the code base of Manim itself - or in plugins where code should work independent of the selected - renderer. - - Examples - -------- - - The function has to be explicitly imported. We test that - the name of the returned class is one of the known mobject - base classes:: - - >>> from manim.mobject.utils import get_vectorized_mobject_class - >>> get_vectorized_mobject_class().__name__ in ['VMobject', 'OpenGLVMobject'] - True - """ - if config.renderer == RendererType.CAIRO: - return VMobject - if config.renderer == RendererType.OPENGL: - return OpenGLVMobject - raise NotImplementedError( - "Vectorized mobjects are not implemented for the active renderer." - ) - - -def get_point_mobject_class() -> type: - """Gets the point cloud mobject class, depending on the currently - active renderer. - - .. NOTE:: - - This method is intended to be used in the code base of Manim itself - or in plugins where code should work independent of the selected - renderer. - - Examples - -------- - - The function has to be explicitly imported. We test that - the name of the returned class is one of the known mobject - base classes:: - - >>> from manim.mobject.utils import get_point_mobject_class - >>> get_point_mobject_class().__name__ in ['PMobject', 'OpenGLPMobject'] - True - """ - if config.renderer == RendererType.CAIRO: - return PMobject - if config.renderer == RendererType.OPENGL: - return OpenGLPMobject - raise NotImplementedError( - "Point cloud mobjects are not implemented for the active renderer." - ) diff --git a/manim/mobject/vector_field.py b/manim/mobject/vector_field.py index 14f2f64f32..028bf63bcd 100644 --- a/manim/mobject/vector_field.py +++ b/manim/mobject/vector_field.py @@ -27,8 +27,7 @@ from ..animation.indication import ShowPassingFlash from ..constants import OUT, RIGHT, UP, RendererType from ..mobject.mobject import Mobject -from ..mobject.types.vectorized_mobject import VGroup -from ..mobject.utils import get_vectorized_mobject_class +from ..mobject.types.vectorized_mobject import VGroup, VMobject from ..utils.bezier import interpolate, inverse_interpolate from ..utils.color import BLUE_E, GREEN, RED, YELLOW, color_to_rgb, rgb_to_color from ..utils.rate_functions import ease_out_sine, linear @@ -816,7 +815,7 @@ def outside_box(p): step = max_steps if not step: continue - line = get_vectorized_mobject_class()() + line = VMobject() line.duration = step * dt step = max(1, int(len(points) / self.max_anchors_per_line)) line.set_points_smoothly(points[::step]) diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 1891588675..663a328fda 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -373,7 +373,7 @@ def end_animation(self, allow_write: bool = False): if write_to_movie() and allow_write: self.close_movie_pipe() - def write_frame(self, frame_or_renderer: np.ndarray | OpenGLRenderer): + def write_frame(self, renderer: np.ndarray | OpenGLRenderer): """ Used internally by Manim to write a frame to the FFMPEG input buffer. @@ -383,16 +383,11 @@ def write_frame(self, frame_or_renderer: np.ndarray | OpenGLRenderer): frame_or_renderer Pixel array of the frame. """ - if config.renderer == RendererType.OPENGL: - self.write_opengl_frame(frame_or_renderer) - elif config.renderer == RendererType.CAIRO: - frame = frame_or_renderer - if write_to_movie(): - self.writing_process.stdin.write(frame.tobytes()) - if is_png_format() and not config["dry_run"]: - self.output_image_from_array(frame) - - def write_opengl_frame(self, renderer: OpenGLRenderer): + # TODO: this has to be changed: the argument passed should be a Camera, + # and the camera should have standardized methods for extracting an image + # or raw data to be passed to ffmpeg. + if config.renderer == RendererType.CAIRO: + raise NotImplementedError if write_to_movie(): self.writing_process.stdin.write( renderer.get_raw_frame_buffer_object_data(), @@ -480,11 +475,9 @@ def open_movie_pipe(self, file_path=None): fps = config["frame_rate"] if fps == int(fps): # fps is integer fps = int(fps) - if config.renderer == RendererType.OPENGL: - width, height = self.renderer.get_pixel_shape() - else: - height = config["pixel_height"] - width = config["pixel_width"] + + # TODO: renderer -> camera? reading from config might lead to inconsistencies + width, height = self.renderer.get_pixel_shape() command = [ config.ffmpeg_executable, diff --git a/manim/scene/three_d_scene.py b/manim/scene/three_d_scene.py deleted file mode 100644 index 4e619b7ffd..0000000000 --- a/manim/scene/three_d_scene.py +++ /dev/null @@ -1,552 +0,0 @@ -"""A scene suitable for rendering three-dimensional objects and animations.""" - -from __future__ import annotations - -__all__ = ["ThreeDScene", "SpecialThreeDScene"] - - -import warnings -from typing import Iterable, Sequence - -import numpy as np - -from manim.mobject.geometry.line import Line -from manim.mobject.graphing.coordinate_systems import ThreeDAxes -from manim.mobject.opengl.opengl_mobject import OpenGLMobject -from manim.mobject.three_d.three_dimensions import Sphere -from manim.mobject.value_tracker import ValueTracker - -from .. import config -from ..animation.animation import Animation -from ..animation.transform import Transform -from ..camera.three_d_camera import ThreeDCamera -from ..constants import DEGREES, RendererType -from ..mobject.mobject import Mobject -from ..mobject.types.vectorized_mobject import VectorizedPoint, VGroup -from ..renderer.opengl_renderer import OpenGLCamera -from ..scene.scene import Scene -from ..utils.config_ops import merge_dicts_recursively - - -class ThreeDScene(Scene): - """ - This is a Scene, with special configurations and properties that - make it suitable for Three Dimensional Scenes. - """ - - def __init__( - self, - camera_class=ThreeDCamera, - ambient_camera_rotation=None, - default_angled_camera_orientation_kwargs=None, - **kwargs, - ): - self.ambient_camera_rotation = ambient_camera_rotation - if default_angled_camera_orientation_kwargs is None: - default_angled_camera_orientation_kwargs = { - "phi": 70 * DEGREES, - "theta": -135 * DEGREES, - } - self.default_angled_camera_orientation_kwargs = ( - default_angled_camera_orientation_kwargs - ) - super().__init__(camera_class=camera_class, **kwargs) - - def set_camera_orientation( - self, - phi: float | None = None, - theta: float | None = None, - gamma: float | None = None, - zoom: float | None = None, - focal_distance: float | None = None, - frame_center: Mobject | Sequence[float] | None = None, - **kwargs, - ): - """ - This method sets the orientation of the camera in the scene. - - Parameters - ---------- - phi - The polar angle i.e the angle between Z_AXIS and Camera through ORIGIN in radians. - - theta - The azimuthal angle i.e the angle that spins the camera around the Z_AXIS. - - focal_distance - The focal_distance of the Camera. - - gamma - The rotation of the camera about the vector from the ORIGIN to the Camera. - - zoom - The zoom factor of the scene. - - frame_center - The new center of the camera frame in cartesian coordinates. - - """ - - if phi is not None: - self.renderer.camera.set_phi(phi) - if theta is not None: - self.renderer.camera.set_theta(theta) - if focal_distance is not None: - self.renderer.camera.set_focal_distance(focal_distance) - if gamma is not None: - self.renderer.camera.set_gamma(gamma) - if zoom is not None: - self.renderer.camera.set_zoom(zoom) - if frame_center is not None: - self.renderer.camera._frame_center.move_to(frame_center) - - def begin_ambient_camera_rotation(self, rate: float = 0.02, about: str = "theta"): - """ - This method begins an ambient rotation of the camera about the Z_AXIS, - in the anticlockwise direction - - Parameters - ---------- - rate - The rate at which the camera should rotate about the Z_AXIS. - Negative rate means clockwise rotation. - about - one of 3 options: ["theta", "phi", "gamma"]. defaults to theta. - """ - # TODO, use a ValueTracker for rate, so that it - # can begin and end smoothly - about: str = about.lower() - try: - if config.renderer == RendererType.CAIRO: - trackers = { - "theta": self.camera.theta_tracker, - "phi": self.camera.phi_tracker, - "gamma": self.camera.gamma_tracker, - } - x: ValueTracker = trackers[about] - x.add_updater(lambda m, dt: x.increment_value(rate * dt)) - self.add(x) - elif config.renderer == RendererType.OPENGL: - cam: OpenGLCamera = self.camera - methods = { - "theta": cam.increment_theta, - "phi": cam.increment_phi, - "gamma": cam.increment_gamma, - } - cam.add_updater(lambda m, dt: methods[about](rate * dt)) - self.add(self.camera) - except Exception: - raise ValueError("Invalid ambient rotation angle.") - - def stop_ambient_camera_rotation(self, about="theta"): - """ - This method stops all ambient camera rotation. - """ - about: str = about.lower() - try: - if config.renderer == RendererType.CAIRO: - trackers = { - "theta": self.camera.theta_tracker, - "phi": self.camera.phi_tracker, - "gamma": self.camera.gamma_tracker, - } - x: ValueTracker = trackers[about] - x.clear_updaters() - self.remove(x) - elif config.renderer == RendererType.OPENGL: - self.camera.clear_updaters() - except Exception: - raise ValueError("Invalid ambient rotation angle.") - - def begin_3dillusion_camera_rotation( - self, - rate: float = 1, - origin_phi: float | None = None, - origin_theta: float | None = None, - ): - """ - This method creates a 3D camera rotation illusion around - the current camera orientation. - - Parameters - ---------- - rate - The rate at which the camera rotation illusion should operate. - origin_phi - The polar angle the camera should move around. Defaults - to the current phi angle. - origin_theta - The azimutal angle the camera should move around. Defaults - to the current theta angle. - """ - if origin_theta is None: - origin_theta = self.renderer.camera.theta_tracker.get_value() - if origin_phi is None: - origin_phi = self.renderer.camera.phi_tracker.get_value() - - val_tracker_theta = ValueTracker(0) - - def update_theta(m, dt): - val_tracker_theta.increment_value(dt * rate) - val_for_left_right = 0.2 * np.sin(val_tracker_theta.get_value()) - return m.set_value(origin_theta + val_for_left_right) - - self.renderer.camera.theta_tracker.add_updater(update_theta) - self.add(self.renderer.camera.theta_tracker) - - val_tracker_phi = ValueTracker(0) - - def update_phi(m, dt): - val_tracker_phi.increment_value(dt * rate) - val_for_up_down = 0.1 * np.cos(val_tracker_phi.get_value()) - 0.1 - return m.set_value(origin_phi + val_for_up_down) - - self.renderer.camera.phi_tracker.add_updater(update_phi) - self.add(self.renderer.camera.phi_tracker) - - def stop_3dillusion_camera_rotation(self): - """ - This method stops all illusion camera rotations. - """ - self.renderer.camera.theta_tracker.clear_updaters() - self.remove(self.renderer.camera.theta_tracker) - self.renderer.camera.phi_tracker.clear_updaters() - self.remove(self.renderer.camera.phi_tracker) - - def move_camera( - self, - phi: float | None = None, - theta: float | None = None, - gamma: float | None = None, - zoom: float | None = None, - focal_distance: float | None = None, - frame_center: Mobject | Sequence[float] | None = None, - added_anims: Iterable[Animation] = [], - **kwargs, - ): - """ - This method animates the movement of the camera - to the given spherical coordinates. - - Parameters - ---------- - phi - The polar angle i.e the angle between Z_AXIS and Camera through ORIGIN in radians. - - theta - The azimuthal angle i.e the angle that spins the camera around the Z_AXIS. - - focal_distance - The radial focal_distance between ORIGIN and Camera. - - gamma - The rotation of the camera about the vector from the ORIGIN to the Camera. - - zoom - The zoom factor of the camera. - - frame_center - The new center of the camera frame in cartesian coordinates. - - added_anims - Any other animations to be played at the same time. - - """ - anims = [] - - if config.renderer == RendererType.CAIRO: - self.camera: ThreeDCamera - value_tracker_pairs = [ - (phi, self.camera.phi_tracker), - (theta, self.camera.theta_tracker), - (focal_distance, self.camera.focal_distance_tracker), - (gamma, self.camera.gamma_tracker), - (zoom, self.camera.zoom_tracker), - ] - for value, tracker in value_tracker_pairs: - if value is not None: - anims.append(tracker.animate.set_value(value)) - if frame_center is not None: - anims.append(self.camera._frame_center.animate.move_to(frame_center)) - elif config.renderer == RendererType.OPENGL: - cam: OpenGLCamera = self.camera - cam2 = cam.copy() - methods = { - "theta": cam2.set_theta, - "phi": cam2.set_phi, - "gamma": cam2.set_gamma, - "zoom": cam2.scale, - "frame_center": cam2.move_to, - } - if frame_center is not None: - if isinstance(frame_center, OpenGLMobject): - frame_center = frame_center.get_center() - frame_center = list(frame_center) - - for value, method in [ - [theta, "theta"], - [phi, "phi"], - [gamma, "gamma"], - [ - config.frame_height / (zoom * cam.height) - if zoom is not None - else None, - "zoom", - ], - [frame_center, "frame_center"], - ]: - if value is not None: - methods[method](value) - - if focal_distance is not None: - warnings.warn( - "focal distance of OpenGLCamera can not be adjusted.", - stacklevel=2, - ) - - anims += [Transform(cam, cam2)] - - self.play(*anims + added_anims, **kwargs) - - # These lines are added to improve performance. If manim thinks that frame_center is moving, - # it is required to redraw every object. These lines remove frame_center from the Scene once - # its animation is done, ensuring that manim does not think that it is moving. Since the - # frame_center is never actually drawn, this shouldn't break anything. - if frame_center is not None and config.renderer == RendererType.CAIRO: - self.remove(self.camera._frame_center) - - def get_moving_mobjects(self, *animations: Animation): - """ - This method returns a list of all of the Mobjects in the Scene that - are moving, that are also in the animations passed. - - Parameters - ---------- - *animations - The animations whose mobjects will be checked. - """ - moving_mobjects = super().get_moving_mobjects(*animations) - camera_mobjects = self.renderer.camera.get_value_trackers() + [ - self.renderer.camera._frame_center, - ] - if any([cm in moving_mobjects for cm in camera_mobjects]): - return self.mobjects - return moving_mobjects - - def add_fixed_orientation_mobjects(self, *mobjects: Mobject, **kwargs): - """ - This method is used to prevent the rotation and tilting - of mobjects as the camera moves around. The mobject can - still move in the x,y,z directions, but will always be - at the angle (relative to the camera) that it was at - when it was passed through this method.) - - Parameters - ---------- - *mobjects - The Mobject(s) whose orientation must be fixed. - - **kwargs - Some valid kwargs are - use_static_center_func : bool - center_func : function - """ - if config.renderer == RendererType.CAIRO: - self.add(*mobjects) - self.renderer.camera.add_fixed_orientation_mobjects(*mobjects, **kwargs) - elif config.renderer == RendererType.OPENGL: - for mob in mobjects: - mob: OpenGLMobject - mob.fix_orientation() - self.add(mob) - - def add_fixed_in_frame_mobjects(self, *mobjects: Mobject): - """ - This method is used to prevent the rotation and movement - of mobjects as the camera moves around. The mobject is - essentially overlaid, and is not impacted by the camera's - movement in any way. - - Parameters - ---------- - *mobjects - The Mobjects whose orientation must be fixed. - """ - if config.renderer == RendererType.CAIRO: - self.add(*mobjects) - self.camera: ThreeDCamera - self.camera.add_fixed_in_frame_mobjects(*mobjects) - elif config.renderer == RendererType.OPENGL: - for mob in mobjects: - mob: OpenGLMobject - mob.fix_in_frame() - self.add(mob) - - def remove_fixed_orientation_mobjects(self, *mobjects: Mobject): - """ - This method "unfixes" the orientation of the mobjects - passed, meaning they will no longer be at the same angle - relative to the camera. This only makes sense if the - mobject was passed through add_fixed_orientation_mobjects first. - - Parameters - ---------- - *mobjects - The Mobjects whose orientation must be unfixed. - """ - if config.renderer == RendererType.CAIRO: - self.renderer.camera.remove_fixed_orientation_mobjects(*mobjects) - elif config.renderer == RendererType.OPENGL: - for mob in mobjects: - mob: OpenGLMobject - mob.unfix_orientation() - self.remove(mob) - - def remove_fixed_in_frame_mobjects(self, *mobjects: Mobject): - """ - This method undoes what add_fixed_in_frame_mobjects does. - It allows the mobject to be affected by the movement of - the camera. - - Parameters - ---------- - *mobjects - The Mobjects whose position and orientation must be unfixed. - """ - if config.renderer == RendererType.CAIRO: - self.renderer.camera.remove_fixed_in_frame_mobjects(*mobjects) - elif config.renderer == RendererType.OPENGL: - for mob in mobjects: - mob: OpenGLMobject - mob.unfix_from_frame() - self.remove(mob) - - ## - def set_to_default_angled_camera_orientation(self, **kwargs): - """ - This method sets the default_angled_camera_orientation to the - keyword arguments passed, and sets the camera to that orientation. - - Parameters - ---------- - **kwargs - Some recognised kwargs are phi, theta, focal_distance, gamma, - which have the same meaning as the parameters in set_camera_orientation. - """ - config = dict( - self.default_camera_orientation_kwargs, - ) # Where doe this come from? - config.update(kwargs) - self.set_camera_orientation(**config) - - -class SpecialThreeDScene(ThreeDScene): - """An extension of :class:`ThreeDScene` with more settings. - - It has some extra configuration for axes, spheres, - and an override for low quality rendering. Further key differences - are: - - * The camera shades applicable 3DMobjects by default, - except if rendering in low quality. - * Some default params for Spheres and Axes have been added. - - """ - - def __init__( - self, - cut_axes_at_radius=True, - camera_config={"should_apply_shading": True, "exponential_projection": True}, - three_d_axes_config={ - "num_axis_pieces": 1, - "axis_config": { - "unit_size": 2, - "tick_frequency": 1, - "numbers_with_elongated_ticks": [0, 1, 2], - "stroke_width": 2, - }, - }, - sphere_config={"radius": 2, "resolution": (24, 48)}, - default_angled_camera_position={ - "phi": 70 * DEGREES, - "theta": -110 * DEGREES, - }, - # When scene is extracted with -l flag, this - # configuration will override the above configuration. - low_quality_config={ - "camera_config": {"should_apply_shading": False}, - "three_d_axes_config": {"num_axis_pieces": 1}, - "sphere_config": {"resolution": (12, 24)}, - }, - **kwargs, - ): - self.cut_axes_at_radius = cut_axes_at_radius - self.camera_config = camera_config - self.three_d_axes_config = three_d_axes_config - self.sphere_config = sphere_config - self.default_angled_camera_position = default_angled_camera_position - self.low_quality_config = low_quality_config - if self.renderer.camera_config["pixel_width"] == config["pixel_width"]: - _config = {} - else: - _config = self.low_quality_config - _config = merge_dicts_recursively(_config, kwargs) - super().__init__(**_config) - - def get_axes(self): - """Return a set of 3D axes. - - Returns - ------- - :class:`.ThreeDAxes` - A set of 3D axes. - """ - axes = ThreeDAxes(**self.three_d_axes_config) - for axis in axes: - if self.cut_axes_at_radius: - p0 = axis.get_start() - p1 = axis.number_to_point(-1) - p2 = axis.number_to_point(1) - p3 = axis.get_end() - new_pieces = VGroup(Line(p0, p1), Line(p1, p2), Line(p2, p3)) - for piece in new_pieces: - piece.shade_in_3d = True - new_pieces.match_style(axis.pieces) - axis.pieces.submobjects = new_pieces.submobjects - for tick in axis.tick_marks: - tick.add(VectorizedPoint(1.5 * tick.get_center())) - return axes - - def get_sphere(self, **kwargs): - """ - Returns a sphere with the passed keyword arguments as properties. - - Parameters - ---------- - **kwargs - Any valid parameter of :class:`~.Sphere` or :class:`~.Surface`. - - Returns - ------- - :class:`~.Sphere` - The sphere object. - """ - config = merge_dicts_recursively(self.sphere_config, kwargs) - return Sphere(**config) - - def get_default_camera_position(self): - """ - Returns the default_angled_camera position. - - Returns - ------- - dict - Dictionary of phi, theta, focal_distance, and gamma. - """ - return self.default_angled_camera_position - - def set_camera_to_default_position(self): - """ - Sets the camera to its default position. - """ - self.set_camera_orientation(**self.default_angled_camera_position) diff --git a/manim/utils/ipython_magic.py b/manim/utils/ipython_magic.py index c877cabd7f..c95e78a828 100644 --- a/manim/utils/ipython_magic.py +++ b/manim/utils/ipython_magic.py @@ -129,15 +129,9 @@ def construct(self): with tempconfig(local_ns.get("config", {})): config.digest_args(args) - renderer = None - if config.renderer == RendererType.OPENGL: - from manim.renderer.opengl_renderer import OpenGLRenderer - - renderer = OpenGLRenderer() - try: SceneClass = local_ns[config["scene_names"][0]] - scene = SceneClass(renderer=renderer) + scene = SceneClass() scene.render() finally: # Shader cache becomes invalid as the context is destroyed @@ -145,8 +139,8 @@ def construct(self): # Close OpenGL window here instead of waiting for the main thread to # finish causing the window to stay open and freeze - if renderer is not None and renderer.window is not None: - renderer.window.close() + if scene.window is not None: + scene.window.close() if config["output_file"] is None: logger.info("No output file produced") diff --git a/manim/utils/space_ops.py b/manim/utils/space_ops.py index 43b8b140c1..80e0c6e0bb 100644 --- a/manim/utils/space_ops.py +++ b/manim/utils/space_ops.py @@ -69,34 +69,19 @@ def quaternion_mult( Union[np.ndarray, List[Union[float, np.ndarray]]] Returns a list of product of two quaternions. """ - if config.renderer == RendererType.OPENGL: - if len(quats) == 0: - return [1, 0, 0, 0] - result = quats[0] - for next_quat in quats[1:]: - w1, x1, y1, z1 = result - w2, x2, y2, z2 = next_quat - result = [ - w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2, - w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2, - w1 * y2 + y1 * w2 + z1 * x2 - x1 * z2, - w1 * z2 + z1 * w2 + x1 * y2 - y1 * x2, - ] - return result - elif config.renderer == RendererType.CAIRO: - q1 = quats[0] - q2 = quats[1] - - w1, x1, y1, z1 = q1 - w2, x2, y2, z2 = q2 - return np.array( - [ - w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2, - w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2, - w1 * y2 + y1 * w2 + z1 * x2 - x1 * z2, - w1 * z2 + z1 * w2 + x1 * y2 - y1 * x2, - ], - ) + if len(quats) == 0: + return [1, 0, 0, 0] + result = quats[0] + for next_quat in quats[1:]: + w1, x1, y1, z1 = result + w2, x2, y2, z2 = next_quat + result = [ + w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2, + w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2, + w1 * y2 + y1 * w2 + z1 * x2 - x1 * z2, + w1 * z2 + z1 * w2 + x1 * y2 - y1 * x2, + ] + return result def quaternion_from_angle_axis( @@ -122,12 +107,9 @@ def quaternion_from_angle_axis( List[float] Gives back a quaternion from the angle and axis """ - if config.renderer == RendererType.OPENGL: - if not axis_normalized: - axis = normalize(axis) - return [math.cos(angle / 2), *(math.sin(angle / 2) * axis)] - elif config.renderer == RendererType.CAIRO: - return np.append(np.cos(angle / 2), np.sin(angle / 2) * normalize(axis)) + if not axis_normalized: + axis = normalize(axis) + return [math.cos(angle / 2), *(math.sin(angle / 2) * axis)] def angle_axis_from_quaternion(quaternion: Sequence[float]) -> Sequence[float]: From ed9e797b656ade3a60c5c8094ce6cedce3dd17ae Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Tue, 3 Jan 2023 17:09:30 +0100 Subject: [PATCH 009/106] removed renderer argument from scene class call --- manim/cli/render/commands.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/manim/cli/render/commands.py b/manim/cli/render/commands.py index 4aa13396eb..521f3406bc 100644 --- a/manim/cli/render/commands.py +++ b/manim/cli/render/commands.py @@ -85,18 +85,15 @@ def __repr__(self): config.digest_args(click_args) file = Path(config.input_file) if config.renderer == RendererType.OPENGL: - from manim.renderer.opengl_renderer import OpenGLRenderer - try: - renderer = OpenGLRenderer() keep_running = True while keep_running: for SceneClass in scene_classes_from_file(file): with tempconfig({}): - scene = SceneClass(renderer) + scene = SceneClass() rerun = scene.render() if rerun or config["write_all"]: - renderer.num_plays = 0 + scene.num_plays = 0 continue else: keep_running = False From 178778dce80c0c0036af288be49d87c4f572680b Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Tue, 3 Jan 2023 17:26:06 +0100 Subject: [PATCH 010/106] fix imports, again --- manim/__init__.py | 1 - manim/constants.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/manim/__init__.py b/manim/__init__.py index a697122752..8e2cc4f0c1 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -81,7 +81,6 @@ from .scene.scene import * from .scene.scene_file_writer import * from .scene.section import * -from .scene.three_d_scene import * from .scene.vector_space_scene import * from .scene.zoomed_scene import * from .utils import color, rate_functions, unit diff --git a/manim/constants.py b/manim/constants.py index e787584ecc..900ab3234c 100644 --- a/manim/constants.py +++ b/manim/constants.py @@ -69,8 +69,6 @@ "DEFAULT_QUALITY", "EPILOG", "CONTEXT_SETTINGS", - "SHIFT_VALUE", - "CTRL_VALUE", "RendererType", "LineJointType", ] From 3888d20c6c8f48a6e8a46b090c3ffb2689605408 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Tue, 3 Jan 2023 19:07:51 +0100 Subject: [PATCH 011/106] rendering a black screen works :-) --- manim/animation/animation.py | 11 + manim/renderer/opengl_renderer.py | 7 +- manim/renderer/opengl_renderer_window.py | 170 ++-- manim/scene/scene.py | 6 +- manim/scene/scene_file_writer.py | 987 +++++++++-------------- manim/utils/file_ops.py | 33 + 6 files changed, 520 insertions(+), 694 deletions(-) diff --git a/manim/animation/animation.py b/manim/animation/animation.py index c77af0cbf6..9d4e1efa55 100644 --- a/manim/animation/animation.py +++ b/manim/animation/animation.py @@ -183,6 +183,17 @@ def __str__(self) -> str: def __repr__(self) -> str: return str(self) + def update_rate_info( + self, + run_time: float | None = None, + rate_func: Callable[[float], float] | None = None, + lag_ratio: float | None = None, + ): + self.run_time = run_time or self.run_time + self.rate_func = rate_func or self.rate_func + self.lag_ratio = lag_ratio or self.lag_ratio + return self + def begin(self) -> None: """Begin the animation. diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 837f9aa819..b5b5eef395 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -295,12 +295,7 @@ def reset_pixel_shape(self, new_width: int, new_height: int) -> None: def get_raw_fbo_data(self, dtype: str = "f1") -> bytes: # Copy blocks from the fbo_msaa to the drawn fbo using Blit - pw, ph = (self.pixel_width, self.pixel_height) - gl.glBindFrameBuffer(gl.GL_READ_FRAMEBUFFER, self.fbo_msaa.glo) - gl.glBindFrameBuffer(gl.GL_DRAW_FRAMEBUFFER, self.fbo.glo) - gl.glBlitFramebuffer( - 0, 0, pw, ph, 0, 0, pw, ph, gl.GL_COLOR_BUFFER_BIT, gl.GL_LINEAR - ) + self.ctx.copy_framebuffer(self.fbo_msaa, self.fbo) return self.fbo.read( viewport=self.fbo.viewport, components=self.n_channels, diff --git a/manim/renderer/opengl_renderer_window.py b/manim/renderer/opengl_renderer_window.py index 14d913899c..aa48fe6869 100644 --- a/manim/renderer/opengl_renderer_window.py +++ b/manim/renderer/opengl_renderer_window.py @@ -1,21 +1,31 @@ from __future__ import annotations + import moderngl_window as mglw +import numpy as np + from moderngl_window.context.pyglet.window import Window as PygletWindow from moderngl_window.timers.clock import Timer from screeninfo import get_monitors +from typing import TYPE_CHECKING from .. import __version__, config +if TYPE_CHECKING: + import manim.scene as m_scene + class Window(PygletWindow): - fullscreen = False - resizable = True - gl_version = (3, 3) - vsync = True - cursor = True + fullscreen: bool = False + resizable: bool = True + gl_version: tuple[int, int] = (3, 3) + vsync: bool = True + cursor: bool = True + + def __init__(self, scene: m_scene.Scene, size=config.window_size): + # TODO: remove size argument from window init, + # move size computation below to config - def __init__(self, renderer, size=config.window_size, **kwargs): monitors = get_monitors() mon_index = config.window_monitor monitor = monitors[min(mon_index, len(monitors) - 1)] @@ -38,71 +48,33 @@ def __init__(self, renderer, size=config.window_size, **kwargs): super().__init__(size=size) - self.title = f"Manim Community {__version__}" + self.scene = scene + self.pressed_keys = set() + self.title = self.title = f"Manim Community {__version__} - {str(scene)}" self.size = size - self.renderer = renderer mglw.activate_context(window=self) self.timer = Timer() self.config = mglw.WindowConfig(ctx=self.ctx, wnd=self, timer=self.timer) self.timer.start() - self.swap_buffers() - - initial_position = self.find_initial_position(size, monitor) + # No idea why, but when self.position is set once + # it sometimes doesn't actually change the position + # to the specified tuple on the rhs, but doing it + # twice seems to make it work. ¯\_(ツ)_/¯ + initial_position = self.find_initial_position(size) + self.position = initial_position self.position = initial_position - # Delegate event handling to scene. - def on_mouse_motion(self, x, y, dx, dy): - super().on_mouse_motion(x, y, dx, dy) - point = self.renderer.pixel_coords_to_space_coords(x, y) - d_point = self.renderer.pixel_coords_to_space_coords(dx, dy, relative=True) - self.renderer.scene.on_mouse_motion(point, d_point) - - def on_mouse_scroll(self, x, y, x_offset: float, y_offset: float): - super().on_mouse_scroll(x, y, x_offset, y_offset) - point = self.renderer.pixel_coords_to_space_coords(x, y) - offset = self.renderer.pixel_coords_to_space_coords( - x_offset, - y_offset, - relative=True, - ) - self.renderer.scene.on_mouse_scroll(point, offset) - - def on_key_press(self, symbol, modifiers): - self.renderer.pressed_keys.add(symbol) - super().on_key_press(symbol, modifiers) - self.renderer.scene.on_key_press(symbol, modifiers) - - def on_key_release(self, symbol, modifiers): - if symbol in self.renderer.pressed_keys: - self.renderer.pressed_keys.remove(symbol) - super().on_key_release(symbol, modifiers) - self.renderer.scene.on_key_release(symbol, modifiers) - - def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): - super().on_mouse_drag(x, y, dx, dy, buttons, modifiers) - point = self.renderer.pixel_coords_to_space_coords(x, y) - d_point = self.renderer.pixel_coords_to_space_coords(dx, dy, relative=True) - self.renderer.scene.on_mouse_drag(point, d_point, buttons, modifiers) - - def find_initial_position(self, size, monitor): + def find_initial_position(self, size: tuple[int, int]) -> tuple[int, int]: custom_position = config.window_position + monitors = get_monitors() + mon_index = config.window_monitor + monitor = monitors[min(mon_index, len(monitors) - 1)] window_width, window_height = size # Position might be specified with a string of the form # x,y for integers x and y - if len(custom_position) == 1: - raise ValueError( - "window_position must specify both Y and X positions (Y/X -> UR). Also accepts LEFT/RIGHT/ORIGIN/UP/DOWN.", - ) - # in the form Y/X (UR) - if custom_position in ["LEFT", "RIGHT"]: - custom_position = "O" + custom_position[0] - elif custom_position in ["UP", "DOWN"]: - custom_position = custom_position[0] + "O" - elif custom_position == "ORIGIN": - custom_position = "O" * 2 - elif "," in custom_position: + if "," in custom_position: return tuple(map(int, custom_position.split(","))) # Alternatively, it might be specified with a string like @@ -110,18 +82,80 @@ def find_initial_position(self, size, monitor): char_to_n = {"L": 0, "U": 0, "O": 1, "R": 2, "D": 2} width_diff = monitor.width - window_width height_diff = monitor.height - window_height - return ( monitor.x + char_to_n[custom_position[1]] * width_diff // 2, -monitor.y + char_to_n[custom_position[0]] * height_diff // 2, ) - def on_mouse_press(self, x, y, button, modifiers): - super().on_mouse_press(x, y, button, modifiers) - point = self.renderer.pixel_coords_to_space_coords(x, y) - mouse_button_map = { - 1: "LEFT", - 2: "MOUSE", - 4: "RIGHT", - } - self.renderer.scene.on_mouse_press(point, mouse_button_map[button], modifiers) + # Delegate event handling to scene + def pixel_coords_to_space_coords( + self, px: int, py: int, relative: bool = False + ) -> np.ndarray: + pw, ph = self.size + fw, fh = self.scene.camera.get_frame_shape() + fc = self.scene.camera.get_frame_center() + if relative: + return np.array([px / pw, py / ph, 0]) + else: + return np.array( + [fc[0] + px * fw / pw - fw / 2, fc[1] + py * fh / ph - fh / 2, 0] + ) + + def on_mouse_motion(self, x: int, y: int, dx: int, dy: int) -> None: + super().on_mouse_motion(x, y, dx, dy) + point = self.pixel_coords_to_space_coords(x, y) + d_point = self.pixel_coords_to_space_coords(dx, dy, relative=True) + self.scene.on_mouse_motion(point, d_point) + + def on_mouse_drag( + self, x: int, y: int, dx: int, dy: int, buttons: int, modifiers: int + ) -> None: + super().on_mouse_drag(x, y, dx, dy, buttons, modifiers) + point = self.pixel_coords_to_space_coords(x, y) + d_point = self.pixel_coords_to_space_coords(dx, dy, relative=True) + self.scene.on_mouse_drag(point, d_point, buttons, modifiers) + + def on_mouse_press(self, x: int, y: int, button: int, mods: int) -> None: + super().on_mouse_press(x, y, button, mods) + point = self.pixel_coords_to_space_coords(x, y) + self.scene.on_mouse_press(point, button, mods) + + def on_mouse_release(self, x: int, y: int, button: int, mods: int) -> None: + super().on_mouse_release(x, y, button, mods) + point = self.pixel_coords_to_space_coords(x, y) + self.scene.on_mouse_release(point, button, mods) + + def on_mouse_scroll(self, x: int, y: int, x_offset: float, y_offset: float) -> None: + super().on_mouse_scroll(x, y, x_offset, y_offset) + point = self.pixel_coords_to_space_coords(x, y) + offset = self.pixel_coords_to_space_coords(x_offset, y_offset, relative=True) + self.scene.on_mouse_scroll(point, offset) + + def on_key_press(self, symbol: int, modifiers: int) -> None: + self.pressed_keys.add(symbol) # Modifiers? + super().on_key_press(symbol, modifiers) + self.scene.on_key_press(symbol, modifiers) + + def on_key_release(self, symbol: int, modifiers: int) -> None: + self.pressed_keys.difference_update({symbol}) # Modifiers? + super().on_key_release(symbol, modifiers) + self.scene.on_key_release(symbol, modifiers) + + def on_resize(self, width: int, height: int) -> None: + super().on_resize(width, height) + self.scene.on_resize(width, height) + + def on_show(self) -> None: + super().on_show() + self.scene.on_show() + + def on_hide(self) -> None: + super().on_hide() + self.scene.on_hide() + + def on_close(self) -> None: + super().on_close() + self.scene.on_close() + + def is_key_pressed(self, symbol: int) -> bool: + return symbol in self.pressed_keys diff --git a/manim/scene/scene.py b/manim/scene/scene.py index cb2998463d..9584705e36 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -16,7 +16,7 @@ from manim._config import logger as log from manim.animation.animation import prepare_animation -from manim.camera.camera import Camera +from manim.renderer.opengl_renderer import OpenGLCamera as Camera from manim.constants import DEFAULT_WAIT_TIME from manim.event_handler import EVENT_DISPATCHER from manim.event_handler.event_type import EventType @@ -101,7 +101,7 @@ def __init__( # Core state of the scene self.camera: Camera = Camera(**self.camera_config) - self.file_writer = SceneFileWriter(self, **self.file_writer_config) + self.file_writer = SceneFileWriter(self, str(self), **self.file_writer_config) self.mobjects: list[Mobject] = [self.camera.frame] self.id_to_mobject_map: dict[int, Mobject] = {} self.num_plays: int = 0 @@ -147,6 +147,8 @@ def run(self) -> None: self.file_writer.ended_with_interrupt = True self.tear_down() + render = run + def setup(self) -> None: """ This is meant to be implement by any scenes which diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 663a328fda..6e3d47bc79 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -1,272 +1,175 @@ -"""The interface between scenes and ffmpeg.""" - from __future__ import annotations -__all__ = ["SceneFileWriter"] - -import json import os +import platform import shutil -import subprocess -from pathlib import Path -from typing import TYPE_CHECKING, Any +import subprocess as sp +import sys import numpy as np -import srt -from PIL import Image +from pathlib import Path from pydub import AudioSegment +from tqdm import tqdm as ProgressDisplay -from manim import __version__ +from manim import config -from .. import config, logger -from .._config.logger_utils import set_file_logger -from ..constants import RendererType -from ..utils.file_ops import ( +from manim._config import logger as log +from manim.mobject.mobject import Mobject +from manim.utils.file_ops import ( add_extension_if_not_present, - add_version_before_extension, - ensure_executable, + get_sorted_integer_files, guarantee_existence, - is_gif_format, - is_png_format, - is_webm_format, - modify_atime, - write_to_movie, ) -from ..utils.sounds import get_full_sound_file_path -from .section import DefaultSectionType, Section - -if TYPE_CHECKING: - from manim.renderer.opengl_renderer import OpenGLRenderer - +from manim.utils.sounds import get_full_sound_file_path -class SceneFileWriter: - """ - SceneFileWriter is the object that actually writes the animations - played, into video files, using FFMPEG. - This is mostly for Manim's internal use. You will rarely, if ever, - have to use the methods for this class, unless tinkering with the very - fabric of Manim's reality. +from typing import TYPE_CHECKING - Attributes - ---------- - sections : list of :class:`.Section` - used to segment scene - - sections_output_dir : :class:`pathlib.Path` - where are section videos stored - - output_name : str - name of movie without extension and basis for section video names - - Some useful attributes are: - "write_to_movie" (bool=False) - Whether or not to write the animations into a video file. - "movie_file_extension" (str=".mp4") - The file-type extension of the outputted video. - "partial_movie_files" - List of all the partial-movie files. +if TYPE_CHECKING: + from PIL.Image import Image - """ + from manim.renderer.opengl_renderer import OpenGLCamera as Camera + from manim.scene import Scene - force_output_as_scene_name = False - def __init__(self, renderer, scene_name, **kwargs): - self.renderer = renderer - self.init_output_directories(scene_name) +class SceneFileWriter(object): + def __init__( + self, + scene: Scene, + write_to_movie: bool = False, + break_into_partial_movies: bool = False, + save_pngs: bool = False, # TODO, this currently does nothing + png_mode: str = "RGBA", + save_last_frame: bool = False, + movie_file_extension: str = ".mp4", + # What python file is generating this scene + input_file_path: str = "", + # Where should this be written + output_directory: str | None = None, + file_name: str | None = None, + open_file_upon_completion: bool = False, + show_file_location_upon_completion: bool = False, + quiet: bool = False, + total_frames: int = 0, + progress_description_len: int = 40, + ): + self.scene: Scene = scene + self.write_to_movie = write_to_movie + self.break_into_partial_movies = break_into_partial_movies + self.save_pngs = save_pngs + self.png_mode = png_mode + self.save_last_frame = save_last_frame + self.movie_file_extension = movie_file_extension + self.input_file_path = input_file_path + self.output_directory = output_directory + self.file_name = file_name + self.open_file_upon_completion = open_file_upon_completion + self.show_file_location_upon_completion = show_file_location_upon_completion + self.quiet = quiet + self.total_frames = total_frames + self.progress_description_len = progress_description_len + + # State during file writing + self.writing_process: sp.Popen | None = None + self.progress_display: ProgressDisplay | None = None + self.ended_with_interrupt: bool = False + self.init_output_directories() self.init_audio() - self.frame_count = 0 - self.partial_movie_files: list[str] = [] - self.subcaptions: list[srt.Subtitle] = [] - self.sections: list[Section] = [] - # first section gets automatically created for convenience - # if you need the first section to be skipped, add a first section by hand, it will replace this one - self.next_section( - name="autocreated", type=DefaultSectionType.NORMAL, skip_animations=False - ) - # fail fast if ffmpeg is not found - if not ensure_executable(Path(config.ffmpeg_executable)): - raise RuntimeError( - "Manim could not find ffmpeg, which is required for generating video output.\n" - "For installing ffmpeg please consult https://docs.manim.community/en/stable/installation.html\n" - "Make sure to either add ffmpeg to the PATH environment variable\n" - "or set path to the ffmpeg executable under the ffmpeg header in Manim's configuration." - ) - - def init_output_directories(self, scene_name): - """Initialise output directories. - - Notes - ----- - The directories are read from ``config``, for example - ``config['media_dir']``. If the target directories don't already - exist, they will be created. - - """ - if config["dry_run"]: # in dry-run mode there is no output - return - - if config["input_file"]: - module_name = config.get_dir("input_file").stem - else: - module_name = "" - - if SceneFileWriter.force_output_as_scene_name: - self.output_name = Path(scene_name) - elif config["output_file"] and not config["write_all"]: - self.output_name = config.get_dir("output_file") - else: - self.output_name = Path(scene_name) - - if config["media_dir"]: - image_dir = guarantee_existence( - config.get_dir( - "images_dir", module_name=module_name, scene_name=scene_name - ), - ) - self.image_file_path = image_dir / add_extension_if_not_present( - self.output_name, ".png" - ) - if write_to_movie(): - movie_dir = guarantee_existence( - config.get_dir( - "video_dir", module_name=module_name, scene_name=scene_name - ), + # Output directories and files + def init_output_directories(self) -> None: + out_dir = self.output_directory or "" + scene_name = Path(self.file_name or self.get_default_scene_name()) + if self.save_last_frame: + image_dir = guarantee_existence(Path(out_dir) / "images") + image_file = add_extension_if_not_present(scene_name, ".png") + self.image_file_path = Path(image_dir) / image_file + if self.write_to_movie: + movie_dir = guarantee_existence(Path(out_dir) / "videos") + movie_file = add_extension_if_not_present( + scene_name, self.movie_file_extension ) - self.movie_file_path = movie_dir / add_extension_if_not_present( - self.output_name, config["movie_file_extension"] - ) - - # TODO: /dev/null would be good in case sections_output_dir is used without bein set (doesn't work on Windows), everyone likes defensive programming, right? - self.sections_output_dir = Path("") - if config.save_sections: - self.sections_output_dir = guarantee_existence( - config.get_dir( - "sections_dir", module_name=module_name, scene_name=scene_name - ) - ) - - if is_gif_format(): - self.gif_file_path = add_extension_if_not_present( - self.output_name, ".gif" + self.movie_file_path = Path(movie_dir) / movie_file + if self.break_into_partial_movies: + self.partial_movie_directory = guarantee_existence( + Path(movie_dir) / "partial_movie_files" / scene_name, ) - - if not config["output_file"]: - self.gif_file_path = add_version_before_extension( - self.gif_file_path - ) - - self.gif_file_path = movie_dir / self.gif_file_path - - self.partial_movie_directory = guarantee_existence( - config.get_dir( - "partial_movie_dir", - scene_name=scene_name, - module_name=module_name, - ), - ) - - if config["log_to_file"]: - log_dir = guarantee_existence(config.get_dir("log_dir")) - set_file_logger( - scene_name=scene_name, module_name=module_name, log_dir=log_dir - ) - - def finish_last_section(self) -> None: - """Delete current section if it is empty.""" - if len(self.sections) and self.sections[-1].is_empty(): - self.sections.pop() - - def next_section(self, name: str, type: str, skip_animations: bool) -> None: - """Create segmentation cut here.""" - self.finish_last_section() - - # images don't support sections - section_video: str | None = None - # don't save when None - if ( - not config.dry_run - and write_to_movie() - and config.save_sections - and not skip_animations - ): - # relative to index file - section_video = f"{self.output_name}_{len(self.sections):04}{config.movie_file_extension}" - - self.sections.append( - Section( - type, - section_video, - name, - skip_animations, - ), + # A place to save mobjects + self.saved_mobject_directory = Path(out_dir) / "mobjects" / str(self.scene) + + def get_default_module_directory(self) -> str: + path, _ = os.path.splitext(self.input_file_path) + if path.startswith("_"): + path = path[1:] + return path + + def get_default_scene_name(self) -> str: + name = str(self.scene) + saan = self.scene.start_at_animation_number + eaan = self.scene.end_at_animation_number + if saan is not None: + name += f"_{saan}" + if eaan is not None: + name += f"_{eaan}" + return name + + def get_resolution_directory(self) -> str: + pixel_height = self.scene.camera.pixel_height + fps = self.scene.camera.fps + return "{}p{}".format(pixel_height, fps) + + # Directory getters + def get_image_file_path(self) -> str: + return self.image_file_path + + def get_next_partial_movie_path(self) -> str: + result = Path(self.partial_movie_directory) / "{:05}{}".format( + self.scene.num_plays, + self.movie_file_extension, ) - - def add_partial_movie_file(self, hash_animation: str): - """Adds a new partial movie file path to `scene.partial_movie_files` and current section from a hash. - This method will compute the path from the hash. In addition to that it adds the new animation to the current section. - - Parameters - ---------- - hash_animation - Hash of the animation. - """ - if not hasattr(self, "partial_movie_directory") or not write_to_movie(): - return - - # None has to be added to partial_movie_files to keep the right index with scene.num_plays. - # i.e if an animation is skipped, scene.num_plays is still incremented and we add an element to partial_movie_file be even with num_plays. - if hash_animation is None: - self.partial_movie_files.append(None) - self.sections[-1].partial_movie_files.append(None) + return result + + def get_movie_file_path(self) -> str: + return self.movie_file_path + + def get_saved_mobject_directory(self) -> str: + return guarantee_existence(self.saved_mobject_directory) + + def get_saved_mobject_path(self, mobject: Mobject) -> str | None: + directory = self.get_saved_mobject_directory() + files = os.listdir(directory) + default_name = str(mobject) + "_0.mob" + index = 0 + while default_name in files: + default_name = default_name.replace(str(index), str(index + 1)) + index += 1 + if platform.system() == "Darwin": + cmds = [ + "osascript", + "-e", + f""" + set chosenfile to (choose file name default name "{default_name}" default location "{directory}") + POSIX path of chosenfile + """, + ] + process = sp.Popen(cmds, stdout=sp.PIPE) + file_path = process.stdout.read().decode("utf-8").split("\n")[0] + if not file_path: + return else: - new_partial_movie_file = str( - self.partial_movie_directory - / f"{hash_animation}{config['movie_file_extension']}" - ) - self.partial_movie_files.append(new_partial_movie_file) - self.sections[-1].partial_movie_files.append(new_partial_movie_file) - - def get_resolution_directory(self): - """Get the name of the resolution directory directly containing - the video file. - - This method gets the name of the directory that immediately contains the - video file. This name is ``p``. - For example, if you are rendering an 854x480 px animation at 15fps, - the name of the directory that immediately contains the video, file - will be ``480p15``. - - The file structure should look something like:: - - MEDIA_DIR - |--Tex - |--texts - |--videos - |-- - |--p - |--.mp4 - - Returns - ------- - :class:`str` - The name of the directory. - """ - pixel_height = config["pixel_height"] - frame_rate = config["frame_rate"] - return f"{pixel_height}p{frame_rate}" + user_name = input(f"Enter mobject file name (default is {default_name}): ") + file_path = Path(directory) / (user_name or default_name) + if os.path.exists(file_path) or os.path.exists(file_path + ".mob"): + if input(f"{file_path} already exists. Overwrite (y/n)? ") != "y": + return + if not file_path.endswith(".mob"): + file_path = file_path + ".mob" + return file_path # Sound - def init_audio(self): - """ - Preps the writer for adding audio to the movie. - """ - self.includes_sound = False - - def create_audio_segment(self): - """ - Creates an empty, silent, Audio Segment. - """ + def init_audio(self) -> None: + self.includes_sound: bool = False + + def create_audio_segment(self) -> None: self.audio_segment = AudioSegment.silent() def add_audio_segment( @@ -274,23 +177,7 @@ def add_audio_segment( new_segment: AudioSegment, time: float | None = None, gain_to_background: float | None = None, - ): - """ - This method adds an audio segment from an - AudioSegment type object and suitable parameters. - - Parameters - ---------- - new_segment - The audio segment to add - - time - the timestamp at which the - sound should be added. - - gain_to_background - The gain of the segment from the background. - """ + ) -> None: if not self.includes_sound: self.includes_sound = True self.create_audio_segment() @@ -299,7 +186,7 @@ def add_audio_segment( if time is None: time = curr_end if time < 0: - raise ValueError("Adding sound at timestamp < 0") + raise Exception("Adding sound at timestamp < 0") new_end = time + new_segment.duration_seconds diff = new_end - curr_end @@ -319,165 +206,49 @@ def add_sound( sound_file: str, time: float | None = None, gain: float | None = None, - **kwargs, - ): - """ - This method adds an audio segment from a sound file. - - Parameters - ---------- - sound_file - The path to the sound file. - - time - The timestamp at which the audio should be added. - - gain - The gain of the given audio segment. - - **kwargs - This method uses add_audio_segment, so any keyword arguments - used there can be referenced here. - - """ + gain_to_background: float | None = None, + ) -> None: file_path = get_full_sound_file_path(sound_file) new_segment = AudioSegment.from_file(file_path) if gain: new_segment = new_segment.apply_gain(gain) - self.add_audio_segment(new_segment, time, **kwargs) + self.add_audio_segment(new_segment, time, gain_to_background) # Writers - def begin_animation(self, allow_write: bool = False, file_path=None): - """ - Used internally by manim to stream the animation to FFMPEG for - displaying or writing to a file. - - Parameters - ---------- - allow_write - Whether or not to write to a video file. - """ - if write_to_movie() and allow_write: - self.open_movie_pipe(file_path=file_path) - - def end_animation(self, allow_write: bool = False): - """ - Internally used by Manim to stop streaming to - FFMPEG gracefully. - - Parameters - ---------- - allow_write - Whether or not to write to a video file. - """ - if write_to_movie() and allow_write: - self.close_movie_pipe() + def begin(self) -> None: + if not self.break_into_partial_movies and self.write_to_movie: + self.open_movie_pipe(self.get_movie_file_path()) - def write_frame(self, renderer: np.ndarray | OpenGLRenderer): - """ - Used internally by Manim to write a frame to - the FFMPEG input buffer. - - Parameters - ---------- - frame_or_renderer - Pixel array of the frame. - """ - # TODO: this has to be changed: the argument passed should be a Camera, - # and the camera should have standardized methods for extracting an image - # or raw data to be passed to ffmpeg. - if config.renderer == RendererType.CAIRO: - raise NotImplementedError - if write_to_movie(): - self.writing_process.stdin.write( - renderer.get_raw_frame_buffer_object_data(), - ) - elif is_png_format() and not config["dry_run"]: - target_dir = self.image_file_path.parent / self.image_file_path.stem - extension = self.image_file_path.suffix - self.output_image( - renderer.get_image(), - target_dir, - extension, - config["zero_pad"], - ) + def begin_animation(self) -> None: + if self.break_into_partial_movies and self.write_to_movie: + self.open_movie_pipe(self.get_next_partial_movie_path()) - def output_image_from_array(self, frame_data): - target_dir = self.image_file_path.parent / self.image_file_path.stem - extension = self.image_file_path.suffix - self.output_image( - Image.fromarray(frame_data), - target_dir, - extension, - config["zero_pad"], - ) + def end_animation(self) -> None: + if self.break_into_partial_movies and self.write_to_movie: + self.close_movie_pipe() - def output_image(self, image: Image.Image, target_dir, ext, zero_pad: bool): - if zero_pad: - image.save(f"{target_dir}{str(self.frame_count).zfill(zero_pad)}{ext}") - else: - image.save(f"{target_dir}{self.frame_count}{ext}") - self.frame_count += 1 - - def save_final_image(self, image: np.ndarray): - """ - The name is a misnomer. This method saves the image - passed to it as an in the default image directory. - - Parameters - ---------- - image - The pixel array of the image to save. - """ - if config["dry_run"]: - return - if not config["output_file"]: - self.image_file_path = add_version_before_extension(self.image_file_path) - - image.save(self.image_file_path) - self.print_file_ready_message(self.image_file_path) - - def finish(self): - """ - Finishes writing to the FFMPEG buffer or writing images - to output directory. - Combines the partial movie files into the - whole scene. - If save_last_frame is True, saves the last - frame in the default image directory. - """ - if write_to_movie(): - if hasattr(self, "writing_process"): - self.writing_process.terminate() - self.combine_to_movie() - if config.save_sections: - self.combine_to_section_videos() - if config["flush_cache"]: - self.flush_cache_directory() + def finish(self) -> None: + if self.write_to_movie: + if self.break_into_partial_movies: + self.combine_movie_files() else: - self.clean_cache() - elif is_png_format() and not config["dry_run"]: - target_dir = self.image_file_path.parent / self.image_file_path.stem - logger.info("\n%i images ready at %s\n", self.frame_count, str(target_dir)) - if self.subcaptions: - self.write_subcaption_file() - - def open_movie_pipe(self, file_path=None): - """ - Used internally by Manim to initialise - FFMPEG and begin writing to FFMPEG's input - buffer. - """ - if file_path is None: - file_path = self.partial_movie_files[self.renderer.num_plays] - self.partial_movie_file_path = file_path - - fps = config["frame_rate"] - if fps == int(fps): # fps is integer - fps = int(fps) - - # TODO: renderer -> camera? reading from config might lead to inconsistencies - width, height = self.renderer.get_pixel_shape() + self.close_movie_pipe() + if self.includes_sound: + self.add_sound_to_video() + self.print_file_ready_message(self.get_movie_file_path()) + if self.save_last_frame: + self.scene.update_frame(ignore_skipping=True) + self.save_final_image(self.scene.get_image()) + if self.should_open_file(): + self.open_file() + + def open_movie_pipe(self, file_path: str) -> None: + stem, ext = os.path.splitext(file_path) + self.final_file_path = file_path + self.temp_file_path = stem + "_temp" + ext + + fps = self.scene.camera.fps + width, height = self.scene.camera.get_pixel_shape() command = [ config.ffmpeg_executable, @@ -485,81 +256,114 @@ def open_movie_pipe(self, file_path=None): "-f", "rawvideo", "-s", - "%dx%d" % (width, height), # size of one frame + f"{width}x{height}", # size of one frame "-pix_fmt", "rgba", "-r", str(fps), # frames per second "-i", "-", # The input comes from a pipe + "-vf", + "vflip", "-an", # Tells FFMPEG not to expect any audio "-loglevel", - config["ffmpeg_loglevel"].lower(), - "-metadata", - f"comment=Rendered with Manim Community v{__version__}", + "error", ] - if config.renderer == RendererType.OPENGL: - command += ["-vf", "vflip"] - if is_webm_format(): - command += ["-vcodec", "libvpx-vp9", "-auto-alt-ref", "0"] - # .mov format - elif config["transparent"]: - command += ["-vcodec", "qtrle"] + if self.movie_file_extension == ".mov": + # This is if the background of the exported + # video should be transparent. + command += [ + "-vcodec", + "prores_ks", + ] + elif self.movie_file_extension == ".gif": + command += [] + else: + command += [ + "-vcodec", + "libx264", + "-pix_fmt", + "yuv420p", + ] + command += [self.temp_file_path] + self.writing_process = sp.Popen(command, stdin=sp.PIPE) + + if self.total_frames > 0 and not self.quiet: + self.progress_display = ProgressDisplay( + range(self.total_frames), + # bar_format="{l_bar}{bar}|{n_fmt}/{total_fmt}", + leave=False, + ascii=True if platform.system() == "Windows" else None, + dynamic_ncols=True, + ) + self.set_progress_display_description() + + def has_progress_display(self): + return self.progress_display is not None + + def set_progress_display_description( + self, file: str = "", sub_desc: str = "" + ) -> None: + if self.progress_display is None: + return + + desc_len = self.progress_description_len + if not file: + file = os.path.split(self.get_movie_file_path())[1] + full_desc = f"{file} {sub_desc}" + if len(full_desc) > desc_len: + full_desc = full_desc[: desc_len - 3] + "..." else: - command += ["-vcodec", "libx264", "-pix_fmt", "yuv420p"] - command += [file_path] - self.writing_process = subprocess.Popen(command, stdin=subprocess.PIPE) - - def close_movie_pipe(self): - """ - Used internally by Manim to gracefully stop writing to FFMPEG's input buffer - """ + full_desc += " " * (desc_len - len(full_desc)) + self.progress_display.set_description(full_desc) + + def write_frame(self, camera: Camera) -> None: + if self.write_to_movie: + raw_bytes = camera.get_raw_fbo_data() + self.writing_process.stdin.write(raw_bytes) + if self.progress_display is not None: + self.progress_display.update() + + def close_movie_pipe(self) -> None: self.writing_process.stdin.close() self.writing_process.wait() + self.writing_process.terminate() + if self.progress_display is not None: + self.progress_display.close() - logger.info( - f"Animation {self.renderer.num_plays} : Partial movie file written in %(path)s", - {"path": f"'{self.partial_movie_file_path}'"}, + if not self.ended_with_interrupt: + shutil.move(self.temp_file_path, self.final_file_path) + else: + self.movie_file_path = self.temp_file_path + + def combine_movie_files(self) -> None: + kwargs = { + "remove_non_integer_files": True, + "extension": self.movie_file_extension, + } + if self.scene.start_at_animation_number is not None: + kwargs["min_index"] = self.scene.start_at_animation_number + if self.scene.end_at_animation_number is not None: + kwargs["max_index"] = self.scene.end_at_animation_number + else: + kwargs["remove_indices_greater_than"] = self.scene.num_plays - 1 + partial_movie_files = get_sorted_integer_files( + self.partial_movie_directory, **kwargs ) + if len(partial_movie_files) == 0: + log.warning("No animations in this scene") + return - def is_already_cached(self, hash_invocation: str): - """Will check if a file named with `hash_invocation` exists. - - Parameters - ---------- - hash_invocation - The hash corresponding to an invocation to either `scene.play` or `scene.wait`. - - Returns - ------- - :class:`bool` - Whether the file exists. - """ - if not hasattr(self, "partial_movie_directory") or not write_to_movie(): - return False - path = ( - self.partial_movie_directory - / f"{hash_invocation}{config['movie_file_extension']}" - ) - return path.exists() + # Write a file partial_file_list.txt containing all + # partial movie files + file_list = Path(self.partial_movie_directory) / "partial_movie_file_list.txt" + with open(file_list, "w") as fp: + for pf_path in partial_movie_files: + if os.name == "nt": + pf_path = pf_path.replace("\\", "/") + fp.write(f"file '{pf_path}'\n") - def combine_files( - self, - input_files: list[str], - output_file: Path, - create_gif=False, - includes_sound=False, - ): - file_list = self.partial_movie_directory / "partial_movie_file_list.txt" - logger.debug( - f"Partial movie files to combine ({len(input_files)} files): %(p)s", - {"p": input_files[:5]}, - ) - with file_list.open("w", encoding="utf-8") as fp: - fp.write("# This file is used internally by FFMPEG.\n") - for pf_path in input_files: - pf_path = Path(pf_path).as_posix() - fp.write(f"file 'file:{pf_path}'\n") + movie_file_path = self.get_movie_file_path() commands = [ config.ffmpeg_executable, "-y", # overwrite output file if it exists @@ -568,162 +372,109 @@ def combine_files( "-safe", "0", "-i", - str(file_list), + file_list, "-loglevel", - config.ffmpeg_loglevel.lower(), - "-metadata", - f"comment=Rendered with Manim Community v{__version__}", - "-nostdin", + "error", + "-c", + "copy", + movie_file_path, ] + if not self.includes_sound: + commands.insert(-1, "-an") - if create_gif: - commands += [ - "-vf", - f"fps={np.clip(config['frame_rate'], 1, 50)},split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle", - ] - else: - commands += ["-c", "copy"] - - if not includes_sound: - commands += ["-an"] - - commands += [str(output_file)] - - combine_process = subprocess.Popen(commands) + combine_process = sp.Popen(commands) combine_process.wait() - def combine_to_movie(self): - """Used internally by Manim to combine the separate - partial movie files that make up a Scene into a single - video file for that Scene. - """ - partial_movie_files = [el for el in self.partial_movie_files if el is not None] - # NOTE: Here we should do a check and raise an exception if partial - # movie file is empty. We can't, as a lot of stuff (in particular, in - # tests) use scene initialization, and this error would be raised as - # it's just an empty scene initialized. - - # determine output path - movie_file_path = self.movie_file_path - if is_gif_format(): - movie_file_path = self.gif_file_path - logger.info("Combining to Movie file.") - self.combine_files( - partial_movie_files, + def add_sound_to_video(self) -> None: + movie_file_path = self.get_movie_file_path() + stem, ext = os.path.splitext(movie_file_path) + sound_file_path = stem + ".wav" + # Makes sure sound file length will match video file + self.add_audio_segment(AudioSegment.silent(0)) + self.audio_segment.export( + sound_file_path, + bitrate="312k", + ) + temp_file_path = stem + "_temp" + ext + commands = [ + config.ffmpeg_executable, + "-i", movie_file_path, - is_gif_format(), - self.includes_sound, + "-i", + sound_file_path, + "-y", # overwrite output file if it exists + "-c:v", + "copy", + "-c:a", + "aac", + "-b:a", + "320k", + # select video stream from first file + "-map", + "0:v:0", + # select audio stream from second file + "-map", + "1:a:0", + "-loglevel", + "error", + # "-shortest", + temp_file_path, + ] + sp.call(commands) + shutil.move(temp_file_path, movie_file_path) + os.remove(sound_file_path) + + def save_final_image(self, image: Image) -> None: + file_path = self.get_image_file_path() + image.save(file_path) + self.print_file_ready_message(file_path) + + def print_file_ready_message(self, file_path: str) -> None: + if not self.quiet: + log.info(f"File ready at {file_path}") + + def should_open_file(self) -> bool: + return any( + [ + self.show_file_location_upon_completion, + self.open_file_upon_completion, + ] ) - # handle sound - if self.includes_sound: - sound_file_path = movie_file_path.with_suffix(".wav") - # Makes sure sound file length will match video file - self.add_audio_segment(AudioSegment.silent(0)) - self.audio_segment.export( - sound_file_path, - bitrate="312k", - ) - temp_file_path = movie_file_path.with_name( - f"{movie_file_path.stem}_temp{movie_file_path.suffix}" - ) - commands = [ - config.ffmpeg_executable, - "-i", - str(movie_file_path), - "-i", - str(sound_file_path), - "-y", # overwrite output file if it exists - "-c:v", - "copy", - "-c:a", - "aac", - "-b:a", - "320k", - # select video stream from first file - "-map", - "0:v:0", - # select audio stream from second file - "-map", - "1:a:0", - "-loglevel", - config.ffmpeg_loglevel.lower(), - "-metadata", - f"comment=Rendered with Manim Community v{__version__}", - # "-shortest", - str(temp_file_path), - ] - subprocess.call(commands) - shutil.move(str(temp_file_path), str(movie_file_path)) - sound_file_path.unlink() - - self.print_file_ready_message(str(movie_file_path)) - if write_to_movie(): - for file_path in partial_movie_files: - # We have to modify the accessed time so if we have to clean the cache we remove the one used the longest. - modify_atime(file_path) - - def combine_to_section_videos(self) -> None: - """Concatenate partial movie files for each section.""" - - self.finish_last_section() - sections_index: list[dict[str, Any]] = [] - for section in self.sections: - # only if section does want to be saved - if section.video is not None: - logger.info(f"Combining partial files for section '{section.name}'") - self.combine_files( - section.get_clean_partial_movie_files(), - self.sections_output_dir / section.video, - ) - sections_index.append(section.get_dict(self.sections_output_dir)) - with (self.sections_output_dir / f"{self.output_name}.json").open("w") as file: - json.dump(sections_index, file, indent=4) - - def clean_cache(self): - """Will clean the cache by removing the oldest partial_movie_files.""" - cached_partial_movies = [ - (self.partial_movie_directory / file_name) - for file_name in self.partial_movie_directory.iterdir() - if file_name != "partial_movie_file_list.txt" - ] - if len(cached_partial_movies) > config["max_files_cached"]: - number_files_to_delete = ( - len(cached_partial_movies) - config["max_files_cached"] - ) - oldest_files_to_delete = sorted( - cached_partial_movies, - key=os.path.getatime, - )[:number_files_to_delete] - # oldest_file_path = min(cached_partial_movies, key=os.path.getatime) - for file_to_delete in oldest_files_to_delete: - file_to_delete.unlink() - logger.info( - f"The partial movie directory is full (> {config['max_files_cached']} files). Therefore, manim has removed the {number_files_to_delete} oldest file(s)." - " You can change this behaviour by changing max_files_cached in config.", - ) + def open_file(self) -> None: + if self.quiet: + curr_stdout = sys.stdout + sys.stdout = open(os.devnull, "w") - def flush_cache_directory(self): - """Delete all the cached partial movie files""" - cached_partial_movies = [ - self.partial_movie_directory / file_name - for file_name in self.partial_movie_directory.iterdir() - if file_name != "partial_movie_file_list.txt" - ] - for f in cached_partial_movies: - f.unlink() - logger.info( - f"Cache flushed. {len(cached_partial_movies)} file(s) deleted in %(par_dir)s.", - {"par_dir": self.partial_movie_directory}, - ) + current_os = platform.system() + file_paths = [] - def write_subcaption_file(self): - """Writes the subcaption file.""" - subcaption_file = Path(config.output_file).with_suffix(".srt") - subcaption_file.write_text(srt.compose(self.subcaptions), encoding="utf-8") - logger.info(f"Subcaption file has been written as {subcaption_file}") + if self.save_last_frame: + file_paths.append(self.get_image_file_path()) + if self.write_to_movie: + file_paths.append(self.get_movie_file_path()) - def print_file_ready_message(self, file_path): - """Prints the "File Ready" message to STDOUT.""" - config["output_file"] = file_path - logger.info("\nFile ready at %(file_path)s\n", {"file_path": f"'{file_path}'"}) + for file_path in file_paths: + if current_os == "Windows": + os.startfile(file_path) + else: + commands = [] + if current_os == "Linux": + commands.append("xdg-open") + elif current_os.startswith("CYGWIN"): + commands.append("cygstart") + else: # Assume macOS + commands.append("open") + + if self.show_file_location_upon_completion: + commands.append("-R") + + commands.append(file_path) + + FNULL = open(os.devnull, "w") + sp.call(commands, stdout=FNULL, stderr=sp.STDOUT) + FNULL.close() + + if self.quiet: + sys.stdout.close() + sys.stdout = curr_stdout diff --git a/manim/utils/file_ops.py b/manim/utils/file_ops.py index ea2701bca7..66b8fb0899 100644 --- a/manim/utils/file_ops.py +++ b/manim/utils/file_ops.py @@ -18,6 +18,7 @@ "ensure_executable", ] +import numpy as np import os import platform import shutil @@ -292,3 +293,35 @@ def copy_template_files( copyfile(template_scene_path, Path.resolve(project_dir / "main.py")) console.print("\n\t[green]copied[/green] [blue]main.py[/blue]\n") add_import_statement(Path.resolve(project_dir / "main.py")) + + +def get_sorted_integer_files( + directory: str, + min_index: float = 0, + max_index: float = np.inf, + remove_non_integer_files: bool = False, + remove_indices_greater_than: float | None = None, + extension: str | None = None, +) -> list[str]: + indexed_files = [] + for file in os.listdir(directory): + if "." in file: + index_str = file[: file.index(".")] + else: + index_str = file + + full_path = os.path.join(directory, file) + if index_str.isdigit(): + index = int(index_str) + if remove_indices_greater_than is not None: + if index > remove_indices_greater_than: + os.remove(full_path) + continue + if extension is not None and not file.endswith(extension): + continue + if index >= min_index and index < max_index: + indexed_files.append((index, file)) + elif remove_non_integer_files: + os.remove(full_path) + indexed_files.sort(key=lambda p: p[0]) + return list(map(lambda p: os.path.join(directory, p[1]), indexed_files)) From 67e1ca98c8d16f8ef7249f6b40deb98574ea45e5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 3 Jan 2023 18:11:14 +0000 Subject: [PATCH 012/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/renderer/opengl_renderer_window.py | 3 +-- manim/scene/scene.py | 2 +- manim/scene/scene_file_writer.py | 10 ++++------ manim/utils/file_ops.py | 3 ++- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manim/renderer/opengl_renderer_window.py b/manim/renderer/opengl_renderer_window.py index aa48fe6869..135336007b 100644 --- a/manim/renderer/opengl_renderer_window.py +++ b/manim/renderer/opengl_renderer_window.py @@ -1,13 +1,12 @@ from __future__ import annotations +from typing import TYPE_CHECKING import moderngl_window as mglw import numpy as np - from moderngl_window.context.pyglet.window import Window as PygletWindow from moderngl_window.timers.clock import Timer from screeninfo import get_monitors -from typing import TYPE_CHECKING from .. import __version__, config diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 9584705e36..3941c149a8 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -16,13 +16,13 @@ from manim._config import logger as log from manim.animation.animation import prepare_animation -from manim.renderer.opengl_renderer import OpenGLCamera as Camera from manim.constants import DEFAULT_WAIT_TIME from manim.event_handler import EVENT_DISPATCHER from manim.event_handler.event_type import EventType from manim.mobject.frame import FullScreenRectangle from manim.mobject.mobject import Group, Mobject, Point, _AnimationBuilder from manim.mobject.types.vectorized_mobject import VGroup, VMobject +from manim.renderer.opengl_renderer import OpenGLCamera as Camera from manim.scene.scene_file_writer import SceneFileWriter from manim.utils.color import RED from manim.utils.family_ops import ( diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 6e3d47bc79..ff66c586f0 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -5,14 +5,14 @@ import shutil import subprocess as sp import sys +from pathlib import Path +from typing import TYPE_CHECKING import numpy as np -from pathlib import Path from pydub import AudioSegment from tqdm import tqdm as ProgressDisplay from manim import config - from manim._config import logger as log from manim.mobject.mobject import Mobject from manim.utils.file_ops import ( @@ -22,8 +22,6 @@ ) from manim.utils.sounds import get_full_sound_file_path -from typing import TYPE_CHECKING - if TYPE_CHECKING: from PIL.Image import Image @@ -31,7 +29,7 @@ from manim.scene import Scene -class SceneFileWriter(object): +class SceneFileWriter: def __init__( self, scene: Scene, @@ -115,7 +113,7 @@ def get_default_scene_name(self) -> str: def get_resolution_directory(self) -> str: pixel_height = self.scene.camera.pixel_height fps = self.scene.camera.fps - return "{}p{}".format(pixel_height, fps) + return f"{pixel_height}p{fps}" # Directory getters def get_image_file_path(self) -> str: diff --git a/manim/utils/file_ops.py b/manim/utils/file_ops.py index 66b8fb0899..495e6c259c 100644 --- a/manim/utils/file_ops.py +++ b/manim/utils/file_ops.py @@ -18,7 +18,6 @@ "ensure_executable", ] -import numpy as np import os import platform import shutil @@ -28,6 +27,8 @@ from shutil import copyfile from typing import TYPE_CHECKING +import numpy as np + if TYPE_CHECKING: from ..scene.scene_file_writer import SceneFileWriter from typing import Iterable From 615186041874bdd7ab64daacc47877b91146e8d1 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Wed, 4 Jan 2023 03:50:45 +0100 Subject: [PATCH 013/106] tried to fix shaders added warning in camera if uniform does not exist --- manim/mobject/mobject.py | 2 +- manim/renderer/opengl_renderer.py | 11 +- manim/renderer/opengl_renderer_window.py | 1 - .../include/camera_uniform_declarations.glsl | 8 +- .../shaders/include/complex_functions.glsl | 19 ++++ .../shaders/include/finalize_color.glsl | 78 +++++++------- .../shaders/include/get_gl_Position.glsl | 30 +++--- ...et_rotated_surface_unit_normal_vector.glsl | 15 ++- .../shaders/include/get_unit_normal.glsl | 17 +-- .../include/position_point_into_frame.glsl | 10 +- .../include/quadratic_bezier_distance.glsl | 83 +++++++------- .../quadratic_bezier_geometry_functions.glsl | 68 +++++------- .../shaders/quadratic_bezier_fill/frag.glsl | 48 ++++----- .../shaders/quadratic_bezier_fill/geom.glsl | 101 ++++++++---------- .../shaders/quadratic_bezier_fill/vert.glsl | 17 +-- .../shaders/quadratic_bezier_stroke/geom.glsl | 24 +++-- .../shaders/quadratic_bezier_stroke/vert.glsl | 8 +- manim/scene/scene.py | 4 +- 18 files changed, 276 insertions(+), 268 deletions(-) create mode 100644 manim/renderer/shaders/include/complex_functions.glsl diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 3d80171379..d7e9415413 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -2806,7 +2806,7 @@ def __init__(self, *mobjects, **kwargs): self.add(*mobjects) -class Point(Mobject): +class Point(Mobject, metaclass=ConvertToOpenGL): def __init__( self, location: np.ndarray = ORIGIN, diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index b5b5eef395..78440bd243 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -295,7 +295,14 @@ def reset_pixel_shape(self, new_width: int, new_height: int) -> None: def get_raw_fbo_data(self, dtype: str = "f1") -> bytes: # Copy blocks from the fbo_msaa to the drawn fbo using Blit - self.ctx.copy_framebuffer(self.fbo_msaa, self.fbo) + # pw, ph = (self.pixel_width, self.pixel_height) + # gl.glBindFramebuffer(gl.GL_READ_FRAMEBUFFER, self.fbo_msaa.glo) + # gl.glBindFramebuffer(gl.GL_DRAW_FRAMEBUFFER, self.fbo.glo) + # gl.glBlitFramebuffer( + # 0, 0, pw, ph, 0, 0, pw, ph, gl.GL_COLOR_BUFFER_BIT, gl.GL_LINEAR + # ) + + self.ctx.copy_framebuffer(self.fbo, self.fbo_msaa) return self.fbo.read( viewport=self.fbo.viewport, components=self.n_channels, @@ -485,6 +492,8 @@ def set_shader_uniforms( if isinstance(value, np.ndarray) and value.ndim > 0: value = tuple(value) shader[name].value = value + else: + logger.warning(f"Uniform {name} not found in shader {shader}") def refresh_perspective_uniforms(self) -> None: frame = self.frame diff --git a/manim/renderer/opengl_renderer_window.py b/manim/renderer/opengl_renderer_window.py index 135336007b..a8b762226a 100644 --- a/manim/renderer/opengl_renderer_window.py +++ b/manim/renderer/opengl_renderer_window.py @@ -46,7 +46,6 @@ def __init__(self, scene: m_scene.Scene, size=config.window_size): size = tuple(size) super().__init__(size=size) - self.scene = scene self.pressed_keys = set() self.title = self.title = f"Manim Community {__version__} - {str(scene)}" diff --git a/manim/renderer/shaders/include/camera_uniform_declarations.glsl b/manim/renderer/shaders/include/camera_uniform_declarations.glsl index fea450300f..44e75a747e 100644 --- a/manim/renderer/shaders/include/camera_uniform_declarations.glsl +++ b/manim/renderer/shaders/include/camera_uniform_declarations.glsl @@ -1,8 +1,6 @@ uniform vec2 frame_shape; -uniform float anti_alias_width; -uniform vec3 camera_center; +uniform vec2 pixel_shape; +uniform vec3 camera_offset; uniform mat3 camera_rotation; uniform float is_fixed_in_frame; -uniform float is_fixed_orientation; -uniform vec3 fixed_orientation_center; -uniform float focal_distance; +uniform float focal_distance; \ No newline at end of file diff --git a/manim/renderer/shaders/include/complex_functions.glsl b/manim/renderer/shaders/include/complex_functions.glsl new file mode 100644 index 0000000000..1328b9d00f --- /dev/null +++ b/manim/renderer/shaders/include/complex_functions.glsl @@ -0,0 +1,19 @@ +vec2 complex_mult(vec2 z, vec2 w) +{ + return vec2(z.x * w.x - z.y * w.y, z.x * w.y + z.y * w.x); +} + +vec2 complex_div(vec2 z, vec2 w) +{ + return complex_mult(z, vec2(w.x, -w.y)) / (w.x * w.x + w.y * w.y); +} + +vec2 complex_pow(vec2 z, int n) +{ + vec2 result = vec2(1.0, 0.0); + for (int i = 0; i < n; i++) + { + result = complex_mult(result, z); + } + return result; +} \ No newline at end of file diff --git a/manim/renderer/shaders/include/finalize_color.glsl b/manim/renderer/shaders/include/finalize_color.glsl index 26b10376a2..a039c00306 100644 --- a/manim/renderer/shaders/include/finalize_color.glsl +++ b/manim/renderer/shaders/include/finalize_color.glsl @@ -1,51 +1,53 @@ -vec3 float_to_color(float value, float min_val, float max_val, vec3[9] colormap_data){ +vec3 float_to_color(float value, float min_val, float max_val, vec3[9] colormap_data) +{ float alpha = clamp((value - min_val) / (max_val - min_val), 0.0, 1.0); int disc_alpha = min(int(alpha * 8), 7); - return mix( - colormap_data[disc_alpha], - colormap_data[disc_alpha + 1], - 8.0 * alpha - disc_alpha - ); + return mix(colormap_data[disc_alpha], colormap_data[disc_alpha + 1], 8.0 * alpha - disc_alpha); } +vec4 add_light(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, vec3 cam_coords, float reflectiveness, + float gloss, float shadow) +{ + if (reflectiveness == 0.0 && gloss == 0.0 && shadow == 0.0) + return color; -vec4 add_light(vec4 color, - vec3 point, - vec3 unit_normal, - vec3 light_coords, - float gloss, - float shadow){ - if(gloss == 0.0 && shadow == 0.0) return color; + vec4 result = color; + // Assume everything has already been rotated such that camera is in the z-direction + // cam_coords = vec3(0, 0, focal_distance); + vec3 to_camera = normalize(cam_coords - point); + vec3 to_light = normalize(light_coords - point); - // TODO, do we actually want this? It effectively treats surfaces as two-sided - if(unit_normal.z < 0){ - unit_normal *= -1; - } + // Note, this effectively treats surfaces as two-sided + // if(dot(to_camera, unit_normal) < 0) unit_normal *= -1; - // TODO, read this in as a uniform? - float camera_distance = 6; - // Assume everything has already been rotated such that camera is in the z-direction - vec3 to_camera = vec3(0, 0, camera_distance) - point; - vec3 to_light = light_coords - point; + float light_to_normal = dot(to_light, unit_normal); + // When unit normal points towards light, brighten + float bright_factor = max(light_to_normal, 0) * reflectiveness; + // For glossy surface, add extra shine if light beam go towards camera vec3 light_reflection = -to_light + 2 * unit_normal * dot(to_light, unit_normal); - float dot_prod = dot(normalize(light_reflection), normalize(to_camera)); - float shine = gloss * exp(-3 * pow(1 - dot_prod, 2)); - float dp2 = dot(normalize(to_light), unit_normal); - float darkening = mix(1, max(dp2, 0), shadow); - return vec4( - darkening * mix(color.rgb, vec3(1.0), shine), - color.a - ); + float light_to_cam = dot(light_reflection, to_camera); + float shine = gloss * exp(-3 * pow(1 - light_to_cam, 2)); + bright_factor += shine; + + result.rgb = mix(result.rgb, vec3(1.0), bright_factor); + if (light_to_normal < 0) + { + // Darken + result.rgb = mix(result.rgb, vec3(0.0), -light_to_normal * shadow); + } + // float darkening = mix(1, max(light_to_normal, 0), shadow); + // return vec4( + // darkening * mix(color.rgb, vec3(1.0), shine), + // color.a + // ); + return result; } -vec4 finalize_color(vec4 color, - vec3 point, - vec3 unit_normal, - vec3 light_coords, - float gloss, - float shadow){ +vec4 finalize_color(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, vec3 cam_coords, float reflectiveness, + float gloss, float shadow) +{ ///// INSERT COLOR FUNCTION HERE ///// // The line above may be replaced by arbitrary code snippets, as per // the method Mobject.set_color_by_code - return add_light(color, point, unit_normal, light_coords, gloss, shadow); -} + return add_light(color, point, unit_normal, light_coords, cam_coords, reflectiveness, gloss, shadow); +} \ No newline at end of file diff --git a/manim/renderer/shaders/include/get_gl_Position.glsl b/manim/renderer/shaders/include/get_gl_Position.glsl index 9c16c93212..f51133ad51 100644 --- a/manim/renderer/shaders/include/get_gl_Position.glsl +++ b/manim/renderer/shaders/include/get_gl_Position.glsl @@ -2,37 +2,35 @@ // uniform vec2 frame_shape; // uniform float focal_distance; // uniform float is_fixed_in_frame; -// uniform float is_fixed_orientation; -// uniform vec3 fixed_orientation_center; const vec2 DEFAULT_FRAME_SHAPE = vec2(8.0 * 16.0 / 9.0, 8.0); -float perspective_scale_factor(float z, float focal_distance){ +float perspective_scale_factor(float z, float focal_distance) +{ return max(0.0, focal_distance / (focal_distance - z)); } - -vec4 get_gl_Position(vec3 point){ +vec4 get_gl_Position(vec3 point) +{ vec4 result = vec4(point, 1.0); - if(!bool(is_fixed_in_frame)){ + if (!bool(is_fixed_in_frame)) + { result.x *= 2.0 / frame_shape.x; result.y *= 2.0 / frame_shape.y; float psf = perspective_scale_factor(result.z, focal_distance); - if (psf > 0){ + if (psf > 0) + { result.xy *= psf; // TODO, what's the better way to do this? // This is to keep vertices too far out of frame from getting cut. result.z *= 0.01; } - } else{ - if (!bool(is_fixed_orientation)){ - result.x *= 2.0 / DEFAULT_FRAME_SHAPE.x; - result.y *= 2.0 / DEFAULT_FRAME_SHAPE.y; - } else{ - result.x *= 2.0 / frame_shape.x; - result.y *= 2.0 / frame_shape.y; - } + } + else + { + result.x *= 2.0 / DEFAULT_FRAME_SHAPE.x; + result.y *= 2.0 / DEFAULT_FRAME_SHAPE.y; } result.z *= -1; return result; -} +} \ No newline at end of file diff --git a/manim/renderer/shaders/include/get_rotated_surface_unit_normal_vector.glsl b/manim/renderer/shaders/include/get_rotated_surface_unit_normal_vector.glsl index 8c6350d7a0..9f643030dc 100644 --- a/manim/renderer/shaders/include/get_rotated_surface_unit_normal_vector.glsl +++ b/manim/renderer/shaders/include/get_rotated_surface_unit_normal_vector.glsl @@ -1,16 +1,15 @@ // Assumes the following uniforms exist in the surrounding context: -// uniform vec3 camera_center; +// uniform vec3 camera_offset; // uniform mat3 camera_rotation; -vec3 get_rotated_surface_unit_normal_vector(vec3 point, vec3 du_point, vec3 dv_point){ - vec3 cp = cross( - (du_point - point), - (dv_point - point) - ); - if(length(cp) == 0){ +vec3 get_rotated_surface_unit_normal_vector(vec3 point, vec3 du_point, vec3 dv_point) +{ + vec3 cp = cross((du_point - point), (dv_point - point)); + if (length(cp) == 0) + { // Instead choose a normal to just dv_point - point in the direction of point vec3 v2 = dv_point - point; cp = cross(cross(v2, point), v2); } return normalize(rotate_point_into_frame(cp)); -} +} \ No newline at end of file diff --git a/manim/renderer/shaders/include/get_unit_normal.glsl b/manim/renderer/shaders/include/get_unit_normal.glsl index 65bb9c71e7..7c28e31909 100644 --- a/manim/renderer/shaders/include/get_unit_normal.glsl +++ b/manim/renderer/shaders/include/get_unit_normal.glsl @@ -1,22 +1,25 @@ -vec3 get_unit_normal(in vec3[3] points){ +vec3 get_unit_normal(in vec3[3] points) +{ float tol = 1e-6; vec3 v1 = normalize(points[1] - points[0]); - vec3 v2 = normalize(points[2] - points[0]); + vec3 v2 = normalize(points[2] - points[1]); vec3 cp = cross(v1, v2); float cp_norm = length(cp); - if(cp_norm < tol){ + if (cp_norm < tol) + { // Three points form a line, so find a normal vector // to that line in the plane shared with the z-axis vec3 k_hat = vec3(0.0, 0.0, 1.0); - vec3 new_cp = cross(cross(v2, k_hat), v2); + vec3 comb = v1 + v2; + vec3 new_cp = cross(cross(comb, k_hat), comb); float new_cp_norm = length(new_cp); - if(new_cp_norm < tol){ + if (new_cp_norm < tol) + { // We only come here if all three points line up // on the z-axis. return vec3(0.0, -1.0, 0.0); - // return k_hat; } return new_cp / new_cp_norm; } return cp / cp_norm; -} +} \ No newline at end of file diff --git a/manim/renderer/shaders/include/position_point_into_frame.glsl b/manim/renderer/shaders/include/position_point_into_frame.glsl index 67b5080f56..2e02957957 100644 --- a/manim/renderer/shaders/include/position_point_into_frame.glsl +++ b/manim/renderer/shaders/include/position_point_into_frame.glsl @@ -1,8 +1,6 @@ // Assumes the following uniforms exist in the surrounding context: // uniform float is_fixed_in_frame; -// uniform float is_fixed_orientation; -// uniform vec3 fixed_orientation_center; -// uniform vec3 camera_center; +// uniform vec3 camera_offset; // uniform mat3 camera_rotation; vec3 rotate_point_into_frame(vec3 point){ @@ -17,9 +15,5 @@ vec3 position_point_into_frame(vec3 point){ if(bool(is_fixed_in_frame)){ return point; } - if(bool(is_fixed_orientation)){ - vec3 new_center = rotate_point_into_frame(fixed_orientation_center); - return point + (new_center - fixed_orientation_center); - } - return rotate_point_into_frame(point - camera_center); + return rotate_point_into_frame(point - camera_offset); } diff --git a/manim/renderer/shaders/include/quadratic_bezier_distance.glsl b/manim/renderer/shaders/include/quadratic_bezier_distance.glsl index 847fa4ab6d..69b5673bd5 100644 --- a/manim/renderer/shaders/include/quadratic_bezier_distance.glsl +++ b/manim/renderer/shaders/include/quadratic_bezier_distance.glsl @@ -4,35 +4,36 @@ // so that b0 = (0, 0) and b1 = (1, 0). That is, b2 entirely // determines the shape of the curve -vec2 bezier(float t, vec2 b2){ +vec2 bezier(float t, vec2 b2) +{ // Quick returns for the 0 and 1 cases - if (t == 0) return vec2(0, 0); - else if (t == 1) return b2; + if (t == 0) + return vec2(0, 0); + else if (t == 1) + return b2; // Everything else - return vec2( - 2 * t * (1 - t) + b2.x * t*t, - b2.y * t * t - ); + return vec2(2 * t * (1 - t) + b2.x * t * t, b2.y * t * t); } - -float cube_root(float x){ +float cube_root(float x) +{ return sign(x) * pow(abs(x), 1.0 / 3.0); } - -int cubic_solve(float a, float b, float c, float d, out float roots[3]){ +int cubic_solve(float a, float b, float c, float d, out float roots[3]) +{ // Normalize so a = 1 b = b / a; c = c / a; d = d / a; - float p = c - b*b / 3.0; - float q = b * (2.0*b*b - 9.0*c) / 27.0 + d; - float p3 = p*p*p; - float disc = q*q + 4.0*p3 / 27.0; + float p = c - b * b / 3.0; + float q = b * (2.0 * b * b - 9.0 * c) / 27.0 + d; + float p3 = p * p * p; + float disc = q * q + 4.0 * p3 / 27.0; float offset = -b / 3.0; - if(disc >= 0.0){ + if (disc >= 0.0) + { float z = sqrt(disc); float u = (-q + z) / 2.0; float v = (-q - z) / 2.0; @@ -42,21 +43,19 @@ int cubic_solve(float a, float b, float c, float d, out float roots[3]){ return 1; } float u = sqrt(-p / 3.0); - float v = acos(-sqrt( -27.0 / p3) * q / 2.0) / 3.0; + float v = acos(-sqrt(-27.0 / p3) * q / 2.0) / 3.0; float m = cos(v); float n = sin(v) * 1.732050808; - float all_roots[3] = float[3]( - offset + u * (n - m), - offset - u * (n + m), - offset + u * (m + m) - ); + float all_roots[3] = float[3](offset + u * (n - m), offset - u * (n + m), offset + u * (m + m)); // Only accept roots with a positive derivative int n_valid_roots = 0; - for(int i = 0; i < 3; i++){ + for (int i = 0; i < 3; i++) + { float r = all_roots[i]; - if(3*r*r + 2*b*r + c > 0){ + if (3 * r * r + 2 * b * r + c > 0) + { roots[n_valid_roots] = r; n_valid_roots++; } @@ -64,44 +63,48 @@ int cubic_solve(float a, float b, float c, float d, out float roots[3]){ return n_valid_roots; } -float dist_to_line(vec2 p, vec2 b2){ +float dist_to_line(vec2 p, vec2 b2) +{ float t = clamp(p.x / b2.x, 0, 1); float dist; - if(t == 0) dist = length(p); - else if(t == 1) dist = distance(p, b2); - else dist = abs(p.y); + if (t == 0) + dist = length(p); + else if (t == 1) + dist = distance(p, b2); + else + dist = abs(p.y); return modify_distance_for_endpoints(p, dist, t); } - -float dist_to_point_on_curve(vec2 p, float t, vec2 b2){ +float dist_to_point_on_curve(vec2 p, float t, vec2 b2) +{ t = clamp(t, 0, 1); - return modify_distance_for_endpoints( - p, length(p - bezier(t, b2)), t - ); + return modify_distance_for_endpoints(p, length(p - bezier(t, b2)), t); } - -float min_dist_to_curve(vec2 p, vec2 b2, float degree){ +float min_dist_to_curve(vec2 p, vec2 b2, float degree) +{ // Check if curve is really a a line - if(degree == 1) return dist_to_line(p, b2); + if (degree == 1) + return dist_to_line(p, b2); // Try finding the exact sdf by solving the equation // (d/dt) dist^2(t) = 0, which amount to the following // cubic. float xm2 = uv_b2.x - 2.0; float y = uv_b2.y; - float a = xm2*xm2 + y*y; + float a = xm2 * xm2 + y * y; float b = 3 * xm2; - float c = -(p.x*xm2 + p.y*y) + 2; + float c = -(p.x * xm2 + p.y * y) + 2; float d = -p.x; float roots[3]; int n = cubic_solve(a, b, c, d, roots); // At most 2 roots will have been populated. float d0 = dist_to_point_on_curve(p, roots[0], b2); - if(n == 1) return d0; + if (n == 1) + return d0; float d1 = dist_to_point_on_curve(p, roots[1], b2); return min(d0, d1); -} +} \ No newline at end of file diff --git a/manim/renderer/shaders/include/quadratic_bezier_geometry_functions.glsl b/manim/renderer/shaders/include/quadratic_bezier_geometry_functions.glsl index d2e3e0fb71..accedf636c 100644 --- a/manim/renderer/shaders/include/quadratic_bezier_geometry_functions.glsl +++ b/manim/renderer/shaders/include/quadratic_bezier_geometry_functions.glsl @@ -1,36 +1,24 @@ -float cross2d(vec2 v, vec2 w){ +float cross2d(vec2 v, vec2 w) +{ return v.x * w.y - w.x * v.y; } - -mat3 get_xy_to_uv(vec2 b0, vec2 b1){ - mat3 shift = mat3( - 1.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - -b0.x, -b0.y, 1.0 - ); +mat3 get_xy_to_uv(vec2 b0, vec2 b1) +{ + mat3 shift = mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, -b0.x, -b0.y, 1.0); float sf = length(b1 - b0); vec2 I = (b1 - b0) / sf; vec2 J = vec2(-I.y, I.x); - mat3 rotate = mat3( - I.x, J.x, 0.0, - I.y, J.y, 0.0, - 0.0, 0.0, 1.0 - ); - return (1 / sf) * rotate * shift; + mat3 rotate = mat3(I.x, J.x, 0.0, I.y, J.y, 0.0, 0.0, 0.0, 1.0); + return (1.0 / sf) * rotate * shift; } - // Orthogonal matrix to convert to a uv space defined so that // b0 goes to [0, 0] and b1 goes to [1, 0] -mat4 get_xyz_to_uv(vec3 b0, vec3 b1, vec3 unit_normal){ - mat4 shift = mat4( - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - -b0.x, -b0.y, -b0.z, 1 - ); +mat4 get_xyz_to_uv(vec3 b0, vec3 b1, vec3 unit_normal) +{ + mat4 shift = mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -b0.x, -b0.y, -b0.z, 1); float scale_factor = length(b1 - b0); vec3 I = (b1 - b0) / scale_factor; @@ -38,25 +26,20 @@ mat4 get_xyz_to_uv(vec3 b0, vec3 b1, vec3 unit_normal){ vec3 J = cross(K, I); // Transpose (hence inverse) of matrix taking // i-hat to I, k-hat to unit_normal, and j-hat to their cross - mat4 rotate = mat4( - I.x, J.x, K.x, 0.0, - I.y, J.y, K.y, 0.0, - I.z, J.z, K.z, 0.0, - 0.0, 0.0, 0.0, 1.0 - ); - return (1 / scale_factor) * rotate * shift; + mat4 rotate = mat4(I.x, J.x, K.x, 0.0, I.y, J.y, K.y, 0.0, I.z, J.z, K.z, 0.0, 0.0, 0.0, 0.0, 1.0); + return (1.0 / scale_factor) * rotate * shift; } - // Returns 0 for null curve, 1 for linear, 2 for quadratic. // Populates new_points with bezier control points for the curve, // which for quadratics will be the same, but for linear and null // might change. The idea is to inform the caller of the degree, // while also passing tangency information in the linear case. // float get_reduced_control_points(vec3 b0, vec3 b1, vec3 b2, out vec3 new_points[3]){ -float get_reduced_control_points(in vec3 points[3], out vec3 new_points[3]){ - float length_threshold = 1e-6; - float angle_threshold = 5e-2; +float get_reduced_control_points(in vec3 points[3], out vec3 new_points[3]) +{ + float length_threshold = 1e-8; + float angle_threshold = 1e-3; vec3 p0 = points[0]; vec3 p1 = points[1]; @@ -66,27 +49,32 @@ float get_reduced_control_points(in vec3 points[3], out vec3 new_points[3]){ float dot_prod = clamp(dot(normalize(v01), normalize(v12)), -1, 1); bool aligned = acos(dot_prod) < angle_threshold; - bool distinct_01 = length(v01) > length_threshold; // v01 is considered nonzero - bool distinct_12 = length(v12) > length_threshold; // v12 is considered nonzero + bool distinct_01 = length(v01) > length_threshold; // v01 is considered nonzero + bool distinct_12 = length(v12) > length_threshold; // v12 is considered nonzero int n_uniques = int(distinct_01) + int(distinct_12); bool quadratic = (n_uniques == 2) && !aligned; bool linear = (n_uniques == 1) || ((n_uniques == 2) && aligned); bool constant = (n_uniques == 0); - if(quadratic){ + if (quadratic) + { new_points[0] = p0; new_points[1] = p1; new_points[2] = p2; return 2.0; - }else if(linear){ + } + else if (linear) + { new_points[0] = p0; - new_points[1] = (p0 + p2) / 2.0; + new_points[1] = 0.5 * (p0 + p2); new_points[2] = p2; return 1.0; - }else{ + } + else + { new_points[0] = p0; new_points[1] = p0; new_points[2] = p0; return 0.0; } -} +} \ No newline at end of file diff --git a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl index 28a1879799..eb97961a69 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl @@ -1,9 +1,9 @@ #version 330 -#include ../include/camera_uniform_declarations.glsl +#include ../ include / camera_uniform_declarations.glsl in vec4 color; -in float fill_all; // Either 0 or 1e +in float fill_all; // Either 0 or 1 in float uv_anti_alias_width; in vec3 xyz_coords; @@ -15,52 +15,50 @@ in float bezier_degree; out vec4 frag_color; // Needed for quadratic_bezier_distance insertion below -float modify_distance_for_endpoints(vec2 p, float dist, float t){ +float modify_distance_for_endpoints(vec2 p, float dist, float t) +{ return dist; } -#include ../include/quadratic_bezier_distance.glsl +#include ../ include / quadratic_bezier_distance.glsl - -float sdf(){ - if(bezier_degree < 2){ +float sdf() +{ + if (bezier_degree < 2) + { return abs(uv_coords[1]); } float u2 = uv_b2.x; float v2 = uv_b2.y; // For really flat curves, just take the distance to x-axis - if(abs(v2 / u2) < 0.1 * uv_anti_alias_width){ + if (abs(v2 / u2) < 0.1 * uv_anti_alias_width) + { return abs(uv_coords[1]); } - // For flat-ish curves, take the curve - else if(abs(v2 / u2) < 0.5 * uv_anti_alias_width){ - return min_dist_to_curve(uv_coords, uv_b2, bezier_degree); - } - // I know, I don't love this amount of arbitrary-seeming branching either, - // but a number of strange dimples and bugs pop up otherwise. - // This converts uv_coords to yet another space where the bezier points sit on // (0, 0), (1/2, 0) and (1, 1), so that the curve can be expressed implicityly // as y = x^2. - mat2 to_simple_space = mat2( - v2, 0, - 2 - u2, 4 * v2 - ); + mat2 to_simple_space = mat2(v2, 0, 2 - u2, 4 * v2); vec2 p = to_simple_space * uv_coords; // Sign takes care of whether we should be filling the inside or outside of curve. float sgn = orientation * sign(v2); float Fp = (p.x * p.x - p.y); - if(sgn * Fp < 0){ + if (sgn * Fp <= 0) + { return 0.0; - }else{ + } + else + { return min_dist_to_curve(uv_coords, uv_b2, bezier_degree); } } - -void main() { - if (color.a == 0) discard; +void main() +{ + if (color.a == 0) + discard; frag_color = color; - if (fill_all == 1.0) return; + if (fill_all == 1.0) + return; frag_color.a *= smoothstep(1, 0, sdf() / uv_anti_alias_width); } diff --git a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl index b6a9fceea2..58fa4140fe 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl @@ -1,23 +1,24 @@ #version 330 -layout (triangles) in; -layout (triangle_strip, max_vertices = 5) out; +layout(triangles) in; +layout(triangle_strip, max_vertices = 5) out; uniform float anti_alias_width; // Needed for get_gl_Position uniform vec2 frame_shape; +uniform vec2 pixel_shape; uniform float focal_distance; uniform float is_fixed_in_frame; -uniform float is_fixed_orientation; -uniform vec3 fixed_orientation_center; // Needed for finalize_color uniform vec3 light_source_position; +uniform vec3 camera_position; +uniform float reflectiveness; uniform float gloss; uniform float shadow; in vec3 bp[3]; -in vec3 v_global_unit_normal[3]; +in float v_orientation[3]; in vec4 v_color[3]; in float v_vert_index[3]; @@ -32,6 +33,7 @@ out vec2 uv_coords; out vec2 uv_b2; out float bezier_degree; +vec3 unit_normal; // Analog of import for manim only #include ../include/quadratic_bezier_geometry_functions.glsl @@ -39,31 +41,26 @@ out float bezier_degree; #include ../include/get_unit_normal.glsl #include ../include/finalize_color.glsl - -void emit_vertex_wrapper(vec3 point, int index){ - color = finalize_color( - v_color[index], - point, - v_global_unit_normal[index], - light_source_position, - gloss, - shadow - ); +void emit_vertex_wrapper(vec3 point, int index) +{ + color = finalize_color(v_color[index], point, unit_normal, light_source_position, camera_position, reflectiveness, + gloss, shadow); xyz_coords = point; gl_Position = get_gl_Position(xyz_coords); EmitVertex(); } - -void emit_simple_triangle(){ - for(int i = 0; i < 3; i++){ +void emit_simple_triangle() +{ + for (int i = 0; i < 3; i++) + { emit_vertex_wrapper(bp[i], i); } EndPrimitive(); } - -void emit_pentagon(vec3[3] points, vec3 normal){ +void emit_pentagon(vec3[3] points, vec3 normal) +{ vec3 p0 = points[0]; vec3 p1 = points[1]; vec3 p2 = points[2]; @@ -74,62 +71,58 @@ void emit_pentagon(vec3[3] points, vec3 normal){ vec3 p0_perp = cross(t01, normal); vec3 p2_perp = cross(t12, normal); - bool fill_inside = orientation > 0; - float aaw = anti_alias_width; + bool fill_inside = orientation > 0.0; + float aaw = anti_alias_width * frame_shape.y / pixel_shape.y; vec3 corners[5]; - if(fill_inside){ - // Note, straight lines will also fall into this case, and since p0_perp and p2_perp - // will point to the right of the curve, it's just what we want - corners = vec3[5]( - p0 + aaw * p0_perp, - p0, - p1 + 0.5 * aaw * (p0_perp + p2_perp), - p2, - p2 + aaw * p2_perp - ); - }else{ - corners = vec3[5]( - p0, - p0 - aaw * p0_perp, - p1, - p2 - aaw * p2_perp, - p2 - ); + if (bezier_degree == 1.0) + { + // For straight lines, buff out in both directions + corners = vec3[5](p0 + aaw * p0_perp, p0 - aaw * p0_perp, p1 + 0.5 * aaw * (p0_perp + p2_perp), + p2 - aaw * p2_perp, p2 + aaw * p2_perp); + } + else if (fill_inside) + { + // If curved, and filling insight, just buff out away interior + corners = vec3[5](p0 + aaw * p0_perp, p0, p1 + 0.5 * aaw * (p0_perp + p2_perp), p2, p2 + aaw * p2_perp); + } + else + { + corners = vec3[5](p0, p0 - aaw * p0_perp, p1, p2 - aaw * p2_perp, p2); } mat4 xyz_to_uv = get_xyz_to_uv(p0, p1, normal); uv_b2 = (xyz_to_uv * vec4(p2, 1)).xy; - uv_anti_alias_width = anti_alias_width / length(p1 - p0); + uv_anti_alias_width = aaw / length(p1 - p0); - for(int i = 0; i < 5; i++){ + for (int i = 0; i < 5; i++) + { vec3 corner = corners[i]; uv_coords = (xyz_to_uv * vec4(corner, 1)).xy; - int j = int(sign(i - 1) + 1); // Maps i = [0, 1, 2, 3, 4] onto j = [0, 0, 1, 2, 2] + int j = int(sign(i - 1) + 1); // Maps i = [0, 1, 2, 3, 4] onto j = [0, 0, 1, 2, 2] emit_vertex_wrapper(corner, j); } EndPrimitive(); } - -void main(){ +void main() +{ // If vert indices are sequential, don't fill all - fill_all = float( - (v_vert_index[1] - v_vert_index[0]) != 1.0 || - (v_vert_index[2] - v_vert_index[1]) != 1.0 - ); + fill_all = float((v_vert_index[1] - v_vert_index[0]) != 1.0 || (v_vert_index[2] - v_vert_index[1]) != 1.0); - if(fill_all == 1.0){ + if (fill_all == 1.0) + { emit_simple_triangle(); return; } vec3 new_bp[3]; bezier_degree = get_reduced_control_points(vec3[3](bp[0], bp[1], bp[2]), new_bp); - vec3 local_unit_normal = get_unit_normal(new_bp); - orientation = sign(dot(v_global_unit_normal[0], local_unit_normal)); + unit_normal = get_unit_normal(new_bp); + orientation = v_orientation[0]; - if(bezier_degree >= 1){ - emit_pentagon(new_bp, local_unit_normal); + if (bezier_degree >= 1) + { + emit_pentagon(new_bp, unit_normal); } // Don't emit any vertices for bezier_degree 0 } diff --git a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl index e891339887..e93c721b16 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl @@ -3,21 +3,22 @@ #include ../include/camera_uniform_declarations.glsl in vec3 point; -in vec3 unit_normal; +in float orientation; in vec4 color; in float vert_index; -out vec3 bp; // Bezier control point -out vec3 v_global_unit_normal; +out vec3 bp; // Bezier control point +out float v_orientation; out vec4 v_color; -out float v_vert_index; +out float v_vert_index // Analog of import for manim only #include ../include/position_point_into_frame.glsl -void main(){ - bp = position_point_into_frame(point.xyz); - v_global_unit_normal = rotate_point_into_frame(unit_normal.xyz); +void main() +{ + bp = position_point_into_frame(point); + v_orientation = orientation; v_color = color; - v_vert_index = vert_index; + v_vert_index = vert_index } diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl index 2433142410..394f7e6f78 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl @@ -5,24 +5,24 @@ layout (triangle_strip, max_vertices = 5) out; // Needed for get_gl_Position uniform vec2 frame_shape; +uniform vec2 pixel_shape; uniform float focal_distance; uniform float is_fixed_in_frame; -uniform float is_fixed_orientation; -uniform vec3 fixed_orientation_center; uniform float anti_alias_width; uniform float flat_stroke; //Needed for lighting uniform vec3 light_source_position; +uniform vec3 camera_position; uniform float joint_type; +uniform float reflectiveness; uniform float gloss; uniform float shadow; in vec3 bp[3]; in vec3 prev_bp[3]; in vec3 next_bp[3]; -in vec3 v_global_unit_normal[3]; in vec4 v_color[3]; in float v_stroke_width[3]; @@ -43,6 +43,8 @@ out float bezier_degree; out vec2 uv_coords; out vec2 uv_b2; +vec3 unit_normal; + // Codes for joint types const float AUTO_JOINT = 0; const float ROUND_JOINT = 1; @@ -50,7 +52,6 @@ const float BEVEL_JOINT = 2; const float MITER_JOINT = 3; const float PI = 3.141592653; - #include ../include/quadratic_bezier_geometry_functions.glsl #include ../include/get_gl_Position.glsl #include ../include/get_unit_normal.glsl @@ -127,7 +128,7 @@ int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 c // aaw is the added width given around the polygon for antialiasing. // In case the normal is faced away from (0, 0, 1), the vector to the // camera, this is scaled up. - float aaw = anti_alias_width; + float aaw = anti_alias_width * frame_shape.y / pixel_shape.y; float buff0 = 0.5 * stroke_widths[0] + aaw; float buff2 = 0.5 * stroke_widths[2] + aaw; float aaw0 = (1 - has_prev) * aaw; @@ -206,6 +207,7 @@ void main() { vec3 controls[3]; vec3 prev[3]; vec3 next[3]; + unit_normal = get_unit_normal(controls); bezier_degree = get_reduced_control_points(vec3[3](bp[0], bp[1], bp[2]), controls); if(bezier_degree == 0.0) return; // Null curve int degree = int(bezier_degree); @@ -219,13 +221,13 @@ void main() { float sf = perspective_scale_factor(controls[i].z, focal_distance); if(bool(flat_stroke)){ vec3 to_cam = normalize(vec3(0.0, 0.0, focal_distance) - controls[i]); - sf *= abs(dot(v_global_unit_normal[i], to_cam)); + sf *= abs(dot(unit_normal, to_cam)); } scaled_strokes[i] = v_stroke_width[i] * sf; } // Control points are projected to the xy plane before drawing, which in turn - // gets translated to a uv plane. The z-coordinate information will be remembered + // gets tranlated to a uv plane. The z-coordinate information will be remembered // by what's sent out to gl_Position, and by how it affects the lighting and stroke width vec2 flat_controls[3]; vec2 flat_prev[3]; @@ -246,7 +248,7 @@ void main() { // Find uv conversion matrix mat3 xy_to_uv = get_xy_to_uv(flat_controls[0], flat_controls[1]); float scale_factor = length(flat_controls[1] - flat_controls[0]); - uv_anti_alias_width = anti_alias_width / scale_factor; + uv_anti_alias_width = anti_alias_width * frame_shape.y / pixel_shape.y / scale_factor; uv_b2 = (xy_to_uv * vec3(flat_controls[2], 1.0)).xy; // Emit each corner @@ -259,8 +261,10 @@ void main() { color = finalize_color( v_color[index_map[i]], xyz_coords, - v_global_unit_normal[index_map[i]], + unit_normal, light_source_position, + camera_position, + reflectiveness, gloss, shadow ); @@ -271,4 +275,4 @@ void main() { EmitVertex(); } EndPrimitive(); -} +} \ No newline at end of file diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl index 4ed9d0a7e2..0c8a07283d 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl @@ -5,7 +5,6 @@ in vec3 point; in vec3 prev_point; in vec3 next_point; -in vec3 unit_normal; in float stroke_width; in vec4 color; @@ -14,7 +13,6 @@ in vec4 color; out vec3 bp; out vec3 prev_bp; out vec3 next_bp; -out vec3 v_global_unit_normal; out float v_stroke_width; out vec4 v_color; @@ -23,12 +21,12 @@ const float STROKE_WIDTH_CONVERSION = 0.01; #include ../include/position_point_into_frame.glsl -void main(){ +void main() +{ bp = position_point_into_frame(point); prev_bp = position_point_into_frame(prev_point); next_bp = position_point_into_frame(next_point); - v_global_unit_normal = rotate_point_into_frame(unit_normal); - v_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width; + v_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width * frame_shape[1] / 8.0; v_color = color; } diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 3941c149a8..c570a923ec 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -9,8 +9,10 @@ from typing import TYPE_CHECKING import numpy as np + from IPython.terminal import pt_inputhooks from IPython.terminal.embed import InteractiveShellEmbed + from pyglet.window import key from tqdm import tqdm as ProgressDisplay @@ -101,7 +103,7 @@ def __init__( # Core state of the scene self.camera: Camera = Camera(**self.camera_config) - self.file_writer = SceneFileWriter(self, str(self), **self.file_writer_config) + self.file_writer = SceneFileWriter(self, **self.file_writer_config) self.mobjects: list[Mobject] = [self.camera.frame] self.id_to_mobject_map: dict[int, Mobject] = {} self.num_plays: int = 0 From eda8bb0e061be53050ba7c8e8aa3ab90a07e1101 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 4 Jan 2023 02:51:40 +0000 Subject: [PATCH 014/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/renderer/shaders/include/camera_uniform_declarations.glsl | 2 +- manim/renderer/shaders/include/complex_functions.glsl | 2 +- manim/renderer/shaders/include/finalize_color.glsl | 2 +- manim/renderer/shaders/include/get_gl_Position.glsl | 2 +- .../shaders/include/get_rotated_surface_unit_normal_vector.glsl | 2 +- manim/renderer/shaders/include/get_unit_normal.glsl | 2 +- manim/renderer/shaders/include/quadratic_bezier_distance.glsl | 2 +- .../shaders/include/quadratic_bezier_geometry_functions.glsl | 2 +- manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl | 2 +- manim/scene/scene.py | 2 -- 10 files changed, 9 insertions(+), 11 deletions(-) diff --git a/manim/renderer/shaders/include/camera_uniform_declarations.glsl b/manim/renderer/shaders/include/camera_uniform_declarations.glsl index 44e75a747e..f7b5daa106 100644 --- a/manim/renderer/shaders/include/camera_uniform_declarations.glsl +++ b/manim/renderer/shaders/include/camera_uniform_declarations.glsl @@ -3,4 +3,4 @@ uniform vec2 pixel_shape; uniform vec3 camera_offset; uniform mat3 camera_rotation; uniform float is_fixed_in_frame; -uniform float focal_distance; \ No newline at end of file +uniform float focal_distance; diff --git a/manim/renderer/shaders/include/complex_functions.glsl b/manim/renderer/shaders/include/complex_functions.glsl index 1328b9d00f..9c73fb3d35 100644 --- a/manim/renderer/shaders/include/complex_functions.glsl +++ b/manim/renderer/shaders/include/complex_functions.glsl @@ -16,4 +16,4 @@ vec2 complex_pow(vec2 z, int n) result = complex_mult(result, z); } return result; -} \ No newline at end of file +} diff --git a/manim/renderer/shaders/include/finalize_color.glsl b/manim/renderer/shaders/include/finalize_color.glsl index a039c00306..2e3f43c025 100644 --- a/manim/renderer/shaders/include/finalize_color.glsl +++ b/manim/renderer/shaders/include/finalize_color.glsl @@ -50,4 +50,4 @@ vec4 finalize_color(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, // The line above may be replaced by arbitrary code snippets, as per // the method Mobject.set_color_by_code return add_light(color, point, unit_normal, light_coords, cam_coords, reflectiveness, gloss, shadow); -} \ No newline at end of file +} diff --git a/manim/renderer/shaders/include/get_gl_Position.glsl b/manim/renderer/shaders/include/get_gl_Position.glsl index f51133ad51..081ffb12f0 100644 --- a/manim/renderer/shaders/include/get_gl_Position.glsl +++ b/manim/renderer/shaders/include/get_gl_Position.glsl @@ -33,4 +33,4 @@ vec4 get_gl_Position(vec3 point) } result.z *= -1; return result; -} \ No newline at end of file +} diff --git a/manim/renderer/shaders/include/get_rotated_surface_unit_normal_vector.glsl b/manim/renderer/shaders/include/get_rotated_surface_unit_normal_vector.glsl index 9f643030dc..68255c3df1 100644 --- a/manim/renderer/shaders/include/get_rotated_surface_unit_normal_vector.glsl +++ b/manim/renderer/shaders/include/get_rotated_surface_unit_normal_vector.glsl @@ -12,4 +12,4 @@ vec3 get_rotated_surface_unit_normal_vector(vec3 point, vec3 du_point, vec3 dv_p cp = cross(cross(v2, point), v2); } return normalize(rotate_point_into_frame(cp)); -} \ No newline at end of file +} diff --git a/manim/renderer/shaders/include/get_unit_normal.glsl b/manim/renderer/shaders/include/get_unit_normal.glsl index 7c28e31909..40c795b49c 100644 --- a/manim/renderer/shaders/include/get_unit_normal.glsl +++ b/manim/renderer/shaders/include/get_unit_normal.glsl @@ -22,4 +22,4 @@ vec3 get_unit_normal(in vec3[3] points) return new_cp / new_cp_norm; } return cp / cp_norm; -} \ No newline at end of file +} diff --git a/manim/renderer/shaders/include/quadratic_bezier_distance.glsl b/manim/renderer/shaders/include/quadratic_bezier_distance.glsl index 69b5673bd5..a6b17958e0 100644 --- a/manim/renderer/shaders/include/quadratic_bezier_distance.glsl +++ b/manim/renderer/shaders/include/quadratic_bezier_distance.glsl @@ -107,4 +107,4 @@ float min_dist_to_curve(vec2 p, vec2 b2, float degree) return d0; float d1 = dist_to_point_on_curve(p, roots[1], b2); return min(d0, d1); -} \ No newline at end of file +} diff --git a/manim/renderer/shaders/include/quadratic_bezier_geometry_functions.glsl b/manim/renderer/shaders/include/quadratic_bezier_geometry_functions.glsl index accedf636c..e322fadad3 100644 --- a/manim/renderer/shaders/include/quadratic_bezier_geometry_functions.glsl +++ b/manim/renderer/shaders/include/quadratic_bezier_geometry_functions.glsl @@ -77,4 +77,4 @@ float get_reduced_control_points(in vec3 points[3], out vec3 new_points[3]) new_points[2] = p0; return 0.0; } -} \ No newline at end of file +} diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl index 394f7e6f78..a35858a7c3 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl @@ -275,4 +275,4 @@ void main() { EmitVertex(); } EndPrimitive(); -} \ No newline at end of file +} diff --git a/manim/scene/scene.py b/manim/scene/scene.py index c570a923ec..3d4b8e94bc 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -9,10 +9,8 @@ from typing import TYPE_CHECKING import numpy as np - from IPython.terminal import pt_inputhooks from IPython.terminal.embed import InteractiveShellEmbed - from pyglet.window import key from tqdm import tqdm as ProgressDisplay From d169cd556f7a03d24ddee7369119ed2c95330105 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Wed, 4 Jan 2023 19:50:38 +0100 Subject: [PATCH 015/106] addded relative import support for shaders and first working square (fill is broken) --- manim/camera/camera.py | 1 + manim/mobject/opengl/opengl_mobject.py | 22 ++- .../opengl/opengl_vectorized_mobject.py | 22 +-- manim/renderer/opengl_renderer.py | 2 +- manim/renderer/shader.py | 1 + manim/renderer/shader_wrapper.py | 30 +++- manim/renderer/shaders/design.frag | 15 +- manim/renderer/shaders/design_2.frag | 36 ++-- manim/renderer/shaders/design_3.frag | 75 +++++---- manim/renderer/shaders/include/add_light.glsl | 29 ++-- .../include/position_point_into_frame.glsl | 13 +- manim/renderer/shaders/manim_coords/frag.glsl | 5 +- manim/renderer/shaders/manim_coords/vert.glsl | 3 +- .../shaders/quadratic_bezier_fill/frag.glsl | 7 +- .../shaders/quadratic_bezier_fill/geom.glsl | 15 +- .../shaders/quadratic_bezier_fill/vert.glsl | 10 +- .../shaders/quadratic_bezier_stroke/frag.glsl | 57 ++++--- .../shaders/quadratic_bezier_stroke/geom.glsl | 157 +++++++++--------- .../shaders/quadratic_bezier_stroke/vert.glsl | 4 +- manim/renderer/shaders/simple_vert.glsl | 9 +- manim/renderer/shaders/surface/frag.glsl | 14 +- manim/renderer/shaders/surface/vert.glsl | 11 +- manim/renderer/shaders/test/frag.glsl | 3 +- manim/renderer/shaders/test/vert.glsl | 3 +- .../shaders/textured_surface/frag.glsl | 22 +-- .../shaders/textured_surface/vert.glsl | 11 +- manim/renderer/shaders/true_dot/frag.glsl | 17 +- manim/renderer/shaders/true_dot/geom.glsl | 12 +- manim/renderer/shaders/true_dot/vert.glsl | 7 +- .../shaders/vectorized_mobject_fill/frag.glsl | 10 +- .../shaders/vectorized_mobject_fill/vert.glsl | 3 +- .../vectorized_mobject_stroke/frag.glsl | 62 ++++--- .../vectorized_mobject_stroke/vert.glsl | 54 +++--- .../renderer/shaders/vertex_colors/frag.glsl | 5 +- .../renderer/shaders/vertex_colors/vert.glsl | 3 +- 35 files changed, 394 insertions(+), 356 deletions(-) diff --git a/manim/camera/camera.py b/manim/camera/camera.py index 84e7060e38..599a2c0135 100644 --- a/manim/camera/camera.py +++ b/manim/camera/camera.py @@ -77,6 +77,7 @@ def __init__( frame_rate: float | None = None, **kwargs, ): + logger.warning("Camera is deprecated. Please use OpenGLCamera instead.") self.background_image = background_image self.frame_center = frame_center self.image_mode = image_mode diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index 568c040ea5..f9c880aa44 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -237,12 +237,10 @@ def init_uniforms(self): Gets called upon creation""" self.uniforms = { - "is_fixed_in_frame": np.array( - float(self.is_fixed_in_frame), dtype=UNIFORM_DTYPE - ), - "gloss": np.array(self.gloss, dtype=UNIFORM_DTYPE), - "shadow": np.array(self.shadow, dtype=UNIFORM_DTYPE), - "reflectiveness": np.array(self.reflectiveness, dtype=UNIFORM_DTYPE), + "is_fixed_in_frame": float(self.is_fixed_in_frame), + "gloss": float(self.gloss), + "shadow": float(self.shadow), + "reflectiveness": float(self.reflectiveness), } def init_colors(self): @@ -2311,7 +2309,7 @@ def get_reflectiveness(self) -> np.ndarray: def set_reflectiveness(self, reflectiveness: float, recurse: bool = True): for mob in self.get_family(recurse): - mob.uniforms["reflectiveness"] = np.asarray(reflectiveness) + mob.uniforms["reflectiveness"] = float(reflectiveness) return self def get_shadow(self) -> np.ndarray: @@ -2319,7 +2317,7 @@ def get_shadow(self) -> np.ndarray: def set_shadow(self, shadow: float, recurse: bool = True): for mob in self.get_family(recurse): - mob.uniforms["shadow"] = np.asarray(shadow) + mob.uniforms["shadow"] = float(shadow) return self def get_gloss(self) -> np.ndarray: @@ -2327,7 +2325,7 @@ def get_gloss(self) -> np.ndarray: def set_gloss(self, gloss: float, recurse: bool = True): for mob in self.get_family(recurse): - mob.uniforms["gloss"] = np.asarray(gloss) + mob.uniforms["gloss"] = float(gloss) return self # Background rectangle @@ -2891,20 +2889,20 @@ def wrapper(self): @affects_shader_info_id def fix_in_frame(self) -> Self: - self.uniforms["is_fixed_in_frame"] = np.asarray(1.0) + self.uniforms["is_fixed_in_frame"] = float(1.0) self.is_fixed_in_frame = True return self @affects_shader_info_id def fix_orientation(self) -> Self: - self.uniforms["is_fixed_orientation"] = np.asarray(1.0) + self.uniforms["is_fixed_orientation"] = float(1.0) self.is_fixed_orientation = True self.fixed_orientation_center = tuple(self.get_center()) return self @affects_shader_info_id def unfix_from_frame(self) -> Self: - self.uniforms["is_fixed_in_frame"] = np.asarray(0.0) + self.uniforms["is_fixed_in_frame"] = float(0.0) self.is_fixed_in_frame = False return self diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 169c277714..ccb5237d5f 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -92,7 +92,7 @@ def __init__( background_image_file: str | None = None, long_lines: bool = False, joint_type: LineJointType = LineJointType.AUTO, - flat_stroke: bool = True, + flat_stroke: bool = False, # Measured in pixel widths anti_alias_width: float = 1.0, **kwargs, @@ -147,15 +147,9 @@ def init_data(self): def init_uniforms(self): super().init_uniforms() - self.uniforms["anti_alias_width"] = np.asarray( - self.anti_alias_width, dtype=UNIFORM_DTYPE - ) - self.uniforms["joint_type"] = np.asarray( - self.joint_type.value, dtype=UNIFORM_DTYPE - ) - self.uniforms["flat_stroke"] = np.asarray( - float(self.flat_stroke), dtype=UNIFORM_DTYPE - ) + self.uniforms["anti_alias_width"] = float(self.anti_alias_width) + self.uniforms["joint_type"] = float(self.joint_type.value) + self.uniforms["flat_stroke"] = float(self.flat_stroke) # These are here just to make type checkers happy def get_family(self, recurse: bool = True) -> list[OpenGLVMobject]: # type: ignore @@ -453,7 +447,7 @@ def get_opacity(self) -> float: def set_flat_stroke(self, flat_stroke: bool = True, recurse: bool = True): for mob in self.get_family(recurse): - mob.uniforms["flat_stroke"] = np.asarray(float(flat_stroke)) + mob.uniforms["flat_stroke"] = float(flat_stroke) return self def get_flat_stroke(self) -> bool: @@ -461,11 +455,11 @@ def get_flat_stroke(self) -> bool: def set_joint_type(self, joint_type: LineJointType, recurse: bool = True): for mob in self.get_family(recurse): - mob.uniforms["joint_type"] = np.asarray(joint_type.value) + mob.uniforms["joint_type"] = float(joint_type.value) return self def get_joint_type(self) -> LineJointType: - return LineJointType(int(self.uniforms["joint_type"][0])) + return LineJointType(int(self.uniforms["joint_type"])) # Points def set_anchors_and_handles(self, anchors1, handles, anchors2): @@ -1457,7 +1451,7 @@ def get_triangulation(self): if not self.needs_new_triangulation: return self.triangulation - points = self.get_points() + points = self.points if len(points) <= 1: self.triangulation = np.zeros(0, dtype="i4") diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 78440bd243..87d7cc95fa 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -493,7 +493,7 @@ def set_shader_uniforms( value = tuple(value) shader[name].value = value else: - logger.warning(f"Uniform {name} not found in shader {shader}") + logger.debug(f"Uniform {name} not found in shader {shader}") def refresh_perspective_uniforms(self) -> None: frame = self.frame diff --git a/manim/renderer/shader.py b/manim/renderer/shader.py index dc28222489..b695e7ae62 100644 --- a/manim/renderer/shader.py +++ b/manim/renderer/shader.py @@ -24,6 +24,7 @@ def get_shader_code_from_file(file_path: Path) -> str: + # TODO: Is this code used ? if file_path in file_path_to_code_map: return file_path_to_code_map[file_path] source = file_path.read_text() diff --git a/manim/renderer/shader_wrapper.py b/manim/renderer/shader_wrapper.py index f80c29c474..7c562d2eb7 100644 --- a/manim/renderer/shader_wrapper.py +++ b/manim/renderer/shader_wrapper.py @@ -29,10 +29,11 @@ def find_file(file_name: Path, directories: list[Path]) -> Path: return file_name possible_paths = (directory / file_name for directory in directories) for path in possible_paths: + logger.debug(f"Searching for {file_name} in {path}") if path.exists(): return path else: - logger.debug(f"{path} does not exist.") + logger.debug(f"shader_wrapper.py::find_file() : {path} does not exist.") raise OSError(f"{file_name} not Found") @@ -136,9 +137,14 @@ def create_program_id(self): def init_program_code(self): def get_code(name: str) -> str | None: - return get_shader_code_from_file( - self.shader_folder / f"{name}.glsl", - ) + path = self.shader_folder / f"{name}.glsl" + logger.debug(f"Reading {name}.glsl shader code from {path.absolute()}") + code = get_shader_code_from_file(path) + if code is not None: + logger.debug( + f"=============================================\n{code}\n=============================================" + ) + return code self.program_code = { "vertex_shader": get_code("vert"), @@ -190,13 +196,13 @@ def read_in(self, *shader_wrappers: ShaderWrapper) -> ShaderWrapper: def get_shader_code_from_file(filename: Path) -> str | None: if filename in filename_to_code_map: return filename_to_code_map[filename] - try: filepath = find_file( filename, directories=[get_shader_dir(), Path("/")], ) except OSError: + logger.warning(f"Could not find shader file {filename}") return None result = filepath.read_text() @@ -206,17 +212,25 @@ def get_shader_code_from_file(filename: Path) -> str | None: # passing to ctx.program for compiling # Replace "#INSERT " lines with relevant code insertions = re.findall( - r"^#include ../include/.*\.glsl$", + r"^#include.*", result, flags=re.MULTILINE, ) for line in insertions: + include_path = line.strip().replace("#include", "") + include_path = include_path.replace('"', "") + path = (filepath.parent / Path(include_path.strip())).resolve() + logger.debug(f"Trying to get code from: {path} to include in {filepath.name}") inserted_code = get_shader_code_from_file( - Path() / "include" / line.replace("#include ../include/", ""), + path, ) if inserted_code is None: return None - result = result.replace(line, inserted_code) + + result = result.replace( + line, + f"// Start include of: {include_path}\n\n{inserted_code}\n\n// End include of: {include_path}", + ) filename_to_code_map[filename] = result return result diff --git a/manim/renderer/shaders/design.frag b/manim/renderer/shaders/design.frag index e84e3984af..9de2185efd 100644 --- a/manim/renderer/shaders/design.frag +++ b/manim/renderer/shaders/design.frag @@ -2,14 +2,15 @@ out vec4 frag_color; -void main() { - vec2 st = gl_FragCoord.xy / vec2(854, 360); - vec3 color = vec3(0.0); +void main() +{ + vec2 st = gl_FragCoord.xy / vec2(854, 360); + vec3 color = vec3(0.0); - st *= 3.0; - st = fract(st); + st *= 3.0; + st = fract(st); - color = vec3(st, 0.0); + color = vec3(st, 0.0); - frag_color = vec4(color, 1.0); + frag_color = vec4(color, 1.0); } diff --git a/manim/renderer/shaders/design_2.frag b/manim/renderer/shaders/design_2.frag index 02c91490d0..2eb24d5c83 100644 --- a/manim/renderer/shaders/design_2.frag +++ b/manim/renderer/shaders/design_2.frag @@ -3,43 +3,45 @@ uniform vec2 u_resolution; out vec4 frag_color; - #define PI 3.14159265358979323846 -vec2 rotate2D(vec2 _st, float _angle){ +vec2 rotate2D(vec2 _st, float _angle) +{ _st -= 0.5; - _st = mat2(cos(_angle),-sin(_angle), - sin(_angle),cos(_angle)) * _st; + _st = mat2(cos(_angle), -sin(_angle), sin(_angle), cos(_angle)) * _st; _st += 0.5; return _st; } -vec2 tile(vec2 _st, float _zoom){ +vec2 tile(vec2 _st, float _zoom) +{ _st *= _zoom; return fract(_st); } -float box(vec2 _st, vec2 _size, float _smoothEdges){ - _size = vec2(0.5)-_size*0.5; - vec2 aa = vec2(_smoothEdges*0.5); - vec2 uv = smoothstep(_size,_size+aa,_st); - uv *= smoothstep(_size,_size+aa,vec2(1.0)-_st); - return uv.x*uv.y; +float box(vec2 _st, vec2 _size, float _smoothEdges) +{ + _size = vec2(0.5) - _size * 0.5; + vec2 aa = vec2(_smoothEdges * 0.5); + vec2 uv = smoothstep(_size, _size + aa, _st); + uv *= smoothstep(_size, _size + aa, vec2(1.0) - _st); + return uv.x * uv.y; } -void main(void){ - vec2 st = gl_FragCoord.xy/u_resolution.xy; +void main(void) +{ + vec2 st = gl_FragCoord.xy / u_resolution.xy; vec3 color = vec3(0.0); // Divide the space in 4 - st = tile(st,4.); + st = tile(st, 4.); // Use a matrix to rotate the space 45 degrees - st = rotate2D(st,PI*0.25); + st = rotate2D(st, PI * 0.25); // Draw a square - color = vec3(box(st,vec2(0.7),0.01)); + color = vec3(box(st, vec2(0.7), 0.01)); // color = vec3(st,0.0); - frag_color = vec4(color,1.0); + frag_color = vec4(color, 1.0); } diff --git a/manim/renderer/shaders/design_3.frag b/manim/renderer/shaders/design_3.frag index 6a0e601c70..8d7d31f5ee 100644 --- a/manim/renderer/shaders/design_3.frag +++ b/manim/renderer/shaders/design_3.frag @@ -4,56 +4,65 @@ uniform vec3 u_resolution; uniform float u_time; out vec4 frag_color; -vec3 palette(float d){ - return mix(vec3(0.2,0.7,0.9),vec3(1.,0.,1.),d); +vec3 palette(float d) +{ + return mix(vec3(0.2, 0.7, 0.9), vec3(1., 0., 1.), d); } -vec2 rotate(vec2 p,float a){ - float c = cos(a); +vec2 rotate(vec2 p, float a) +{ + float c = cos(a); float s = sin(a); - return p*mat2(c,s,-s,c); + return p * mat2(c, s, -s, c); } -float map(vec3 p){ - for( int i = 0; i<8; ++i){ - float t = u_time*0.1; - p.xz =rotate(p.xz,t); - p.xy =rotate(p.xy,t*1.89); +float map(vec3 p) +{ + for (int i = 0; i < 8; ++i) + { + float t = u_time * 0.1; + p.xz = rotate(p.xz, t); + p.xy = rotate(p.xy, t * 1.89); p.xz = abs(p.xz); - p.xz-=.5; - } - return dot(sign(p),p)/5.; + p.xz -= .5; + } + return dot(sign(p), p) / 5.; } -vec4 rm (vec3 ro, vec3 rd){ +vec4 rm(vec3 ro, vec3 rd) +{ float t = 0.; vec3 col = vec3(0.); float d; - for(float i =0.; i<64.; i++){ - vec3 p = ro + rd*t; - d = map(p)*.5; - if(d<0.02){ + for (float i = 0.; i < 64.; i++) + { + vec3 p = ro + rd * t; + d = map(p) * .5; + if (d < 0.02) + { break; } - if(d>100.){ - break; + if (d > 100.) + { + break; } - //col+=vec3(0.6,0.8,0.8)/(400.*(d)); - col+=palette(length(p)*.1)/(400.*(d)); - t+=d; + // col+=vec3(0.6,0.8,0.8)/(400.*(d)); + col += palette(length(p) * .1) / (400. * (d)); + t += d; } - return vec4(col,1./(d*100.)); + return vec4(col, 1. / (d * 100.)); } -void main(void){ - vec2 uv = (gl_FragCoord.xy-(u_resolution.xy/2.))/u_resolution.x; - vec3 ro = vec3(0.,0.,-50.); - ro.xz = rotate(ro.xz,u_time); +void main(void) +{ + vec2 uv = (gl_FragCoord.xy - (u_resolution.xy / 2.)) / u_resolution.x; + vec3 ro = vec3(0., 0., -50.); + ro.xz = rotate(ro.xz, u_time); vec3 cf = normalize(-ro); - vec3 cs = normalize(cross(cf,vec3(0.,1.,0.))); - vec3 cu = normalize(cross(cf,cs)); - vec3 uuv = ro+cf*3. + uv.x*cs + uv.y*cu; - vec3 rd = normalize(uuv-ro); - vec4 col = rm(ro,rd); + vec3 cs = normalize(cross(cf, vec3(0., 1., 0.))); + vec3 cu = normalize(cross(cf, cs)); + vec3 uuv = ro + cf * 3. + uv.x * cs + uv.y * cu; + vec3 rd = normalize(uuv - ro); + vec4 col = rm(ro, rd); frag_color = vec4(col.xyz, 1); } diff --git a/manim/renderer/shaders/include/add_light.glsl b/manim/renderer/shaders/include/add_light.glsl index cc62919944..f34899a0a5 100644 --- a/manim/renderer/shaders/include/add_light.glsl +++ b/manim/renderer/shaders/include/add_light.glsl @@ -1,19 +1,17 @@ ///// INSERT COLOR_MAP FUNCTION HERE ///// -vec4 add_light(vec4 color, - vec3 point, - vec3 unit_normal, - vec3 light_coords, - float gloss, - float shadow){ +vec4 add_light(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, float gloss, float shadow) +{ ///// INSERT COLOR FUNCTION HERE ///// // The line above may be replaced by arbitrary code snippets, as per // the method Mobject.set_color_by_code - if(gloss == 0.0 && shadow == 0.0) return color; + if (gloss == 0.0 && shadow == 0.0) + return color; // TODO, do we actually want this? It effectively treats surfaces as two-sided - if(unit_normal.z < 0){ - unit_normal *= -1; + if (unit_normal.z < 0) + { + unit_normal *= -1; } // TODO, read this in as a uniform? @@ -26,18 +24,11 @@ vec4 add_light(vec4 color, float shine = gloss * exp(-3 * pow(1 - dot_prod, 2)); float dp2 = dot(normalize(to_light), unit_normal); float darkening = mix(1, max(dp2, 0), shadow); - return vec4( - darkening * mix(color.rgb, vec3(1.0), shine), - color.a - ); + return vec4(darkening * mix(color.rgb, vec3(1.0), shine), color.a); } -vec4 finalize_color(vec4 color, - vec3 point, - vec3 unit_normal, - vec3 light_coords, - float gloss, - float shadow){ +vec4 finalize_color(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, float gloss, float shadow) +{ // Put insertion here instead return add_light(color, point, unit_normal, light_coords, gloss, shadow); } diff --git a/manim/renderer/shaders/include/position_point_into_frame.glsl b/manim/renderer/shaders/include/position_point_into_frame.glsl index 2e02957957..f8d5f3859c 100644 --- a/manim/renderer/shaders/include/position_point_into_frame.glsl +++ b/manim/renderer/shaders/include/position_point_into_frame.glsl @@ -3,16 +3,19 @@ // uniform vec3 camera_offset; // uniform mat3 camera_rotation; -vec3 rotate_point_into_frame(vec3 point){ - if(bool(is_fixed_in_frame)){ +vec3 rotate_point_into_frame(vec3 point) +{ + if (bool(is_fixed_in_frame)) + { return point; } return camera_rotation * point; } - -vec3 position_point_into_frame(vec3 point){ - if(bool(is_fixed_in_frame)){ +vec3 position_point_into_frame(vec3 point) +{ + if (bool(is_fixed_in_frame)) + { return point; } return rotate_point_into_frame(point - camera_offset); diff --git a/manim/renderer/shaders/manim_coords/frag.glsl b/manim/renderer/shaders/manim_coords/frag.glsl index 2a721a51ea..cf8bedde45 100644 --- a/manim/renderer/shaders/manim_coords/frag.glsl +++ b/manim/renderer/shaders/manim_coords/frag.glsl @@ -3,6 +3,7 @@ uniform vec4 u_color; out vec4 frag_color; -void main() { - frag_color = u_color; +void main() +{ + frag_color = u_color; } diff --git a/manim/renderer/shaders/manim_coords/vert.glsl b/manim/renderer/shaders/manim_coords/vert.glsl index e12bd25a37..259f9cb620 100644 --- a/manim/renderer/shaders/manim_coords/vert.glsl +++ b/manim/renderer/shaders/manim_coords/vert.glsl @@ -4,7 +4,8 @@ in vec4 in_vert; uniform mat4 u_model_view_matrix; uniform mat4 u_projection_matrix; -void main() { +void main() +{ vec4 camera_space_vertex = u_model_view_matrix * in_vert; vec4 clip_space_vertex = u_projection_matrix * camera_space_vertex; gl_Position = clip_space_vertex; diff --git a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl index eb97961a69..317f1ced2c 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl @@ -1,6 +1,6 @@ #version 330 -#include ../ include / camera_uniform_declarations.glsl +#include "../include/camera_uniform_declarations.glsl" in vec4 color; in float fill_all; // Either 0 or 1 @@ -20,7 +20,7 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t) return dist; } -#include ../ include / quadratic_bezier_distance.glsl +#include "../include/quadratic_bezier_distance.glsl" float sdf() { @@ -40,7 +40,8 @@ float sdf() // as y = x^2. mat2 to_simple_space = mat2(v2, 0, 2 - u2, 4 * v2); vec2 p = to_simple_space * uv_coords; - // Sign takes care of whether we should be filling the inside or outside of curve. + // Sign takes care of whether we should be filling the inside or outside of + // curve. float sgn = orientation * sign(v2); float Fp = (p.x * p.x - p.y); if (sgn * Fp <= 0) diff --git a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl index 58fa4140fe..57d02ae6e8 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl @@ -36,10 +36,14 @@ out float bezier_degree; vec3 unit_normal; // Analog of import for manim only -#include ../include/quadratic_bezier_geometry_functions.glsl -#include ../include/get_gl_Position.glsl -#include ../include/get_unit_normal.glsl -#include ../include/finalize_color.glsl +// Comment to prevent formatting +#include "../include/quadratic_bezier_geometry_functions.glsl" +// +#include "../include/get_gl_Position.glsl" +// +#include "../include/get_unit_normal.glsl" +// +#include "../include/finalize_color.glsl" void emit_vertex_wrapper(vec3 point, int index) { @@ -67,7 +71,8 @@ void emit_pentagon(vec3[3] points, vec3 normal) // Tangent vectors vec3 t01 = normalize(p1 - p0); vec3 t12 = normalize(p2 - p1); - // Vectors perpendicular to the curve in the plane of the curve pointing outside the curve + // Vectors perpendicular to the curve in the plane of the curve pointing + // outside the curve vec3 p0_perp = cross(t01, normal); vec3 p2_perp = cross(t12, normal); diff --git a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl index e93c721b16..08d65abbe3 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl @@ -1,6 +1,6 @@ #version 330 -#include ../include/camera_uniform_declarations.glsl +#include "../include/camera_uniform_declarations.glsl" in vec3 point; in float orientation; @@ -10,15 +10,15 @@ in float vert_index; out vec3 bp; // Bezier control point out float v_orientation; out vec4 v_color; -out float v_vert_index +out float v_vert_index; // Analog of import for manim only -#include ../include/position_point_into_frame.glsl +#include "../include/position_point_into_frame.glsl" void main() { bp = position_point_into_frame(point); v_orientation = orientation; v_color = color; - v_vert_index = vert_index -} + v_vert_index = vert_index; +} \ No newline at end of file diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl index 8cf383a058..c37c7d70d0 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl @@ -1,6 +1,6 @@ #version 330 -#include ../include/camera_uniform_declarations.glsl +#include "../include/camera_uniform_declarations.glsl" in vec2 uv_coords; in vec2 uv_b2; @@ -20,25 +20,25 @@ in float bezier_degree; out vec4 frag_color; - -float cross2d(vec2 v, vec2 w){ +float cross2d(vec2 v, vec2 w) +{ return v.x * w.y - w.x * v.y; } - -float modify_distance_for_endpoints(vec2 p, float dist, float t){ +float modify_distance_for_endpoints(vec2 p, float dist, float t) +{ float buff = 0.5 * uv_stroke_width - uv_anti_alias_width; // Check the beginning of the curve - if(t == 0){ + if (t == 0) + { // Clip the start - if(has_prev == 0) return max(dist, -p.x + buff); + if (has_prev == 0) + return max(dist, -p.x + buff); // Bevel start - if(bevel_start == 1){ + if (bevel_start == 1) + { float a = angle_from_prev; - mat2 rot = mat2( - cos(a), sin(a), - -sin(a), cos(a) - ); + mat2 rot = mat2(cos(a), sin(a), -sin(a), cos(a)); // Dist for intersection of two lines float bevel_d = max(abs(p.y), abs((rot * p).y)); // Dist for union of this intersection with the real curve @@ -47,30 +47,29 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t){ return max(min(dist, bevel_d), dist / 2); } // Otherwise, start will be rounded off - }else if(t == 1){ + } + else if (t == 1) + { // Check the end of the curve // TODO, too much code repetition vec2 v21 = (bezier_degree == 2) ? vec2(1, 0) - uv_b2 : vec2(-1, 0); float len_v21 = length(v21); - if(len_v21 == 0){ + if (len_v21 == 0) + { v21 = -uv_b2; len_v21 = length(v21); } float perp_dist = dot(p - uv_b2, v21) / len_v21; - if(has_next == 0) return max(dist, -perp_dist + buff); + if (has_next == 0) + return max(dist, -perp_dist + buff); // Bevel end - if(bevel_end == 1){ + if (bevel_end == 1) + { float a = -angle_to_next; - mat2 rot = mat2( - cos(a), sin(a), - -sin(a), cos(a) - ); + mat2 rot = mat2(cos(a), sin(a), -sin(a), cos(a)); vec2 v21_unit = v21 / length(v21); - float bevel_d = max( - abs(cross2d(p - uv_b2, v21_unit)), - abs(cross2d((rot * (p - uv_b2)), v21_unit)) - ); + float bevel_d = max(abs(cross2d(p - uv_b2, v21_unit)), abs(cross2d((rot * (p - uv_b2)), v21_unit))); return max(min(dist, bevel_d), dist / 2); } // Otherwise, end will be rounded off @@ -78,12 +77,12 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t){ return dist; } +#include "../include/quadratic_bezier_distance.glsl" -#include ../include/quadratic_bezier_distance.glsl - - -void main() { - if (uv_stroke_width == 0) discard; +void main() +{ + if (uv_stroke_width == 0) + discard; float dist_to_curve = min_dist_to_curve(uv_coords, uv_b2, bezier_degree); // An sdf for the region around the curve we wish to color. float signed_dist = abs(dist_to_curve) - 0.5 * uv_stroke_width; diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl index 394f7e6f78..ce28fc6241 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl @@ -1,7 +1,7 @@ #version 330 -layout (triangles) in; -layout (triangle_strip, max_vertices = 5) out; +layout(triangles) in; +layout(triangle_strip, max_vertices = 5) out; // Needed for get_gl_Position uniform vec2 frame_shape; @@ -12,7 +12,7 @@ uniform float is_fixed_in_frame; uniform float anti_alias_width; uniform float flat_stroke; -//Needed for lighting +// Needed for lighting uniform vec3 light_source_position; uniform vec3 camera_position; uniform float joint_type; @@ -52,54 +52,61 @@ const float BEVEL_JOINT = 2; const float MITER_JOINT = 3; const float PI = 3.141592653; -#include ../include/quadratic_bezier_geometry_functions.glsl -#include ../include/get_gl_Position.glsl -#include ../include/get_unit_normal.glsl -#include ../include/finalize_color.glsl +#include "../include/finalize_color.glsl" +#include "../include/get_gl_Position.glsl" +#include "../include/get_unit_normal.glsl" +#include "../include/quadratic_bezier_geometry_functions.glsl" - -void flatten_points(in vec3[3] points, out vec2[3] flat_points){ - for(int i = 0; i < 3; i++){ +void flatten_points(in vec3[3] points, out vec2[3] flat_points) +{ + for (int i = 0; i < 3; i++) + { float sf = perspective_scale_factor(points[i].z, focal_distance); flat_points[i] = sf * points[i].xy; } } - -float angle_between_vectors(vec2 v1, vec2 v2){ +float angle_between_vectors(vec2 v1, vec2 v2) +{ float v1_norm = length(v1); float v2_norm = length(v2); - if(v1_norm == 0 || v2_norm == 0) return 0.0; + if (v1_norm == 0 || v2_norm == 0) + return 0.0; float dp = dot(v1, v2) / (v1_norm * v2_norm); float angle = acos(clamp(dp, -1.0, 1.0)); float sn = sign(cross2d(v1, v2)); return sn * angle; } - -bool find_intersection(vec2 p0, vec2 v0, vec2 p1, vec2 v1, out vec2 intersection){ +bool find_intersection(vec2 p0, vec2 v0, vec2 p1, vec2 v1, out vec2 intersection) +{ // Find the intersection of a line passing through // p0 in the direction v0 and one passing through p1 in // the direction p1. // That is, find a solutoin to p0 + v0 * t = p1 + v1 * s float det = -v0.x * v1.y + v1.x * v0.y; - if(det == 0) return false; + if (det == 0) + return false; float t = cross2d(p0 - p1, v1) / det; intersection = p0 + v0 * t; return true; } - -void create_joint(float angle, vec2 unit_tan, float buff, - vec2 static_c0, out vec2 changing_c0, - vec2 static_c1, out vec2 changing_c1){ +void create_joint(float angle, vec2 unit_tan, float buff, vec2 static_c0, out vec2 changing_c0, vec2 static_c1, + out vec2 changing_c1) +{ float shift; - if(abs(angle) < 1e-3){ + if (abs(angle) < 1e-3) + { // No joint shift = 0; - }else if(joint_type == MITER_JOINT){ + } + else if (joint_type == MITER_JOINT) + { shift = buff * (-1.0 - cos(angle)) / sin(angle); - }else{ + } + else + { // For a Bevel joint shift = buff * (1.0 - cos(angle)) / sin(angle); } @@ -107,11 +114,11 @@ void create_joint(float angle, vec2 unit_tan, float buff, changing_c1 = static_c1 + shift * unit_tan; } - // This function is responsible for finding the corners of // a bounding region around the bezier curve, which can be // emitted as a triangle fan -int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 corners[5]){ +int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 corners[5]) +{ vec2 p0 = controls[0]; vec2 p1 = controls[1]; vec2 p2 = controls[2]; @@ -122,8 +129,8 @@ int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 c vec2 v01 = -v10; vec2 v21 = -v12; - vec2 p0_perp = vec2(-v01.y, v01.x); // Pointing to the left of the curve from p0 - vec2 p2_perp = vec2(-v12.y, v12.x); // Pointing to the left of the curve from p2 + vec2 p0_perp = vec2(-v01.y, v01.x); // Pointing to the left of the curve from p0 + vec2 p2_perp = vec2(-v12.y, v12.x); // Pointing to the left of the curve from p2 // aaw is the added width given around the polygon for antialiasing. // In case the normal is faced away from (0, 0, 1), the vector to the @@ -140,86 +147,82 @@ int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 c vec2 c3 = p2 - buff2 * p2_perp + aaw2 * v12; // Account for previous and next control points - if(has_prev > 0) create_joint(angle_from_prev, v01, buff0, c0, c0, c1, c1); - if(has_next > 0) create_joint(angle_to_next, v21, buff2, c3, c3, c2, c2); + if (has_prev > 0) + create_joint(angle_from_prev, v01, buff0, c0, c0, c1, c1); + if (has_next > 0) + create_joint(angle_to_next, v21, buff2, c3, c3, c2, c2); // Linear case is the simplest - if(degree == 1){ - // The order of corners should be for a triangle_strip. Last entry is a dummy + if (degree == 1) + { + // The order of corners should be for a triangle_strip. Last entry is a + // dummy corners = vec2[5](c0, c1, c3, c2, vec2(0.0)); return 4; } // Otherwise, form a pentagon around the curve - float orientation = sign(cross2d(v01, v12)); // Positive for ccw curves - if(orientation > 0) corners = vec2[5](c0, c1, p1, c2, c3); - else corners = vec2[5](c1, c0, p1, c3, c2); + float orientation = sign(cross2d(v01, v12)); // Positive for ccw curves + if (orientation > 0) + corners = vec2[5](c0, c1, p1, c2, c3); + else + corners = vec2[5](c1, c0, p1, c3, c2); // Replace corner[2] with convex hull point accounting for stroke width find_intersection(corners[0], v01, corners[4], v21, corners[2]); return 5; } - -void set_adjascent_info(vec2 c0, vec2 tangent, - int degree, - vec2 adj[3], - out float bevel, - out float angle - ){ +void set_adjascent_info(vec2 c0, vec2 tangent, int degree, vec2 adj[3], out float bevel, out float angle) +{ bool linear_adj = (angle_between_vectors(adj[1] - adj[0], adj[2] - adj[1]) < 1e-3); angle = angle_between_vectors(c0 - adj[1], tangent); // Decide on joint type bool one_linear = (degree == 1 || linear_adj); - bool should_bevel = ( - (joint_type == AUTO_JOINT && one_linear) || - joint_type == BEVEL_JOINT - ); + bool should_bevel = ((joint_type == AUTO_JOINT && one_linear) || joint_type == BEVEL_JOINT); bevel = should_bevel ? 1.0 : 0.0; } - -void find_joint_info(vec2 controls[3], vec2 prev[3], vec2 next[3], int degree){ +void find_joint_info(vec2 controls[3], vec2 prev[3], vec2 next[3], int degree) +{ float tol = 1e-6; // Made as floats not bools so they can be passed to the frag shader has_prev = float(distance(prev[2], controls[0]) < tol); has_next = float(distance(next[0], controls[2]) < tol); - if(bool(has_prev)){ + if (bool(has_prev)) + { vec2 tangent = controls[1] - controls[0]; - set_adjascent_info( - controls[0], tangent, degree, prev, - bevel_start, angle_from_prev - ); + set_adjascent_info(controls[0], tangent, degree, prev, bevel_start, angle_from_prev); } - if(bool(has_next)){ + if (bool(has_next)) + { vec2 tangent = controls[1] - controls[2]; - set_adjascent_info( - controls[2], tangent, degree, next, - bevel_end, angle_to_next - ); + set_adjascent_info(controls[2], tangent, degree, next, bevel_end, angle_to_next); angle_to_next *= -1; } } - -void main() { +void main() +{ // Convert control points to a standard form if they are linear or null vec3 controls[3]; vec3 prev[3]; vec3 next[3]; unit_normal = get_unit_normal(controls); bezier_degree = get_reduced_control_points(vec3[3](bp[0], bp[1], bp[2]), controls); - if(bezier_degree == 0.0) return; // Null curve + if (bezier_degree == 0.0) + return; // Null curve int degree = int(bezier_degree); get_reduced_control_points(vec3[3](prev_bp[0], prev_bp[1], prev_bp[2]), prev); get_reduced_control_points(vec3[3](next_bp[0], next_bp[1], next_bp[2]), next); - // Adjust stroke width based on distance from the camera float scaled_strokes[3]; - for(int i = 0; i < 3; i++){ + for (int i = 0; i < 3; i++) + { float sf = perspective_scale_factor(controls[i].z, focal_distance); - if(bool(flat_stroke)){ + if (bool(flat_stroke)) + { vec3 to_cam = normalize(vec3(0.0, 0.0, focal_distance) - controls[i]); sf *= abs(dot(unit_normal, to_cam)); } @@ -227,8 +230,9 @@ void main() { } // Control points are projected to the xy plane before drawing, which in turn - // gets tranlated to a uv plane. The z-coordinate information will be remembered - // by what's sent out to gl_Position, and by how it affects the lighting and stroke width + // gets tranlated to a uv plane. The z-coordinate information will be + // remembered by what's sent out to gl_Position, and by how it affects the + // lighting and stroke width vec2 flat_controls[3]; vec2 flat_prev[3]; vec2 flat_next[3]; @@ -243,7 +247,8 @@ void main() { int n_corners = get_corners(flat_controls, degree, scaled_strokes, corners); int index_map[5] = int[5](0, 0, 1, 2, 2); - if(n_corners == 4) index_map[2] = 2; + if (n_corners == 4) + index_map[2] = 2; // Find uv conversion matrix mat3 xy_to_uv = get_xy_to_uv(flat_controls[0], flat_controls[1]); @@ -252,26 +257,16 @@ void main() { uv_b2 = (xy_to_uv * vec3(flat_controls[2], 1.0)).xy; // Emit each corner - for(int i = 0; i < n_corners; i++){ + for (int i = 0; i < n_corners; i++) + { uv_coords = (xy_to_uv * vec3(corners[i], 1.0)).xy; uv_stroke_width = scaled_strokes[index_map[i]] / scale_factor; // Apply some lighting to the color before sending out. // vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z); vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z); - color = finalize_color( - v_color[index_map[i]], - xyz_coords, - unit_normal, - light_source_position, - camera_position, - reflectiveness, - gloss, - shadow - ); - gl_Position = vec4( - get_gl_Position(vec3(corners[i], 0.0)).xy, - get_gl_Position(controls[index_map[i]]).zw - ); + color = finalize_color(v_color[index_map[i]], xyz_coords, unit_normal, light_source_position, camera_position, + reflectiveness, gloss, shadow); + gl_Position = vec4(get_gl_Position(vec3(corners[i], 0.0)).xy, get_gl_Position(controls[index_map[i]]).zw); EmitVertex(); } EndPrimitive(); diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl index 0c8a07283d..f626c671ff 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl @@ -1,6 +1,6 @@ #version 330 -#include ../include/camera_uniform_declarations.glsl +#include "../include/camera_uniform_declarations.glsl" in vec3 point; in vec3 prev_point; @@ -19,7 +19,7 @@ out vec4 v_color; const float STROKE_WIDTH_CONVERSION = 0.01; -#include ../include/position_point_into_frame.glsl +#include "../include/position_point_into_frame.glsl" void main() { diff --git a/manim/renderer/shaders/simple_vert.glsl b/manim/renderer/shaders/simple_vert.glsl index f3f8162ee3..bea9442e6a 100644 --- a/manim/renderer/shaders/simple_vert.glsl +++ b/manim/renderer/shaders/simple_vert.glsl @@ -1,13 +1,14 @@ #version 330 -#include ../include/camera_uniform_declarations.glsl +#include "./include/camera_uniform_declarations.glsl" in vec3 point; // Analog of import for manim only -#include ../include/get_gl_Position.glsl -#include ../include/position_point_into_frame.glsl +#include "./include/get_gl_Position.glsl" +#include "./include/position_point_into_frame.glsl" -void main(){ +void main() +{ gl_Position = get_gl_Position(position_point_into_frame(point)); } diff --git a/manim/renderer/shaders/surface/frag.glsl b/manim/renderer/shaders/surface/frag.glsl index fb7cee13d9..717c05171c 100644 --- a/manim/renderer/shaders/surface/frag.glsl +++ b/manim/renderer/shaders/surface/frag.glsl @@ -10,15 +10,9 @@ in vec4 v_color; out vec4 frag_color; -#include ../include/finalize_color.glsl +#include "../include/finalize_color.glsl" -void main() { - frag_color = finalize_color( - v_color, - xyz_coords, - normalize(v_normal), - light_source_position, - gloss, - shadow - ); +void main() +{ + frag_color = finalize_color(v_color, xyz_coords, normalize(v_normal), light_source_position, gloss, shadow); } diff --git a/manim/renderer/shaders/surface/vert.glsl b/manim/renderer/shaders/surface/vert.glsl index 9f9293e796..7c828e02bf 100644 --- a/manim/renderer/shaders/surface/vert.glsl +++ b/manim/renderer/shaders/surface/vert.glsl @@ -1,6 +1,6 @@ #version 330 -#include ../include/camera_uniform_declarations.glsl +#include "../include/camera_uniform_declarations.glsl" in vec3 point; in vec3 du_point; @@ -11,11 +11,12 @@ out vec3 xyz_coords; out vec3 v_normal; out vec4 v_color; -#include ../include/position_point_into_frame.glsl -#include ../include/get_gl_Position.glsl -#include ../include/get_rotated_surface_unit_normal_vector.glsl +#include "../include/get_gl_Position.glsl" +#include "../include/get_rotated_surface_unit_normal_vector.glsl" +#include "../include/position_point_into_frame.glsl" -void main(){ +void main() +{ xyz_coords = position_point_into_frame(point); v_normal = get_rotated_surface_unit_normal_vector(point, du_point, dv_point); v_color = color; diff --git a/manim/renderer/shaders/test/frag.glsl b/manim/renderer/shaders/test/frag.glsl index 2cf48d39c4..d91d9e0c57 100644 --- a/manim/renderer/shaders/test/frag.glsl +++ b/manim/renderer/shaders/test/frag.glsl @@ -4,6 +4,7 @@ in vec4 v_color; out vec4 frag_color; -void main() { +void main() +{ frag_color = v_color; } diff --git a/manim/renderer/shaders/test/vert.glsl b/manim/renderer/shaders/test/vert.glsl index 850b85ce32..76ad06663c 100644 --- a/manim/renderer/shaders/test/vert.glsl +++ b/manim/renderer/shaders/test/vert.glsl @@ -5,7 +5,8 @@ in vec4 in_color; out vec4 v_color; -void main() { +void main() +{ v_color = in_color; gl_Position = vec4(in_vert, 0.0, 1.0); } diff --git a/manim/renderer/shaders/textured_surface/frag.glsl b/manim/renderer/shaders/textured_surface/frag.glsl index ff162ffa71..c3a0f2e426 100644 --- a/manim/renderer/shaders/textured_surface/frag.glsl +++ b/manim/renderer/shaders/textured_surface/frag.glsl @@ -14,29 +14,21 @@ in float v_opacity; out vec4 frag_color; -#include ../include/finalize_color.glsl +#include "../include/finalize_color.glsl" const float dark_shift = 0.2; -void main() { +void main() +{ vec4 color = texture(LightTexture, v_im_coords); - if(num_textures == 2.0){ + if (num_textures == 2.0) + { vec4 dark_color = texture(DarkTexture, v_im_coords); - float dp = dot( - normalize(light_source_position - xyz_coords), - normalize(v_normal) - ); + float dp = dot(normalize(light_source_position - xyz_coords), normalize(v_normal)); float alpha = smoothstep(-dark_shift, dark_shift, dp); color = mix(dark_color, color, alpha); } - frag_color = finalize_color( - color, - xyz_coords, - normalize(v_normal), - light_source_position, - gloss, - shadow - ); + frag_color = finalize_color(color, xyz_coords, normalize(v_normal), light_source_position, gloss, shadow); frag_color.a = v_opacity; } diff --git a/manim/renderer/shaders/textured_surface/vert.glsl b/manim/renderer/shaders/textured_surface/vert.glsl index f0573ea39b..47097146ae 100644 --- a/manim/renderer/shaders/textured_surface/vert.glsl +++ b/manim/renderer/shaders/textured_surface/vert.glsl @@ -1,6 +1,6 @@ #version 330 -#include ../include/camera_uniform_declarations.glsl +#include "../include/camera_uniform_declarations.glsl" in vec3 point; in vec3 du_point; @@ -13,11 +13,12 @@ out vec3 v_normal; out vec2 v_im_coords; out float v_opacity; -#include ../include/position_point_into_frame.glsl -#include ../include/get_gl_Position.glsl -#include ../include/get_rotated_surface_unit_normal_vector.glsl +#include "../include/get_gl_Position.glsl" +#include "../include/get_rotated_surface_unit_normal_vector.glsl" +#include "../include/position_point_into_frame.glsl" -void main(){ +void main() +{ xyz_coords = position_point_into_frame(point); v_normal = get_rotated_surface_unit_normal_vector(point, du_point, dv_point); v_im_coords = im_coords; diff --git a/manim/renderer/shaders/true_dot/frag.glsl b/manim/renderer/shaders/true_dot/frag.glsl index e5838ef7c6..7c6a209ab4 100644 --- a/manim/renderer/shaders/true_dot/frag.glsl +++ b/manim/renderer/shaders/true_dot/frag.glsl @@ -12,23 +12,18 @@ in vec2 point; out vec4 frag_color; -#include ../include/finalize_color.glsl +#include "../include/finalize_color.glsl" -void main() { +void main() +{ vec2 diff = point - center; float dist = length(diff); float signed_dist = dist - point_radius; - if (signed_dist > 0.5 * anti_alias_width){ + if (signed_dist > 0.5 * anti_alias_width) + { discard; } vec3 normal = vec3(diff / point_radius, sqrt(1 - (dist * dist) / (point_radius * point_radius))); - frag_color = finalize_color( - color, - vec3(point.xy, 0.0), - normal, - light_source_position, - gloss, - shadow - ); + frag_color = finalize_color(color, vec3(point.xy, 0.0), normal, light_source_position, gloss, shadow); frag_color.a *= smoothstep(0.5, -0.5, signed_dist / anti_alias_width); } diff --git a/manim/renderer/shaders/true_dot/geom.glsl b/manim/renderer/shaders/true_dot/geom.glsl index beca4029e6..a9cdddc393 100644 --- a/manim/renderer/shaders/true_dot/geom.glsl +++ b/manim/renderer/shaders/true_dot/geom.glsl @@ -1,7 +1,7 @@ #version 330 -layout (points) in; -layout (triangle_strip, max_vertices = 4) out; +layout(points) in; +layout(triangle_strip, max_vertices = 4) out; // Needed for get_gl_Position uniform vec2 frame_shape; @@ -20,9 +20,10 @@ out float point_radius; out vec2 center; out vec2 point; -#include ../include/get_gl_Position.glsl +#include "../include/get_gl_Position.glsl" -void main() { +void main() +{ color = v_color[0]; point_radius = v_point_radius[0]; center = v_point[0].xy; @@ -30,7 +31,8 @@ void main() { point_radius = v_point_radius[0] / max(1.0 - v_point[0].z / focal_distance / frame_shape.y, 0.0); float rpa = point_radius + anti_alias_width; - for(int i = 0; i < 4; i++){ + for (int i = 0; i < 4; i++) + { // To account for perspective int x_index = 2 * (i % 2) - 1; diff --git a/manim/renderer/shaders/true_dot/vert.glsl b/manim/renderer/shaders/true_dot/vert.glsl index 4f071018e3..a69bef9936 100644 --- a/manim/renderer/shaders/true_dot/vert.glsl +++ b/manim/renderer/shaders/true_dot/vert.glsl @@ -1,6 +1,6 @@ #version 330 -#include ../include/camera_uniform_declarations.glsl +#include "../include/camera_uniform_declarations.glsl" in vec3 point; in vec4 color; @@ -11,9 +11,10 @@ out vec3 v_point; out float v_point_radius; out vec4 v_color; -#include ../include/position_point_into_frame.glsl +#include "../include/position_point_into_frame.glsl" -void main(){ +void main() +{ v_point = position_point_into_frame(point); v_point_radius = point_radius; v_color = color; diff --git a/manim/renderer/shaders/vectorized_mobject_fill/frag.glsl b/manim/renderer/shaders/vectorized_mobject_fill/frag.glsl index 70887f2874..c42ecdb058 100644 --- a/manim/renderer/shaders/vectorized_mobject_fill/frag.glsl +++ b/manim/renderer/shaders/vectorized_mobject_fill/frag.glsl @@ -6,11 +6,15 @@ flat in int v_texture_mode; out vec4 frag_color; -void main() { +void main() +{ float curve_func = v_texture_coords[0] * v_texture_coords[0] - v_texture_coords[1]; - if (v_texture_mode * curve_func >= 0.0) { + if (v_texture_mode * curve_func >= 0.0) + { frag_color = v_color; - } else { + } + else + { discard; } } diff --git a/manim/renderer/shaders/vectorized_mobject_fill/vert.glsl b/manim/renderer/shaders/vectorized_mobject_fill/vert.glsl index 9456665f14..4a9891eea9 100644 --- a/manim/renderer/shaders/vectorized_mobject_fill/vert.glsl +++ b/manim/renderer/shaders/vectorized_mobject_fill/vert.glsl @@ -12,7 +12,8 @@ out vec4 v_color; out vec2 v_texture_coords; flat out int v_texture_mode; -void main() { +void main() +{ v_color = in_color; v_texture_coords = texture_coords; v_texture_mode = texture_mode; diff --git a/manim/renderer/shaders/vectorized_mobject_stroke/frag.glsl b/manim/renderer/shaders/vectorized_mobject_stroke/frag.glsl index 2eca6f163c..0e751eb5d7 100644 --- a/manim/renderer/shaders/vectorized_mobject_stroke/frag.glsl +++ b/manim/renderer/shaders/vectorized_mobject_stroke/frag.glsl @@ -10,36 +10,38 @@ out vec4 frag_color; // https://www.shadertoy.com/view/ltXSDB // Test if point p crosses line (a, b), returns sign of result -float testCross(vec2 a, vec2 b, vec2 p) { - return sign((b.y-a.y) * (p.x-a.x) - (b.x-a.x) * (p.y-a.y)); +float testCross(vec2 a, vec2 b, vec2 p) +{ + return sign((b.y - a.y) * (p.x - a.x) - (b.x - a.x) * (p.y - a.y)); } // Determine which side we're on (using barycentric parameterization) float signBezier(vec2 A, vec2 B, vec2 C, vec2 p) { vec2 a = C - A, b = B - A, c = p - A; - vec2 bary = vec2(c.x*b.y-b.x*c.y,a.x*c.y-c.x*a.y) / (a.x*b.y-b.x*a.y); + vec2 bary = vec2(c.x * b.y - b.x * c.y, a.x * c.y - c.x * a.y) / (a.x * b.y - b.x * a.y); vec2 d = vec2(bary.y * 0.5, 0.0) + 1.0 - bary.x - bary.y; - return mix(sign(d.x * d.x - d.y), mix(-1.0, 1.0, - step(testCross(A, B, p) * testCross(B, C, p), 0.0)), - step((d.x - d.y), 0.0)) * testCross(A, C, B); + return mix(sign(d.x * d.x - d.y), mix(-1.0, 1.0, step(testCross(A, B, p) * testCross(B, C, p), 0.0)), + step((d.x - d.y), 0.0)) * + testCross(A, C, B); } // Solve cubic equation for roots vec3 solveCubic(float a, float b, float c) { - float p = b - a*a / 3.0, p3 = p*p*p; - float q = a * (2.0*a*a - 9.0*b) / 27.0 + c; - float d = q*q + 4.0*p3 / 27.0; + float p = b - a * a / 3.0, p3 = p * p * p; + float q = a * (2.0 * a * a - 9.0 * b) / 27.0 + c; + float d = q * q + 4.0 * p3 / 27.0; float offset = -a / 3.0; - if(d >= 0.0) { + if (d >= 0.0) + { float z = sqrt(d); vec2 x = (vec2(z, -z) - q) / 2.0; - vec2 uv = sign(x)*pow(abs(x), vec2(1.0/3.0)); + vec2 uv = sign(x) * pow(abs(x), vec2(1.0 / 3.0)); return vec3(offset + uv.x + uv.y); } float v = acos(-sqrt(-27.0 / p3) * q / 2.0) / 3.0; - float m = cos(v), n = sin(v)*1.732050808; + float m = cos(v), n = sin(v) * 1.732050808; return vec3(m + m, -n - m, n - m) * sqrt(-p / 3.0) + offset; } @@ -48,38 +50,46 @@ float sdBezier(vec2 A, vec2 B, vec2 C, vec2 p) { B = mix(B + vec2(1e-4), B, abs(sign(B * 2.0 - A - C))); vec2 a = B - A, b = A - B * 2.0 + C, c = a * 2.0, d = A - p; - vec3 k = vec3(3.*dot(a,b),2.*dot(a,a)+dot(d,b),dot(d,a)) / dot(b,b); + vec3 k = vec3(3. * dot(a, b), 2. * dot(a, a) + dot(d, b), dot(d, a)) / dot(b, b); vec3 t = clamp(solveCubic(k.x, k.y, k.z), 0.0, 1.0); - vec2 pos = A + (c + b*t.x)*t.x; + vec2 pos = A + (c + b * t.x) * t.x; float dis = length(pos - p); - pos = A + (c + b*t.y)*t.y; + pos = A + (c + b * t.y) * t.y; dis = min(dis, length(pos - p)); - pos = A + (c + b*t.z)*t.z; + pos = A + (c + b * t.z) * t.z; dis = min(dis, length(pos - p)); return dis * signBezier(A, B, C, p); } // https://www.shadertoy.com/view/llcfR7 -float dLine(vec2 p1, vec2 p2, vec2 x) { - vec4 colA = vec4(clamp (5.0 - length (x - p1), 0.0, 1.0)); - vec4 colB = vec4(clamp (5.0 - length (x - p2), 0.0, 1.0)); +float dLine(vec2 p1, vec2 p2, vec2 x) +{ + vec4 colA = vec4(clamp(5.0 - length(x - p1), 0.0, 1.0)); + vec4 colB = vec4(clamp(5.0 - length(x - p2), 0.0, 1.0)); vec2 a_p1 = x - p1; vec2 p2_p1 = p2 - p1; - float h = clamp (dot (a_p1, p2_p1) / dot (p2_p1, p2_p1), 0.0, 1.0); - return length (a_p1 - p2_p1 * h); + float h = clamp(dot(a_p1, p2_p1) / dot(p2_p1, p2_p1), 0.0, 1.0); + return length(a_p1 - p2_p1 * h); } -void main() { +void main() +{ float distance; - if (v_degree == 2.0) { + if (v_degree == 2.0) + { distance = sdBezier(uv_curve[0], uv_curve[1], uv_curve[2], uv_point); - } else { + } + else + { distance = dLine(uv_curve[0], uv_curve[2], uv_point); } - if (abs(distance) < v_thickness) { + if (abs(distance) < v_thickness) + { frag_color = v_color; - } else { + } + else + { discard; } } diff --git a/manim/renderer/shaders/vectorized_mobject_stroke/vert.glsl b/manim/renderer/shaders/vectorized_mobject_stroke/vert.glsl index 63982ee71f..bdfe7fe919 100644 --- a/manim/renderer/shaders/vectorized_mobject_stroke/vert.glsl +++ b/manim/renderer/shaders/vectorized_mobject_stroke/vert.glsl @@ -15,7 +15,8 @@ out vec2 uv_point; out vec2[3] uv_curve; out vec4 v_color; -int get_degree(in vec3 points[3], out vec3 normal) { +int get_degree(in vec3 points[3], out vec3 normal) +{ float length_threshold = 1e-6; float angle_threshold = 5e-2; @@ -24,31 +25,38 @@ int get_degree(in vec3 points[3], out vec3 normal) { float dot_prod = clamp(dot(normalize(v01), normalize(v12)), -1, 1); bool aligned = acos(dot_prod) < angle_threshold; - bool distinct_01 = length(v01) > length_threshold; // v01 is considered nonzero - bool distinct_12 = length(v12) > length_threshold; // v12 is considered nonzero + bool distinct_01 = length(v01) > length_threshold; // v01 is considered nonzero + bool distinct_12 = length(v12) > length_threshold; // v12 is considered nonzero int num_distinct = int(distinct_01) + int(distinct_12); bool quadratic = (num_distinct == 2) && !aligned; bool linear = (num_distinct == 1) || ((num_distinct == 2) && aligned); bool constant = (num_distinct == 0); - if (quadratic) { + if (quadratic) + { // If the curve is quadratic pass a normal vector to the caller. normal = normalize(cross(v01, v12)); return 2; - } else if (linear) { + } + else if (linear) + { return 1; - } else { + } + else + { return 0; } } // https://iquilezles.org/www/articles/bezierbbox/bezierbbox.htm -vec4 bboxBezier(in vec2 p0, in vec2 p1, in vec2 p2) { +vec4 bboxBezier(in vec2 p0, in vec2 p1, in vec2 p2) +{ vec2 mi = min(p0, p2); vec2 ma = max(p0, p2); - if (p1.x < mi.x || p1.x > ma.x || p1.y < mi.y || p1.y > ma.y) { + if (p1.x < mi.x || p1.x > ma.x || p1.y < mi.y || p1.y > ma.y) + { vec2 t = clamp((p0 - p1) / (p0 - 2.0 * p1 + p2), 0.0, 1.0); vec2 s = 1.0 - t; vec2 q = s * s * p0 + 2.0 * s * t * p1 + t * t * p2; @@ -59,16 +67,19 @@ vec4 bboxBezier(in vec2 p0, in vec2 p1, in vec2 p2) { return vec4(mi, ma); } -vec2 convert_to_uv(vec3 x_unit, vec3 y_unit, vec3 point) { +vec2 convert_to_uv(vec3 x_unit, vec3 y_unit, vec3 point) +{ return vec2(dot(point, x_unit), dot(point, y_unit)); } -vec3 convert_from_uv(vec3 translation, vec3 x_unit, vec3 y_unit, vec2 point) { +vec3 convert_from_uv(vec3 translation, vec3 x_unit, vec3 y_unit, vec2 point) +{ vec3 untranslated_point = point[0] * x_unit + point[1] * y_unit; return untranslated_point + translation; } -void main() { +void main() +{ float thickness_multiplier = 0.004; v_color = in_color; @@ -78,26 +89,33 @@ void main() { vec3 tile_x_unit = normalize(current_curve[2] - current_curve[0]); vec3 unit_normal; vec3 tile_y_unit; - if (v_degree == 0) { + if (v_degree == 0) + { tile_y_unit = vec3(0.0, 0.0, 0.0); - } else if (v_degree == 1) { + } + else if (v_degree == 1) + { // Since the curve forms a straight line there's no way to compute a normal. unit_normal = manim_unit_normal; tile_y_unit = cross(unit_normal, tile_x_unit); - } else { + } + else + { // Prefer to use a computed normal vector rather than the one from manim. unit_normal = computed_normal; // Ensure tile_y_unit is pointing toward p1 from p0. tile_y_unit = cross(unit_normal, tile_x_unit); - if (dot(tile_y_unit, current_curve[1] - current_curve[0]) < 0) { + if (dot(tile_y_unit, current_curve[1] - current_curve[0]) < 0) + { tile_y_unit *= -1; } } // Project the curve onto the tile. - for(int i = 0; i < 3; i++) { + for (int i = 0; i < 3; i++) + { uv_curve[i] = convert_to_uv(tile_x_unit, tile_y_unit, current_curve[i]); } @@ -117,9 +135,7 @@ void main() { tile_x_vec += 2 * v_thickness * tile_x_unit; tile_y_vec += 2 * v_thickness * tile_y_unit; - vec3 tile_point = tile_origin + \ - tile_coordinate[0] * tile_x_vec + \ - tile_coordinate[1] * tile_y_vec; + vec3 tile_point = tile_origin + tile_coordinate[0] * tile_x_vec + tile_coordinate[1] * tile_y_vec; gl_Position = u_projection_matrix * u_model_view_matrix * vec4(tile_point, 1.0); uv_point = convert_to_uv(tile_x_unit, tile_y_unit, tile_point); } diff --git a/manim/renderer/shaders/vertex_colors/frag.glsl b/manim/renderer/shaders/vertex_colors/frag.glsl index dc5d0d7664..e9e2add4ce 100644 --- a/manim/renderer/shaders/vertex_colors/frag.glsl +++ b/manim/renderer/shaders/vertex_colors/frag.glsl @@ -3,6 +3,7 @@ in vec4 v_color; out vec4 frag_color; -void main() { - frag_color = v_color; +void main() +{ + frag_color = v_color; } diff --git a/manim/renderer/shaders/vertex_colors/vert.glsl b/manim/renderer/shaders/vertex_colors/vert.glsl index 944dc92806..d2f8a51420 100644 --- a/manim/renderer/shaders/vertex_colors/vert.glsl +++ b/manim/renderer/shaders/vertex_colors/vert.glsl @@ -7,7 +7,8 @@ in vec4 in_vert; in vec4 in_color; out vec4 v_color; -void main() { +void main() +{ v_color = in_color; gl_Position = u_projection_matrix * u_view_matrix * u_model_matrix * in_vert; } From f90c9a2e95dd63bc0df7a3dc0f819d6dc7430eb4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 4 Jan 2023 18:53:18 +0000 Subject: [PATCH 016/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/renderer/shaders/quadratic_bezier_fill/vert.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl index 08d65abbe3..dd1f317a98 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl @@ -21,4 +21,4 @@ void main() v_orientation = orientation; v_color = color; v_vert_index = vert_index; -} \ No newline at end of file +} From 9c40838fcb1d63397c366e49f1605817b7690e8c Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Thu, 5 Jan 2023 14:46:23 +0100 Subject: [PATCH 017/106] camera.py -> cairo_camera.py; delete other cairo camera subclasses --- docs/source/reference.rst | 6 +- manim/__init__.py | 6 +- manim/camera/{camera.py => cairo_camera.py} | 136 +---- manim/camera/mapping_camera.py | 139 ----- manim/camera/moving_camera.py | 253 --------- manim/camera/multi_camera.py | 101 ---- manim/camera/three_d_camera.py | 441 --------------- manim/mobject/mobject.py | 2 +- manim/renderer/cairo_renderer.py | 2 +- manim/renderer/opengl_renderer.py | 573 +------------------- manim/utils/hashing.py | 2 +- 11 files changed, 9 insertions(+), 1652 deletions(-) rename manim/camera/{camera.py => cairo_camera.py} (90%) delete mode 100644 manim/camera/mapping_camera.py delete mode 100644 manim/camera/moving_camera.py delete mode 100644 manim/camera/multi_camera.py delete mode 100644 manim/camera/three_d_camera.py diff --git a/docs/source/reference.rst b/docs/source/reference.rst index 5352f83223..2a662a288b 100644 --- a/docs/source/reference.rst +++ b/docs/source/reference.rst @@ -38,11 +38,7 @@ Cameras ******* .. inheritance-diagram:: - manim.camera.camera - manim.camera.mapping_camera - manim.camera.moving_camera - manim.camera.multi_camera - manim.camera.three_d_camera + manim.camera.cairo_camera :parts: 1 :top-classes: manim.camera.camera.Camera, manim.mobject.mobject.Mobject diff --git a/manim/__init__.py b/manim/__init__.py index 8e2cc4f0c1..be70f67b6a 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -37,11 +37,7 @@ from .animation.transform_matching_parts import * from .animation.updaters.mobject_update_utils import * from .animation.updaters.update import * -from .camera.camera import * -from .camera.mapping_camera import * -from .camera.moving_camera import * -from .camera.multi_camera import * -from .camera.three_d_camera import * +from .camera.cairo_camera import * from .constants import * from .mobject.frame import * from .mobject.geometry.arc import * diff --git a/manim/camera/camera.py b/manim/camera/cairo_camera.py similarity index 90% rename from manim/camera/camera.py rename to manim/camera/cairo_camera.py index 599a2c0135..846aff3a40 100644 --- a/manim/camera/camera.py +++ b/manim/camera/cairo_camera.py @@ -38,8 +38,8 @@ } -class Camera: - """Base camera class. +class CairoCamera: + """Cairo rendering implementation. This is the object which takes care of what exactly is displayed on screen at any given moment. @@ -1211,135 +1211,3 @@ def get_coords_of_all_pixels(self): centered_space_coords = centered_space_coords * (1, -1) return centered_space_coords - - -# NOTE: The methods of the following class have not been mentioned outside of their definitions. -# Their DocStrings are not as detailed as preferred. -class BackgroundColoredVMobjectDisplayer: - def __init__(self, camera: Camera): - """ - Parameters - ---------- - camera - Camera object to use. - """ - self.camera = camera - self.file_name_to_pixel_array_map = {} - self.pixel_array = np.array(camera.pixel_array) - self.reset_pixel_array() - - def reset_pixel_array(self): - self.pixel_array[:, :] = 0 - - def resize_background_array( - self, - background_array: np.ndarray, - new_width: float, - new_height: float, - mode: str = "RGBA", - ): - """Resizes the pixel array representing the background. - - Parameters - ---------- - background_array - The pixel - new_width - The new width of the background - new_height - The new height of the background - mode - The PIL image mode, by default "RGBA" - - Returns - ------- - np.array - The numpy pixel array of the resized background. - """ - image = Image.fromarray(background_array) - image = image.convert(mode) - resized_image = image.resize((new_width, new_height)) - return np.array(resized_image) - - def resize_background_array_to_match( - self, background_array: np.ndarray, pixel_array: np.ndarray - ): - """Resizes the background array to match the passed pixel array. - - Parameters - ---------- - background_array - The prospective pixel array. - pixel_array - The pixel array whose width and height should be matched. - - Returns - ------- - np.array - The resized background array. - """ - height, width = pixel_array.shape[:2] - mode = "RGBA" if pixel_array.shape[2] == 4 else "RGB" - return self.resize_background_array(background_array, width, height, mode) - - def get_background_array(self, image: Image.Image | pathlib.Path | str): - """Gets the background array that has the passed file_name. - - Parameters - ---------- - image - The background image or its file name. - - Returns - ------- - np.ndarray - The pixel array of the image. - """ - image_key = str(image) - - if image_key in self.file_name_to_pixel_array_map: - return self.file_name_to_pixel_array_map[image_key] - if isinstance(image, str): - full_path = get_full_raster_image_path(image) - image = Image.open(full_path) - back_array = np.array(image) - - pixel_array = self.pixel_array - if not np.all(pixel_array.shape == back_array.shape): - back_array = self.resize_background_array_to_match(back_array, pixel_array) - - self.file_name_to_pixel_array_map[image_key] = back_array - return back_array - - def display(self, *cvmobjects: VMobject): - """Displays the colored VMobjects. - - Parameters - ---------- - *cvmobjects - The VMobjects - - Returns - ------- - np.array - The pixel array with the `cvmobjects` displayed. - """ - batch_image_pairs = it.groupby(cvmobjects, lambda cv: cv.get_background_image()) - curr_array = None - for image, batch in batch_image_pairs: - background_array = self.get_background_array(image) - pixel_array = self.pixel_array - self.camera.display_multiple_non_background_colored_vmobjects( - batch, - pixel_array, - ) - new_array = np.array( - (background_array * pixel_array.astype("float") / 255), - dtype=self.camera.pixel_array_dtype, - ) - if curr_array is None: - curr_array = new_array - else: - curr_array = np.maximum(curr_array, new_array) - self.reset_pixel_array() - return curr_array diff --git a/manim/camera/mapping_camera.py b/manim/camera/mapping_camera.py deleted file mode 100644 index 34561c3d9c..0000000000 --- a/manim/camera/mapping_camera.py +++ /dev/null @@ -1,139 +0,0 @@ -"""A camera that allows mapping between objects.""" - -from __future__ import annotations - -__all__ = ["MappingCamera", "OldMultiCamera", "SplitScreenCamera"] - -import math - -import numpy as np - -from ..camera.camera import Camera -from ..mobject.types.vectorized_mobject import VMobject -from ..utils.config_ops import DictAsObject - -# TODO: Add an attribute to mobjects under which they can specify that they should just -# map their centers but remain otherwise undistorted (useful for labels, etc.) - - -class MappingCamera(Camera): - """Camera object that allows mapping - between objects. - """ - - def __init__( - self, - mapping_func=lambda p: p, - min_num_curves=50, - allow_object_intrusion=False, - **kwargs, - ): - self.mapping_func = mapping_func - self.min_num_curves = min_num_curves - self.allow_object_intrusion = allow_object_intrusion - super().__init__(**kwargs) - - def points_to_pixel_coords(self, mobject, points): - return super().points_to_pixel_coords( - mobject, - np.apply_along_axis(self.mapping_func, 1, points), - ) - - def capture_mobjects(self, mobjects, **kwargs): - mobjects = self.get_mobjects_to_display(mobjects, **kwargs) - if self.allow_object_intrusion: - mobject_copies = mobjects - else: - mobject_copies = [mobject.copy() for mobject in mobjects] - for mobject in mobject_copies: - if ( - isinstance(mobject, VMobject) - and 0 < mobject.get_num_curves() < self.min_num_curves - ): - mobject.insert_n_curves(self.min_num_curves) - super().capture_mobjects( - mobject_copies, - include_submobjects=False, - excluded_mobjects=None, - ) - - -# Note: This allows layering of multiple cameras onto the same portion of the pixel array, -# the later cameras overwriting the former -# -# TODO: Add optional separator borders between cameras (or perhaps peel this off into a -# CameraPlusOverlay class) - -# TODO, the classes below should likely be deleted -class OldMultiCamera(Camera): - def __init__(self, *cameras_with_start_positions, **kwargs): - self.shifted_cameras = [ - DictAsObject( - { - "camera": camera_with_start_positions[0], - "start_x": camera_with_start_positions[1][1], - "start_y": camera_with_start_positions[1][0], - "end_x": camera_with_start_positions[1][1] - + camera_with_start_positions[0].pixel_width, - "end_y": camera_with_start_positions[1][0] - + camera_with_start_positions[0].pixel_height, - }, - ) - for camera_with_start_positions in cameras_with_start_positions - ] - super().__init__(**kwargs) - - def capture_mobjects(self, mobjects, **kwargs): - for shifted_camera in self.shifted_cameras: - shifted_camera.camera.capture_mobjects(mobjects, **kwargs) - - self.pixel_array[ - shifted_camera.start_y : shifted_camera.end_y, - shifted_camera.start_x : shifted_camera.end_x, - ] = shifted_camera.camera.pixel_array - - def set_background(self, pixel_array, **kwargs): - for shifted_camera in self.shifted_cameras: - shifted_camera.camera.set_background( - pixel_array[ - shifted_camera.start_y : shifted_camera.end_y, - shifted_camera.start_x : shifted_camera.end_x, - ], - **kwargs, - ) - - def set_pixel_array(self, pixel_array, **kwargs): - super().set_pixel_array(pixel_array, **kwargs) - for shifted_camera in self.shifted_cameras: - shifted_camera.camera.set_pixel_array( - pixel_array[ - shifted_camera.start_y : shifted_camera.end_y, - shifted_camera.start_x : shifted_camera.end_x, - ], - **kwargs, - ) - - def init_background(self): - super().init_background() - for shifted_camera in self.shifted_cameras: - shifted_camera.camera.init_background() - - -# A OldMultiCamera which, when called with two full-size cameras, initializes itself -# as a split screen, also taking care to resize each individual camera within it - - -class SplitScreenCamera(OldMultiCamera): - def __init__(self, left_camera, right_camera, **kwargs): - Camera.__init__(self, **kwargs) # to set attributes such as pixel_width - self.left_camera = left_camera - self.right_camera = right_camera - - half_width = math.ceil(self.pixel_width / 2) - for camera in [self.left_camera, self.right_camera]: - camera.reset_pixel_shape(camera.pixel_height, half_width) - - super().__init__( - (left_camera, (0, 0)), - (right_camera, (0, half_width)), - ) diff --git a/manim/camera/moving_camera.py b/manim/camera/moving_camera.py deleted file mode 100644 index 1d01d01e22..0000000000 --- a/manim/camera/moving_camera.py +++ /dev/null @@ -1,253 +0,0 @@ -"""A camera able to move through a scene. - -.. SEEALSO:: - - :mod:`.moving_camera_scene` - -""" - -from __future__ import annotations - -__all__ = ["MovingCamera"] - -import numpy as np - -from .. import config -from ..camera.camera import Camera -from ..constants import DOWN, LEFT, RIGHT, UP -from ..mobject.frame import ScreenRectangle -from ..mobject.mobject import Mobject -from ..utils.color import WHITE - - -class MovingCamera(Camera): - """ - Stays in line with the height, width and position of it's 'frame', which is a Rectangle - - .. SEEALSO:: - - :class:`.MovingCameraScene` - - """ - - def __init__( - self, - frame=None, - fixed_dimension=0, # width - default_frame_stroke_color=WHITE, - default_frame_stroke_width=0, - **kwargs, - ): - """ - Frame is a Mobject, (should almost certainly be a rectangle) - determining which region of space the camera displays - """ - self.fixed_dimension = fixed_dimension - self.default_frame_stroke_color = default_frame_stroke_color - self.default_frame_stroke_width = default_frame_stroke_width - if frame is None: - frame = ScreenRectangle(height=config["frame_height"]) - frame.set_stroke( - self.default_frame_stroke_color, - self.default_frame_stroke_width, - ) - self.frame = frame - super().__init__(**kwargs) - - # TODO, make these work for a rotated frame - @property - def frame_height(self): - """Returns the height of the frame. - - Returns - ------- - float - The height of the frame. - """ - return self.frame.height - - @property - def frame_width(self): - """Returns the width of the frame - - Returns - ------- - float - The width of the frame. - """ - return self.frame.width - - @property - def frame_center(self): - """Returns the centerpoint of the frame in cartesian coordinates. - - Returns - ------- - np.array - The cartesian coordinates of the center of the frame. - """ - return self.frame.get_center() - - @frame_height.setter - def frame_height(self, frame_height: float): - """Sets the height of the frame in MUnits. - - Parameters - ---------- - frame_height - The new frame_height. - """ - self.frame.stretch_to_fit_height(frame_height) - - @frame_width.setter - def frame_width(self, frame_width: float): - """Sets the width of the frame in MUnits. - - Parameters - ---------- - frame_width - The new frame_width. - """ - self.frame.stretch_to_fit_width(frame_width) - - @frame_center.setter - def frame_center(self, frame_center: np.ndarray | list | tuple | Mobject): - """Sets the centerpoint of the frame. - - Parameters - ---------- - frame_center - The point to which the frame must be moved. - If is of type mobject, the frame will be moved to - the center of that mobject. - """ - self.frame.move_to(frame_center) - - def capture_mobjects(self, mobjects, **kwargs): - # self.reset_frame_center() - # self.realign_frame_shape() - super().capture_mobjects(mobjects, **kwargs) - - # Since the frame can be moving around, the cairo - # context used for updating should be regenerated - # at each frame. So no caching. - def get_cached_cairo_context(self, pixel_array): - """ - Since the frame can be moving around, the cairo - context used for updating should be regenerated - at each frame. So no caching. - """ - return None - - def cache_cairo_context(self, pixel_array, ctx): - """ - Since the frame can be moving around, the cairo - context used for updating should be regenerated - at each frame. So no caching. - """ - pass - - # def reset_frame_center(self): - # self.frame_center = self.frame.get_center() - - # def realign_frame_shape(self): - # height, width = self.frame_shape - # if self.fixed_dimension == 0: - # self.frame_shape = (height, self.frame.width - # else: - # self.frame_shape = (self.frame.height, width) - # self.resize_frame_shape(fixed_dimension=self.fixed_dimension) - - def get_mobjects_indicating_movement(self): - """ - Returns all mobjects whose movement implies that the camera - should think of all other mobjects on the screen as moving - - Returns - ------- - list - """ - return [self.frame] - - def auto_zoom( - self, - mobjects: list[Mobject], - margin: float = 0, - only_mobjects_in_frame: bool = False, - animate: bool = True, - ): - """Zooms on to a given array of mobjects (or a singular mobject) - and automatically resizes to frame all the mobjects. - - .. NOTE:: - - This method only works when 2D-objects in the XY-plane are considered, it - will not work correctly when the camera has been rotated. - - Parameters - ---------- - mobjects - The mobject or array of mobjects that the camera will focus on. - - margin - The width of the margin that is added to the frame (optional, 0 by default). - - only_mobjects_in_frame - If set to ``True``, only allows focusing on mobjects that are already in frame. - - animate - If set to ``False``, applies the changes instead of returning the corresponding animation - - Returns - ------- - Union[_AnimationBuilder, ScreenRectangle] - _AnimationBuilder that zooms the camera view to a given list of mobjects - or ScreenRectangle with position and size updated to zoomed position. - - """ - scene_critical_x_left = None - scene_critical_x_right = None - scene_critical_y_up = None - scene_critical_y_down = None - - for m in mobjects: - if (m == self.frame) or ( - only_mobjects_in_frame and not self.is_in_frame(m) - ): - # detected camera frame, should not be used to calculate final position of camera - continue - - # initialize scene critical points with first mobjects critical points - if scene_critical_x_left is None: - scene_critical_x_left = m.get_critical_point(LEFT)[0] - scene_critical_x_right = m.get_critical_point(RIGHT)[0] - scene_critical_y_up = m.get_critical_point(UP)[1] - scene_critical_y_down = m.get_critical_point(DOWN)[1] - - else: - if m.get_critical_point(LEFT)[0] < scene_critical_x_left: - scene_critical_x_left = m.get_critical_point(LEFT)[0] - - if m.get_critical_point(RIGHT)[0] > scene_critical_x_right: - scene_critical_x_right = m.get_critical_point(RIGHT)[0] - - if m.get_critical_point(UP)[1] > scene_critical_y_up: - scene_critical_y_up = m.get_critical_point(UP)[1] - - if m.get_critical_point(DOWN)[1] < scene_critical_y_down: - scene_critical_y_down = m.get_critical_point(DOWN)[1] - - # calculate center x and y - x = (scene_critical_x_left + scene_critical_x_right) / 2 - y = (scene_critical_y_up + scene_critical_y_down) / 2 - - # calculate proposed width and height of zoomed scene - new_width = abs(scene_critical_x_left - scene_critical_x_right) - new_height = abs(scene_critical_y_up - scene_critical_y_down) - - m_target = self.frame.animate if animate else self.frame - # zoom to fit all mobjects along the side that has the largest size - if new_width / self.frame.width > new_height / self.frame.height: - return m_target.set_x(x).set_y(y).set(width=new_width + margin) - else: - return m_target.set_x(x).set_y(y).set(height=new_height + margin) diff --git a/manim/camera/multi_camera.py b/manim/camera/multi_camera.py deleted file mode 100644 index a5202135e9..0000000000 --- a/manim/camera/multi_camera.py +++ /dev/null @@ -1,101 +0,0 @@ -"""A camera supporting multiple perspectives.""" - -from __future__ import annotations - -__all__ = ["MultiCamera"] - - -from manim.mobject.types.image_mobject import ImageMobject - -from ..camera.moving_camera import MovingCamera -from ..utils.iterables import list_difference_update - - -class MultiCamera(MovingCamera): - """Camera Object that allows for multiple perspectives.""" - - def __init__( - self, - image_mobjects_from_cameras: ImageMobject | None = None, - allow_cameras_to_capture_their_own_display=False, - **kwargs, - ): - """Initialises the MultiCamera - - Parameters - ---------- - image_mobjects_from_cameras - - kwargs - Any valid keyword arguments of MovingCamera. - """ - self.image_mobjects_from_cameras = [] - if image_mobjects_from_cameras is not None: - for imfc in image_mobjects_from_cameras: - self.add_image_mobject_from_camera(imfc) - self.allow_cameras_to_capture_their_own_display = ( - allow_cameras_to_capture_their_own_display - ) - super().__init__(**kwargs) - - def add_image_mobject_from_camera(self, image_mobject_from_camera: ImageMobject): - """Adds an ImageMobject that's been obtained from the camera - into the list ``self.image_mobject_from_cameras`` - - Parameters - ---------- - image_mobject_from_camera - The ImageMobject to add to self.image_mobject_from_cameras - """ - # A silly method to have right now, but maybe there are things - # we want to guarantee about any imfc's added later. - imfc = image_mobject_from_camera - assert isinstance(imfc.camera, MovingCamera) - self.image_mobjects_from_cameras.append(imfc) - - def update_sub_cameras(self): - """Reshape sub_camera pixel_arrays""" - for imfc in self.image_mobjects_from_cameras: - pixel_height, pixel_width = self.pixel_array.shape[:2] - imfc.camera.frame_shape = ( - imfc.camera.frame.height, - imfc.camera.frame.width, - ) - imfc.camera.reset_pixel_shape( - int(pixel_height * imfc.height / self.frame_height), - int(pixel_width * imfc.width / self.frame_width), - ) - - def reset(self): - """Resets the MultiCamera. - - Returns - ------- - MultiCamera - The reset MultiCamera - """ - for imfc in self.image_mobjects_from_cameras: - imfc.camera.reset() - super().reset() - return self - - def capture_mobjects(self, mobjects, **kwargs): - self.update_sub_cameras() - for imfc in self.image_mobjects_from_cameras: - to_add = list(mobjects) - if not self.allow_cameras_to_capture_their_own_display: - to_add = list_difference_update(to_add, imfc.get_family()) - imfc.camera.capture_mobjects(to_add, **kwargs) - super().capture_mobjects(mobjects, **kwargs) - - def get_mobjects_indicating_movement(self): - """Returns all mobjects whose movement implies that the camera - should think of all other mobjects on the screen as moving - - Returns - ------- - list - """ - return [self.frame] + [ - imfc.camera.frame for imfc in self.image_mobjects_from_cameras - ] diff --git a/manim/camera/three_d_camera.py b/manim/camera/three_d_camera.py deleted file mode 100644 index 87b48f9fa0..0000000000 --- a/manim/camera/three_d_camera.py +++ /dev/null @@ -1,441 +0,0 @@ -"""A camera that can be positioned and oriented in three-dimensional space.""" - -from __future__ import annotations - -__all__ = ["ThreeDCamera"] - - -from typing import Callable - -import numpy as np - -from manim.mobject.mobject import Mobject -from manim.mobject.three_d.three_d_utils import ( - get_3d_vmob_end_corner, - get_3d_vmob_end_corner_unit_normal, - get_3d_vmob_start_corner, - get_3d_vmob_start_corner_unit_normal, -) -from manim.mobject.value_tracker import ValueTracker - -from .. import config -from ..camera.camera import Camera -from ..constants import * -from ..mobject.types.point_cloud_mobject import Point -from ..utils.color import get_shaded_rgb -from ..utils.family import extract_mobject_family_members -from ..utils.space_ops import rotation_about_z, rotation_matrix - - -class ThreeDCamera(Camera): - def __init__( - self, - focal_distance=20.0, - shading_factor=0.2, - default_distance=5.0, - light_source_start_point=9 * DOWN + 7 * LEFT + 10 * OUT, - should_apply_shading=True, - exponential_projection=False, - phi=0, - theta=-90 * DEGREES, - gamma=0, - zoom=1, - **kwargs, - ): - """Initializes the ThreeDCamera - - Parameters - ---------- - *kwargs - Any keyword argument of Camera. - """ - self._frame_center = Point(kwargs.get("frame_center", ORIGIN), stroke_width=0) - super().__init__(**kwargs) - self.focal_distance = focal_distance - self.phi = phi - self.theta = theta - self.gamma = gamma - self.zoom = zoom - self.shading_factor = shading_factor - self.default_distance = default_distance - self.light_source_start_point = light_source_start_point - self.light_source = Point(self.light_source_start_point) - self.should_apply_shading = should_apply_shading - self.exponential_projection = exponential_projection - self.max_allowable_norm = 3 * config["frame_width"] - self.phi_tracker = ValueTracker(self.phi) - self.theta_tracker = ValueTracker(self.theta) - self.focal_distance_tracker = ValueTracker(self.focal_distance) - self.gamma_tracker = ValueTracker(self.gamma) - self.zoom_tracker = ValueTracker(self.zoom) - self.fixed_orientation_mobjects = {} - self.fixed_in_frame_mobjects = set() - self.reset_rotation_matrix() - - @property - def frame_center(self): - return self._frame_center.points[0] - - @frame_center.setter - def frame_center(self, point): - self._frame_center.move_to(point) - - def capture_mobjects(self, mobjects, **kwargs): - self.reset_rotation_matrix() - super().capture_mobjects(mobjects, **kwargs) - - def get_value_trackers(self): - """Returns list of ValueTrackers of phi, theta, focal_distance and gamma - - Returns - ------- - list - list of ValueTracker objects - """ - return [ - self.phi_tracker, - self.theta_tracker, - self.focal_distance_tracker, - self.gamma_tracker, - self.zoom_tracker, - ] - - def modified_rgbas(self, vmobject, rgbas): - if not self.should_apply_shading: - return rgbas - if vmobject.shade_in_3d and (vmobject.get_num_points() > 0): - light_source_point = self.light_source.points[0] - if len(rgbas) < 2: - shaded_rgbas = rgbas.repeat(2, axis=0) - else: - shaded_rgbas = np.array(rgbas[:2]) - shaded_rgbas[0, :3] = get_shaded_rgb( - shaded_rgbas[0, :3], - get_3d_vmob_start_corner(vmobject), - get_3d_vmob_start_corner_unit_normal(vmobject), - light_source_point, - ) - shaded_rgbas[1, :3] = get_shaded_rgb( - shaded_rgbas[1, :3], - get_3d_vmob_end_corner(vmobject), - get_3d_vmob_end_corner_unit_normal(vmobject), - light_source_point, - ) - return shaded_rgbas - return rgbas - - def get_stroke_rgbas( - self, - vmobject, - background=False, - ): # NOTE : DocStrings From parent - return self.modified_rgbas(vmobject, vmobject.get_stroke_rgbas(background)) - - def get_fill_rgbas(self, vmobject): # NOTE : DocStrings From parent - return self.modified_rgbas(vmobject, vmobject.get_fill_rgbas()) - - def get_mobjects_to_display(self, *args, **kwargs): # NOTE : DocStrings From parent - mobjects = super().get_mobjects_to_display(*args, **kwargs) - rot_matrix = self.get_rotation_matrix() - - def z_key(mob): - if not (hasattr(mob, "shade_in_3d") and mob.shade_in_3d): - return np.inf - # Assign a number to a three dimensional mobjects - # based on how close it is to the camera - return np.dot(mob.get_z_index_reference_point(), rot_matrix.T)[2] - - return sorted(mobjects, key=z_key) - - def get_phi(self): - """Returns the Polar angle (the angle off Z_AXIS) phi. - - Returns - ------- - float - The Polar angle in radians. - """ - return self.phi_tracker.get_value() - - def get_theta(self): - """Returns the Azimuthal i.e the angle that spins the camera around the Z_AXIS. - - Returns - ------- - float - The Azimuthal angle in radians. - """ - return self.theta_tracker.get_value() - - def get_focal_distance(self): - """Returns focal_distance of the Camera. - - Returns - ------- - float - The focal_distance of the Camera in MUnits. - """ - return self.focal_distance_tracker.get_value() - - def get_gamma(self): - """Returns the rotation of the camera about the vector from the ORIGIN to the Camera. - - Returns - ------- - float - The angle of rotation of the camera about the vector - from the ORIGIN to the Camera in radians - """ - return self.gamma_tracker.get_value() - - def get_zoom(self): - """Returns the zoom amount of the camera. - - Returns - ------- - float - The zoom amount of the camera. - """ - return self.zoom_tracker.get_value() - - def set_phi(self, value: float): - """Sets the polar angle i.e the angle between Z_AXIS and Camera through ORIGIN in radians. - - Parameters - ---------- - value - The new value of the polar angle in radians. - """ - self.phi_tracker.set_value(value) - - def set_theta(self, value: float): - """Sets the azimuthal angle i.e the angle that spins the camera around Z_AXIS in radians. - - Parameters - ---------- - value - The new value of the azimuthal angle in radians. - """ - self.theta_tracker.set_value(value) - - def set_focal_distance(self, value: float): - """Sets the focal_distance of the Camera. - - Parameters - ---------- - value - The focal_distance of the Camera. - """ - self.focal_distance_tracker.set_value(value) - - def set_gamma(self, value: float): - """Sets the angle of rotation of the camera about the vector from the ORIGIN to the Camera. - - Parameters - ---------- - value - The new angle of rotation of the camera. - """ - self.gamma_tracker.set_value(value) - - def set_zoom(self, value: float): - """Sets the zoom amount of the camera. - - Parameters - ---------- - value - The zoom amount of the camera. - """ - self.zoom_tracker.set_value(value) - - def reset_rotation_matrix(self): - """Sets the value of self.rotation_matrix to - the matrix corresponding to the current position of the camera - """ - self.rotation_matrix = self.generate_rotation_matrix() - - def get_rotation_matrix(self): - """Returns the matrix corresponding to the current position of the camera. - - Returns - ------- - np.array - The matrix corresponding to the current position of the camera. - """ - return self.rotation_matrix - - def generate_rotation_matrix(self): - """Generates a rotation matrix based off the current position of the camera. - - Returns - ------- - np.array - The matrix corresponding to the current position of the camera. - """ - phi = self.get_phi() - theta = self.get_theta() - gamma = self.get_gamma() - matrices = [ - rotation_about_z(-theta - 90 * DEGREES), - rotation_matrix(-phi, RIGHT), - rotation_about_z(gamma), - ] - result = np.identity(3) - for matrix in matrices: - result = np.dot(matrix, result) - return result - - def project_points(self, points: np.ndarray | list): - """Applies the current rotation_matrix as a projection - matrix to the passed array of points. - - Parameters - ---------- - points - The list of points to project. - - Returns - ------- - np.array - The points after projecting. - """ - frame_center = self.frame_center - focal_distance = self.get_focal_distance() - zoom = self.get_zoom() - rot_matrix = self.get_rotation_matrix() - - points = points - frame_center - points = np.dot(points, rot_matrix.T) - zs = points[:, 2] - for i in 0, 1: - if self.exponential_projection: - # Proper projection would involve multiplying - # x and y by d / (d-z). But for points with high - # z value that causes weird artifacts, and applying - # the exponential helps smooth it out. - factor = np.exp(zs / focal_distance) - lt0 = zs < 0 - factor[lt0] = focal_distance / (focal_distance - zs[lt0]) - else: - factor = focal_distance / (focal_distance - zs) - factor[(focal_distance - zs) < 0] = 10**6 - points[:, i] *= factor * zoom - return points - - def project_point(self, point: list | np.ndarray): - """Applies the current rotation_matrix as a projection - matrix to the passed point. - - Parameters - ---------- - point - The point to project. - - Returns - ------- - np.array - The point after projection. - """ - return self.project_points(point.reshape((1, 3)))[0, :] - - def transform_points_pre_display( - self, - mobject, - points, - ): # TODO: Write Docstrings for this Method. - points = super().transform_points_pre_display(mobject, points) - fixed_orientation = mobject in self.fixed_orientation_mobjects - fixed_in_frame = mobject in self.fixed_in_frame_mobjects - - if fixed_in_frame: - return points - if fixed_orientation: - center_func = self.fixed_orientation_mobjects[mobject] - center = center_func() - new_center = self.project_point(center) - return points + (new_center - center) - else: - return self.project_points(points) - - def add_fixed_orientation_mobjects( - self, - *mobjects: Mobject, - use_static_center_func: bool = False, - center_func: Callable[[], np.ndarray] | None = None, - ): - """This method allows the mobject to have a fixed orientation, - even when the camera moves around. - E.G If it was passed through this method, facing the camera, it - will continue to face the camera even as the camera moves. - Highly useful when adding labels to graphs and the like. - - Parameters - ---------- - *mobjects - The mobject whose orientation must be fixed. - use_static_center_func - Whether or not to use the function that takes the mobject's - center as centerpoint, by default False - center_func - The function which returns the centerpoint - with respect to which the mobject will be oriented, by default None - """ - # This prevents the computation of mobject.get_center - # every single time a projection happens - def get_static_center_func(mobject): - point = mobject.get_center() - return lambda: point - - for mobject in mobjects: - if center_func: - func = center_func - elif use_static_center_func: - func = get_static_center_func(mobject) - else: - func = mobject.get_center - for submob in mobject.get_family(): - self.fixed_orientation_mobjects[submob] = func - - def add_fixed_in_frame_mobjects(self, *mobjects: Mobject): - """This method allows the mobject to have a fixed position, - even when the camera moves around. - E.G If it was passed through this method, at the top of the frame, it - will continue to be displayed at the top of the frame. - - Highly useful when displaying Titles or formulae or the like. - - Parameters - ---------- - **mobjects - The mobject to fix in frame. - """ - for mobject in extract_mobject_family_members(mobjects): - self.fixed_in_frame_mobjects.add(mobject) - - def remove_fixed_orientation_mobjects(self, *mobjects: Mobject): - """If a mobject was fixed in its orientation by passing it through - :meth:`.add_fixed_orientation_mobjects`, then this undoes that fixing. - The Mobject will no longer have a fixed orientation. - - Parameters - ---------- - mobjects - The mobjects whose orientation need not be fixed any longer. - """ - for mobject in extract_mobject_family_members(mobjects): - if mobject in self.fixed_orientation_mobjects: - del self.fixed_orientation_mobjects[mobject] - - def remove_fixed_in_frame_mobjects(self, *mobjects: Mobject): - """If a mobject was fixed in frame by passing it through - :meth:`.add_fixed_in_frame_mobjects`, then this undoes that fixing. - The Mobject will no longer be fixed in frame. - - Parameters - ---------- - mobjects - The mobjects which need not be fixed in frame any longer. - """ - for mobject in extract_mobject_family_members(mobjects): - if mobject in self.fixed_in_frame_mobjects: - self.fixed_in_frame_mobjects.remove(mobject) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index d7e9415413..32469fe68f 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -768,7 +768,7 @@ def apply_over_attr_arrays(self, func): def get_image(self, camera=None): if camera is None: - from ..camera.camera import Camera + from ..camera.cairo_camera import CairoCamera as Camera camera = Camera() camera.capture_mobject(self) diff --git a/manim/renderer/cairo_renderer.py b/manim/renderer/cairo_renderer.py index f11b7ea7ca..9be8f5a59a 100644 --- a/manim/renderer/cairo_renderer.py +++ b/manim/renderer/cairo_renderer.py @@ -8,7 +8,7 @@ from manim.utils.hashing import get_hash_from_play_call from .. import config, logger -from ..camera.camera import Camera +from ..camera.cairo_camera import CairoCamera as Camera from ..mobject.mobject import Mobject from ..scene.scene_file_writer import SceneFileWriter from ..utils.exceptions import EndSceneEarlyException diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 87d7cc95fa..701819af53 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -17,35 +17,17 @@ import moderngl import numpy as np -import OpenGL.GL as gl from PIL import Image from scipy.spatial.transform import Rotation from manim import config, logger from manim.mobject.opengl.opengl_mobject import OpenGLMobject, OpenGLPoint -from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject -from manim.utils.caching import handle_caching_play from manim.utils.color import BLACK, color_to_rgba -from manim.utils.exceptions import EndSceneEarlyException from ..constants import * -from ..scene.scene_file_writer import SceneFileWriter -from ..utils import opengl from ..utils.config_ops import _Data -from ..utils.simple_functions import clip, fdiv -from ..utils.space_ops import ( - angle_of_vector, - normalize, - quaternion_from_angle_axis, - quaternion_mult, - rotation_matrix_transpose, - rotation_matrix_transpose_from_quaternion, -) -from .shader import Mesh, Shader -from .vectorized_mobject_rendering import ( - render_opengl_vectorized_mobject_fill, - render_opengl_vectorized_mobject_stroke, -) +from ..utils.simple_functions import fdiv +from ..utils.space_ops import normalize class OpenGLCameraFrame(OpenGLMobject): @@ -538,554 +520,3 @@ def release_texture(self, path: str): if tid_and_texture: tid_and_texture[1].release() return self - - -class OpenGLCameraLegacy(OpenGLMobject): - euler_angles = _Data() - - def __init__( - self, - frame_shape=None, - center_point=None, - # Theta, phi, gamma - euler_angles=[0, 0, 0], - focal_distance=2, - light_source_position=[-10, 10, 10], - orthographic=False, - minimum_polar_angle=-PI / 2, - maximum_polar_angle=PI / 2, - model_matrix=None, - **kwargs, - ): - self.use_z_index = True - self.frame_rate = 60 - self.orthographic = orthographic - self.minimum_polar_angle = minimum_polar_angle - self.maximum_polar_angle = maximum_polar_angle - if self.orthographic: - self.projection_matrix = opengl.orthographic_projection_matrix() - self.unformatted_projection_matrix = opengl.orthographic_projection_matrix( - format=False, - ) - else: - self.projection_matrix = opengl.perspective_projection_matrix() - self.unformatted_projection_matrix = opengl.perspective_projection_matrix( - format=False, - ) - - if frame_shape is None: - self.frame_shape = (config["frame_width"], config["frame_height"]) - else: - self.frame_shape = frame_shape - - if center_point is None: - self.center_point = ORIGIN - else: - self.center_point = center_point - - if model_matrix is None: - model_matrix = opengl.translation_matrix(0, 0, 11) - - self.focal_distance = focal_distance - - if light_source_position is None: - self.light_source_position = [-10, 10, 10] - else: - self.light_source_position = light_source_position - self.light_source = OpenGLPoint(self.light_source_position) - - self.default_model_matrix = model_matrix - super().__init__(model_matrix=model_matrix, should_render=False, **kwargs) - - if euler_angles is None: - euler_angles = [0, 0, 0] - euler_angles = np.array(euler_angles, dtype=float) - - self.euler_angles = euler_angles - self.refresh_rotation_matrix() - - def get_position(self): - return self.model_matrix[:, 3][:3] - - def set_position(self, position): - self.model_matrix[:, 3][:3] = position - return self - - @cached_property - def formatted_view_matrix(self): - return opengl.matrix_to_shader_input(np.linalg.inv(self.model_matrix)) - - @cached_property - def unformatted_view_matrix(self): - return np.linalg.inv(self.model_matrix) - - def init_points(self): - self.set_points([ORIGIN, LEFT, RIGHT, DOWN, UP]) - self.set_width(self.frame_shape[0], stretch=True) - self.set_height(self.frame_shape[1], stretch=True) - self.move_to(self.center_point) - - def to_default_state(self): - self.center() - self.set_height(config["frame_height"]) - self.set_width(config["frame_width"]) - self.set_euler_angles(0, 0, 0) - self.model_matrix = self.default_model_matrix - return self - - def refresh_rotation_matrix(self): - # Rotate based on camera orientation - theta, phi, gamma = self.euler_angles - quat = quaternion_mult( - quaternion_from_angle_axis(theta, OUT, axis_normalized=True), - quaternion_from_angle_axis(phi, RIGHT, axis_normalized=True), - quaternion_from_angle_axis(gamma, OUT, axis_normalized=True), - ) - self.inverse_rotation_matrix = rotation_matrix_transpose_from_quaternion(quat) - - def rotate(self, angle, axis=OUT, **kwargs): - curr_rot_T = self.inverse_rotation_matrix - added_rot_T = rotation_matrix_transpose(angle, axis) - new_rot_T = np.dot(curr_rot_T, added_rot_T) - Fz = new_rot_T[2] - phi = np.arccos(Fz[2]) - theta = angle_of_vector(Fz[:2]) + PI / 2 - partial_rot_T = np.dot( - rotation_matrix_transpose(phi, RIGHT), - rotation_matrix_transpose(theta, OUT), - ) - gamma = angle_of_vector(np.dot(partial_rot_T, new_rot_T.T)[:, 0]) - self.set_euler_angles(theta, phi, gamma) - return self - - def set_euler_angles(self, theta=None, phi=None, gamma=None): - if theta is not None: - self.euler_angles[0] = theta - if phi is not None: - self.euler_angles[1] = phi - if gamma is not None: - self.euler_angles[2] = gamma - self.refresh_rotation_matrix() - return self - - def set_theta(self, theta): - return self.set_euler_angles(theta=theta) - - def set_phi(self, phi): - return self.set_euler_angles(phi=phi) - - def set_gamma(self, gamma): - return self.set_euler_angles(gamma=gamma) - - def increment_theta(self, dtheta): - self.euler_angles[0] += dtheta - self.refresh_rotation_matrix() - return self - - def increment_phi(self, dphi): - phi = self.euler_angles[1] - new_phi = clip(phi + dphi, -PI / 2, PI / 2) - self.euler_angles[1] = new_phi - self.refresh_rotation_matrix() - return self - - def increment_gamma(self, dgamma): - self.euler_angles[2] += dgamma - self.refresh_rotation_matrix() - return self - - def get_shape(self): - return (self.get_width(), self.get_height()) - - def get_center(self): - # Assumes first point is at the center - return self.points[0] - - def get_width(self): - points = self.points - return points[2, 0] - points[1, 0] - - def get_height(self): - points = self.points - return points[4, 1] - points[3, 1] - - def get_focal_distance(self): - return self.focal_distance * self.get_height() - - def interpolate(self, *args, **kwargs): - super().interpolate(*args, **kwargs) - self.refresh_rotation_matrix() - - -points_per_curve = 3 - - -class OpenGLRenderer: - def __init__(self, file_writer_class=SceneFileWriter, skip_animations=False): - # Measured in pixel widths, used for vector graphics - self.anti_alias_width = 1.5 - self._file_writer_class = file_writer_class - - self._original_skipping_status = skip_animations - self.skip_animations = skip_animations - self.animation_start_time = 0 - self.animation_elapsed_time = 0 - self.time = 0 - self.animations_hashes = [] - self.num_plays = 0 - - self.camera = OpenGLCamera() - self.pressed_keys = set() - - # Initialize texture map. - self.path_to_texture_id = {} - - self.background_color = config["background_color"] - - def init_scene(self, scene): - self.partial_movie_files = [] - self.file_writer: Any = self._file_writer_class( - self, - scene.__class__.__name__, - ) - self.scene = scene - self.background_color = config["background_color"] - if not hasattr(self, "window"): - if self.should_create_window(): - from .opengl_renderer_window import Window - - self.window = Window(self) - self.context = self.window.ctx - self.frame_buffer_object = self.context.detect_framebuffer() - else: - self.window = None - try: - self.context = moderngl.create_context(standalone=True) - except Exception: - self.context = moderngl.create_context( - standalone=True, - backend="egl", - ) - self.frame_buffer_object = self.get_frame_buffer_object(self.context, 0) - self.frame_buffer_object.use() - self.context.enable(moderngl.BLEND) - self.context.wireframe = config["enable_wireframe"] - self.context.blend_func = ( - moderngl.SRC_ALPHA, - moderngl.ONE_MINUS_SRC_ALPHA, - moderngl.ONE, - moderngl.ONE, - ) - - def should_create_window(self): - if config["force_window"]: - logger.warning( - "'--force_window' is enabled, this is intended for debugging purposes " - "and may impact performance if used when outputting files", - ) - return True - return ( - config["preview"] - and not config["save_last_frame"] - and not config["format"] - and not config["write_to_movie"] - and not config["dry_run"] - ) - - def get_pixel_shape(self): - if hasattr(self, "frame_buffer_object"): - return self.frame_buffer_object.viewport[2:4] - else: - return None - - def refresh_perspective_uniforms(self, camera): - pw, ph = self.get_pixel_shape() - fw, fh = camera.get_shape() - # TODO, this should probably be a mobject uniform, with - # the camera taking care of the conversion factor - anti_alias_width = self.anti_alias_width / (ph / fh) - # Orient light - rotation = camera.inverse_rotation_matrix - light_pos = camera.light_source.get_location() - light_pos = np.dot(rotation, light_pos) - - self.perspective_uniforms = { - "frame_shape": camera.get_shape(), - "anti_alias_width": anti_alias_width, - "camera_center": tuple(camera.get_center()), - "camera_rotation": tuple(np.array(rotation).T.flatten()), - "light_source_position": tuple(light_pos), - "focal_distance": camera.get_focal_distance(), - } - - def render_mobject(self, mobject): - if isinstance(mobject, OpenGLVMobject): - if config["use_projection_fill_shaders"]: - render_opengl_vectorized_mobject_fill(self, mobject) - - if config["use_projection_stroke_shaders"]: - render_opengl_vectorized_mobject_stroke(self, mobject) - - shader_wrapper_list = mobject.get_shader_wrapper_list() - - # Convert ShaderWrappers to Meshes. - for shader_wrapper in shader_wrapper_list: - shader = Shader(self.context, shader_wrapper.shader_folder) - - # Set textures. - for name, path in shader_wrapper.texture_paths.items(): - tid = self.get_texture_id(path) - shader.shader_program[name].value = tid - - # Set uniforms. - for name, value in it.chain( - shader_wrapper.uniforms.items(), - self.perspective_uniforms.items(), - ): - try: - shader.set_uniform(name, value) - except KeyError: - pass - try: - shader.set_uniform( - "u_view_matrix", self.scene.camera.formatted_view_matrix - ) - shader.set_uniform( - "u_projection_matrix", - self.scene.camera.projection_matrix, - ) - except KeyError: - pass - - # Set depth test. - if shader_wrapper.depth_test: - self.context.enable(moderngl.DEPTH_TEST) - else: - self.context.disable(moderngl.DEPTH_TEST) - - # Render. - mesh = Mesh( - shader, - shader_wrapper.vert_data, - indices=shader_wrapper.vert_indices, - use_depth_test=shader_wrapper.depth_test, - primitive=mobject.render_primitive, - ) - mesh.set_uniforms(self) - mesh.render() - - def get_texture_id(self, path): - if repr(path) not in self.path_to_texture_id: - tid = len(self.path_to_texture_id) - texture = self.context.texture( - size=path.size, - components=len(path.getbands()), - data=path.tobytes(), - ) - texture.repeat_x = False - texture.repeat_y = False - texture.filter = (moderngl.NEAREST, moderngl.NEAREST) - texture.swizzle = "RRR1" if path.mode == "L" else "RGBA" - texture.use(location=tid) - self.path_to_texture_id[repr(path)] = tid - - return self.path_to_texture_id[repr(path)] - - def update_skipping_status(self): - """ - This method is used internally to check if the current - animation needs to be skipped or not. It also checks if - the number of animations that were played correspond to - the number of animations that need to be played, and - raises an EndSceneEarlyException if they don't correspond. - """ - # there is always at least one section -> no out of bounds here - if self.file_writer.sections[-1].skip_animations: - self.skip_animations = True - if ( - config["from_animation_number"] - and self.num_plays < config["from_animation_number"] - ): - self.skip_animations = True - if ( - config["upto_animation_number"] - and self.num_plays > config["upto_animation_number"] - ): - self.skip_animations = True - raise EndSceneEarlyException() - - @handle_caching_play - def play(self, scene, *args, **kwargs): - # TODO: Handle data locking / unlocking. - self.animation_start_time = time.time() - self.file_writer.begin_animation(not self.skip_animations) - - scene.compile_animation_data(*args, **kwargs) - scene.begin_animations() - if scene.is_current_animation_frozen_frame(): - self.update_frame(scene) - - if not self.skip_animations: - for _ in range(int(config.frame_rate * scene.duration)): - self.file_writer.write_frame(self) - - if self.window is not None: - self.window.swap_buffers() - while time.time() - self.animation_start_time < scene.duration: - pass - self.animation_elapsed_time = scene.duration - - else: - scene.play_internal() - - self.file_writer.end_animation(not self.skip_animations) - self.time += scene.duration - self.num_plays += 1 - - def clear_screen(self): - self.frame_buffer_object.clear(*self.background_color) - self.window.swap_buffers() - - def render(self, scene, frame_offset, moving_mobjects): - self.update_frame(scene) - - if self.skip_animations: - return - - self.file_writer.write_frame(self) - - if self.window is not None: - self.window.swap_buffers() - while self.animation_elapsed_time < frame_offset: - self.update_frame(scene) - self.window.swap_buffers() - - def update_frame(self, scene): - self.frame_buffer_object.clear(*self.background_color) - self.refresh_perspective_uniforms(scene.camera) - - for mobject in scene.mobjects: - self.render_mobject(mobject) - - for obj in scene.meshes: - for mesh in obj.get_meshes(): - mesh.set_uniforms(self) - mesh.render() - - self.animation_elapsed_time = time.time() - self.animation_start_time - - def scene_finished(self, scene): - # When num_plays is 0, no images have been output, so output a single - # image in this case - if self.num_plays > 0: - self.file_writer.finish() - elif self.num_plays == 0 and config.write_to_movie: - config.write_to_movie = False - - if self.should_save_last_frame(): - config.save_last_frame = True - self.update_frame(scene) - self.file_writer.save_final_image(self.get_image()) - - def should_save_last_frame(self): - if config["save_last_frame"]: - return True - if self.scene.interactive_mode: - return False - return self.num_plays == 0 - - def get_image(self) -> Image.Image: - """Returns an image from the current frame. The first argument passed to image represents - the mode RGB with the alpha channel A. The data we read is from the currently bound frame - buffer. We pass in 'raw' as the name of the decoder, 0 and -1 args are specifically - used for the decoder tand represent the stride and orientation. 0 means there is no - padding expected between bytes and -1 represents the orientation and means the first - line of the image is the bottom line on the screen. - - Returns - ------- - PIL.Image - The PIL image of the array. - """ - raw_buffer_data = self.get_raw_frame_buffer_object_data() - image = Image.frombytes( - "RGBA", - self.get_pixel_shape(), - raw_buffer_data, - "raw", - "RGBA", - 0, - -1, - ) - return image - - def save_static_frame_data(self, scene, static_mobjects): - pass - - def get_frame_buffer_object(self, context, samples=0): - pixel_width = config["pixel_width"] - pixel_height = config["pixel_height"] - num_channels = 4 - return context.framebuffer( - color_attachments=context.texture( - (pixel_width, pixel_height), - components=num_channels, - samples=samples, - ), - depth_attachment=context.depth_renderbuffer( - (pixel_width, pixel_height), - samples=samples, - ), - ) - - def get_raw_frame_buffer_object_data(self, dtype="f1"): - # Copy blocks from the fbo_msaa to the drawn fbo using Blit - # pw, ph = self.get_pixel_shape() - # gl.glBindFramebuffer(gl.GL_READ_FRAMEBUFFER, self.fbo_msaa.glo) - # gl.glBindFramebuffer(gl.GL_DRAW_FRAMEBUFFER, self.fbo.glo) - # gl.glBlitFramebuffer( - # 0, 0, pw, ph, 0, 0, pw, ph, gl.GL_COLOR_BUFFER_BIT, gl.GL_LINEAR - # ) - num_channels = 4 - ret = self.frame_buffer_object.read( - viewport=self.frame_buffer_object.viewport, - components=num_channels, - dtype=dtype, - ) - return ret - - def get_frame(self): - # get current pixel values as numpy data in order to test output - raw = self.get_raw_frame_buffer_object_data(dtype="f1") - pixel_shape = self.get_pixel_shape() - result_dimensions = (pixel_shape[1], pixel_shape[0], 4) - np_buf = np.frombuffer(raw, dtype="uint8").reshape(result_dimensions) - np_buf = np.flipud(np_buf) - return np_buf - - # Returns offset from the bottom left corner in pixels. - # top_left flag should be set to True when using a GUI framework - # where the (0,0) is at the top left: e.g. PySide6 - def pixel_coords_to_space_coords(self, px, py, relative=False, top_left=False): - pixel_shape = self.get_pixel_shape() - if pixel_shape is None: - return np.array([0, 0, 0]) - pw, ph = pixel_shape - fw, fh = config["frame_width"], config["frame_height"] - fc = self.camera.get_center() - if relative: - return 2 * np.array([px / pw, py / ph, 0]) - else: - # Only scale wrt one axis - scale = fh / ph - return fc + scale * np.array( - [(px - pw / 2), (-1 if top_left else 1) * (py - ph / 2), 0] - ) - - @property - def background_color(self): - return self._background_color - - @background_color.setter - def background_color(self, value): - self._background_color = color_to_rgba(value, 1.0) diff --git a/manim/utils/hashing.py b/manim/utils/hashing.py index 60e4422f15..6203b2d285 100644 --- a/manim/utils/hashing.py +++ b/manim/utils/hashing.py @@ -15,7 +15,7 @@ import numpy as np from manim.animation.animation import Animation -from manim.camera.camera import Camera +from manim.camera.cairo_camera import CairoCamera as Camera from manim.mobject.mobject import Mobject from .. import config, logger From b411dbd2984f21161264405efcd5410dedec192c Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Thu, 5 Jan 2023 15:15:55 +0100 Subject: [PATCH 018/106] remove scenes depending on cairo camera subclasses --- manim/__init__.py | 2 - manim/scene/moving_camera_scene.py | 112 ---------------- manim/scene/zoomed_scene.py | 209 ----------------------------- 3 files changed, 323 deletions(-) delete mode 100644 manim/scene/moving_camera_scene.py delete mode 100644 manim/scene/zoomed_scene.py diff --git a/manim/__init__.py b/manim/__init__.py index be70f67b6a..e75ea49e0f 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -73,12 +73,10 @@ from .mobject.value_tracker import * from .mobject.vector_field import * from .renderer.cairo_renderer import * -from .scene.moving_camera_scene import * from .scene.scene import * from .scene.scene_file_writer import * from .scene.section import * from .scene.vector_space_scene import * -from .scene.zoomed_scene import * from .utils import color, rate_functions, unit from .utils.bezier import * from .utils.color import * diff --git a/manim/scene/moving_camera_scene.py b/manim/scene/moving_camera_scene.py deleted file mode 100644 index 3adef5fc78..0000000000 --- a/manim/scene/moving_camera_scene.py +++ /dev/null @@ -1,112 +0,0 @@ -"""A scene whose camera can be moved around. - -.. SEEALSO:: - - :mod:`.moving_camera` - - -Examples --------- - -.. manim:: ChangingCameraWidthAndRestore - - class ChangingCameraWidthAndRestore(MovingCameraScene): - def construct(self): - text = Text("Hello World").set_color(BLUE) - self.add(text) - self.camera.frame.save_state() - self.play(self.camera.frame.animate.set(width=text.width * 1.2)) - self.wait(0.3) - self.play(Restore(self.camera.frame)) - - -.. manim:: MovingCameraCenter - - class MovingCameraCenter(MovingCameraScene): - def construct(self): - s = Square(color=RED, fill_opacity=0.5).move_to(2 * LEFT) - t = Triangle(color=GREEN, fill_opacity=0.5).move_to(2 * RIGHT) - self.wait(0.3) - self.add(s, t) - self.play(self.camera.frame.animate.move_to(s)) - self.wait(0.3) - self.play(self.camera.frame.animate.move_to(t)) - - -.. manim:: MovingAndZoomingCamera - - class MovingAndZoomingCamera(MovingCameraScene): - def construct(self): - s = Square(color=BLUE, fill_opacity=0.5).move_to(2 * LEFT) - t = Triangle(color=YELLOW, fill_opacity=0.5).move_to(2 * RIGHT) - self.add(s, t) - self.play(self.camera.frame.animate.move_to(s).set(width=s.width*2)) - self.wait(0.3) - self.play(self.camera.frame.animate.move_to(t).set(width=t.width*2)) - - self.play(self.camera.frame.animate.move_to(ORIGIN).set(width=14)) - -.. manim:: MovingCameraOnGraph - - class MovingCameraOnGraph(MovingCameraScene): - def construct(self): - self.camera.frame.save_state() - - ax = Axes(x_range=[-1, 10], y_range=[-1, 10]) - graph = ax.plot(lambda x: np.sin(x), color=WHITE, x_range=[0, 3 * PI]) - - dot_1 = Dot(ax.i2gp(graph.t_min, graph)) - dot_2 = Dot(ax.i2gp(graph.t_max, graph)) - self.add(ax, graph, dot_1, dot_2) - - self.play(self.camera.frame.animate.scale(0.5).move_to(dot_1)) - self.play(self.camera.frame.animate.move_to(dot_2)) - self.play(Restore(self.camera.frame)) - self.wait() - -""" - -from __future__ import annotations - -__all__ = ["MovingCameraScene"] - -from manim.animation.animation import Animation - -from ..camera.moving_camera import MovingCamera -from ..scene.scene import Scene -from ..utils.family import extract_mobject_family_members -from ..utils.iterables import list_update - - -class MovingCameraScene(Scene): - """ - This is a Scene, with special configurations and properties that - make it suitable for cases where the camera must be moved around. - - .. SEEALSO:: - - :class:`.MovingCamera` - """ - - def __init__(self, camera_class=MovingCamera, **kwargs): - super().__init__(camera_class=camera_class, **kwargs) - - def get_moving_mobjects(self, *animations: Animation): - """ - This method returns a list of all of the Mobjects in the Scene that - are moving, that are also in the animations passed. - - Parameters - ---------- - *animations - The Animations whose mobjects will be checked. - """ - moving_mobjects = super().get_moving_mobjects(*animations) - all_moving_mobjects = extract_mobject_family_members(moving_mobjects) - movement_indicators = self.renderer.camera.get_mobjects_indicating_movement() - for movement_indicator in movement_indicators: - if movement_indicator in all_moving_mobjects: - # When one of these is moving, the camera should - # consider all mobjects to be moving - return list_update(self.mobjects, moving_mobjects) - return moving_mobjects diff --git a/manim/scene/zoomed_scene.py b/manim/scene/zoomed_scene.py deleted file mode 100644 index 361c4eaf55..0000000000 --- a/manim/scene/zoomed_scene.py +++ /dev/null @@ -1,209 +0,0 @@ -"""A scene supporting zooming in on a specified section. - - -Examples --------- - -.. manim:: UseZoomedScene - - class UseZoomedScene(ZoomedScene): - def construct(self): - dot = Dot().set_color(GREEN) - self.add(dot) - self.wait(1) - self.activate_zooming(animate=False) - self.wait(1) - self.play(dot.animate.shift(LEFT)) - -.. manim:: ChangingZoomScale - - class ChangingZoomScale(ZoomedScene): - def __init__(self, **kwargs): - ZoomedScene.__init__( - self, - zoom_factor=0.3, - zoomed_display_height=1, - zoomed_display_width=3, - image_frame_stroke_width=20, - zoomed_camera_config={ - "default_frame_stroke_width": 3, - }, - **kwargs - ) - - def construct(self): - dot = Dot().set_color(GREEN) - sq = Circle(fill_opacity=1, radius=0.2).next_to(dot, RIGHT) - self.add(dot, sq) - self.wait(1) - self.activate_zooming(animate=False) - self.wait(1) - self.play(dot.animate.shift(LEFT * 0.3)) - - self.play(self.zoomed_camera.frame.animate.scale(4)) - self.play(self.zoomed_camera.frame.animate.shift(0.5 * DOWN)) - -""" - -from __future__ import annotations - -__all__ = ["ZoomedScene"] - - -from ..animation.transform import ApplyMethod -from ..camera.moving_camera import MovingCamera -from ..camera.multi_camera import MultiCamera -from ..constants import * -from ..mobject.types.image_mobject import ImageMobjectFromCamera -from ..scene.moving_camera_scene import MovingCameraScene - -# Note, any scenes from old videos using ZoomedScene will almost certainly -# break, as it was restructured. - - -class ZoomedScene(MovingCameraScene): - """ - This is a Scene with special configurations made for when - a particular part of the scene must be zoomed in on and displayed - separately. - """ - - def __init__( - self, - camera_class=MultiCamera, - zoomed_display_height=3, - zoomed_display_width=3, - zoomed_display_center=None, - zoomed_display_corner=UP + RIGHT, - zoomed_display_corner_buff=DEFAULT_MOBJECT_TO_EDGE_BUFFER, - zoomed_camera_config={ - "default_frame_stroke_width": 2, - "background_opacity": 1, - }, - zoomed_camera_image_mobject_config={}, - zoomed_camera_frame_starting_position=ORIGIN, - zoom_factor=0.15, - image_frame_stroke_width=3, - zoom_activated=False, - **kwargs, - ): - self.zoomed_display_height = zoomed_display_height - self.zoomed_display_width = zoomed_display_width - self.zoomed_display_center = zoomed_display_center - self.zoomed_display_corner = zoomed_display_corner - self.zoomed_display_corner_buff = zoomed_display_corner_buff - self.zoomed_camera_config = zoomed_camera_config - self.zoomed_camera_image_mobject_config = zoomed_camera_image_mobject_config - self.zoomed_camera_frame_starting_position = ( - zoomed_camera_frame_starting_position - ) - self.zoom_factor = zoom_factor - self.image_frame_stroke_width = image_frame_stroke_width - self.zoom_activated = zoom_activated - super().__init__(camera_class=camera_class, **kwargs) - - def setup(self): - """ - This method is used internally by Manim to - setup the scene for proper use. - """ - super().setup() - # Initialize camera and display - zoomed_camera = MovingCamera(**self.zoomed_camera_config) - zoomed_display = ImageMobjectFromCamera( - zoomed_camera, **self.zoomed_camera_image_mobject_config - ) - zoomed_display.add_display_frame() - for mob in zoomed_camera.frame, zoomed_display: - mob.stretch_to_fit_height(self.zoomed_display_height) - mob.stretch_to_fit_width(self.zoomed_display_width) - zoomed_camera.frame.scale(self.zoom_factor) - - # Position camera and display - zoomed_camera.frame.move_to(self.zoomed_camera_frame_starting_position) - if self.zoomed_display_center is not None: - zoomed_display.move_to(self.zoomed_display_center) - else: - zoomed_display.to_corner( - self.zoomed_display_corner, - buff=self.zoomed_display_corner_buff, - ) - - self.zoomed_camera = zoomed_camera - self.zoomed_display = zoomed_display - - def activate_zooming(self, animate: bool = False): - """ - This method is used to activate the zooming for - the zoomed_camera. - - Parameters - ---------- - animate - Whether or not to animate the activation - of the zoomed camera. - """ - self.zoom_activated = True - self.renderer.camera.add_image_mobject_from_camera(self.zoomed_display) - if animate: - self.play(self.get_zoom_in_animation()) - self.play(self.get_zoomed_display_pop_out_animation()) - self.add_foreground_mobjects( - self.zoomed_camera.frame, - self.zoomed_display, - ) - - def get_zoom_in_animation(self, run_time: float = 2, **kwargs): - """ - Returns the animation of camera zooming in. - - Parameters - ---------- - run_time - The run_time of the animation of the camera zooming in. - **kwargs - Any valid keyword arguments of ApplyMethod() - - Returns - ------- - ApplyMethod - The animation of the camera zooming in. - """ - frame = self.zoomed_camera.frame - full_frame_height = self.camera.frame_height - full_frame_width = self.camera.frame_width - frame.save_state() - frame.stretch_to_fit_width(full_frame_width) - frame.stretch_to_fit_height(full_frame_height) - frame.center() - frame.set_stroke(width=0) - return ApplyMethod(frame.restore, run_time=run_time, **kwargs) - - def get_zoomed_display_pop_out_animation(self, **kwargs): - """ - This is the animation of the popping out of the - mini-display that shows the content of the zoomed - camera. - - Returns - ------- - ApplyMethod - The Animation of the Zoomed Display popping out. - """ - display = self.zoomed_display - display.save_state() - display.replace(self.zoomed_camera.frame, stretch=True) - return ApplyMethod(display.restore) - - def get_zoom_factor(self): - """ - Returns the Zoom factor of the Zoomed camera. - Defined as the ratio between the height of the - zoomed camera and the height of the zoomed mini - display. - Returns - ------- - float - The zoom factor. - """ - return self.zoomed_camera.frame.height / self.zoomed_display.height From 5ae747e879e362444d763cd876ef761460d6e3ca Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Thu, 5 Jan 2023 15:17:15 +0100 Subject: [PATCH 019/106] opengl_renderer.py -> camera.py --- manim/{renderer/opengl_renderer.py => camera/camera.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename manim/{renderer/opengl_renderer.py => camera/camera.py} (100%) diff --git a/manim/renderer/opengl_renderer.py b/manim/camera/camera.py similarity index 100% rename from manim/renderer/opengl_renderer.py rename to manim/camera/camera.py From db7274e325ab63d6ce42564d1cdffcfe7dc59f57 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Thu, 5 Jan 2023 15:18:23 +0100 Subject: [PATCH 020/106] fix a bunch of imports --- manim/camera/cairo_camera.py | 2 +- manim/scene/scene.py | 2 +- manim/scene/scene_file_writer.py | 2 +- tests/test_graphical_units/test_opengl.py | 2 +- tests/test_scene_rendering/opengl/test_opengl_renderer.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/manim/camera/cairo_camera.py b/manim/camera/cairo_camera.py index 846aff3a40..734dbd7388 100644 --- a/manim/camera/cairo_camera.py +++ b/manim/camera/cairo_camera.py @@ -3,7 +3,7 @@ from __future__ import annotations -__all__ = ["Camera", "BackgroundColoredVMobjectDisplayer"] +__all__ = ["CairoCamera"] import copy import itertools as it diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 3d4b8e94bc..6a5ae9568f 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -22,7 +22,7 @@ from manim.mobject.frame import FullScreenRectangle from manim.mobject.mobject import Group, Mobject, Point, _AnimationBuilder from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.renderer.opengl_renderer import OpenGLCamera as Camera +from manim.camera.camera import OpenGLCamera as Camera from manim.scene.scene_file_writer import SceneFileWriter from manim.utils.color import RED from manim.utils.family_ops import ( diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index ff66c586f0..dfa8db1b03 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -25,7 +25,7 @@ if TYPE_CHECKING: from PIL.Image import Image - from manim.renderer.opengl_renderer import OpenGLCamera as Camera + from manim.camera.camera import OpenGLCamera as Camera from manim.scene import Scene diff --git a/tests/test_graphical_units/test_opengl.py b/tests/test_graphical_units/test_opengl.py index 6d36f8761a..2c21e692f5 100644 --- a/tests/test_graphical_units/test_opengl.py +++ b/tests/test_graphical_units/test_opengl.py @@ -1,7 +1,7 @@ from __future__ import annotations from manim import * -from manim.renderer.opengl_renderer import OpenGLRenderer +from manim.camera.camera import OpenGLRenderer from manim.utils.testing.frames_comparison import frames_comparison __module_test__ = "opengl" diff --git a/tests/test_scene_rendering/opengl/test_opengl_renderer.py b/tests/test_scene_rendering/opengl/test_opengl_renderer.py index 95f7adde0b..7b2c95206d 100644 --- a/tests/test_scene_rendering/opengl/test_opengl_renderer.py +++ b/tests/test_scene_rendering/opengl/test_opengl_renderer.py @@ -5,7 +5,7 @@ import pytest -from manim.renderer.opengl_renderer import OpenGLRenderer +from manim.camera.camera import OpenGLRenderer from tests.assert_utils import assert_file_exists from tests.test_scene_rendering.simple_scenes import * From 30dd07eee765610ed7aff6c15a5b3a58e8a58fee Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Thu, 5 Jan 2023 15:19:04 +0100 Subject: [PATCH 021/106] fix decorator issues in OpenGL(V)Mobject --- manim/mobject/opengl/opengl_mobject.py | 56 +++++++++---------- .../opengl/opengl_vectorized_mobject.py | 17 +++--- 2 files changed, 35 insertions(+), 38 deletions(-) diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index f9c880aa44..5e452c2cf4 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -59,6 +59,33 @@ UNIFORM_DTYPE = np.float64 +def stash_mobject_pointers(func: Callable): + @wraps(func) + def wrapper(self, *args, **kwargs): + uncopied_attrs = ["parents", "target", "saved_state"] + stash = {} + for attr in uncopied_attrs: + if hasattr(self, attr): + value = getattr(self, attr) + stash[attr] = value + null_value = [] if isinstance(value, list) else None + setattr(self, attr, null_value) + result = func(self, *args, **kwargs) + self.__dict__.update(stash) + return result + + return wrapper + + +def affects_shader_info_id(func): + @wraps(func) + def wrapper(self): + for mob in self.get_family(): + func(mob) + mob.refresh_shader_wrapper_id() + return self + + return wrapper class OpenGLMobject: """Mathematical Object: base class for objects that can be displayed on screen. @@ -1298,24 +1325,6 @@ def construct(self): # Copying - @staticmethod - def stash_mobject_pointers(func: Callable): - @wraps(func) - def wrapper(self, *args, **kwargs): - uncopied_attrs = ["parents", "target", "saved_state"] - stash = {} - for attr in uncopied_attrs: - if hasattr(self, attr): - value = getattr(self, attr) - stash[attr] = value - null_value = [] if isinstance(value, list) else None - setattr(self, attr, null_value) - result = func(self, *args, **kwargs) - self.__dict__.update(stash) - return result - - return wrapper - @stash_mobject_pointers def serialize(self) -> bytes: return pickle.dumps(self) @@ -2876,17 +2885,6 @@ def has_same_shape_as(self, mobject: OpenGLMobject) -> bool: # Operations touching shader uniforms - @staticmethod - def affects_shader_info_id(func): - @wraps(func) - def wrapper(self): - for mob in self.get_family(): - func(mob) - mob.refresh_shader_wrapper_id() - return self - - return wrapper - @affects_shader_info_id def fix_in_frame(self) -> Self: self.uniforms["is_fixed_in_frame"] = float(1.0) diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index ccb5237d5f..41016808e9 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -55,6 +55,14 @@ DEFAULT_FILL_COLOR = GREY_C +def triggers_refreshed_triangulation(func: Callable): + @wraps(func) + def wrapper(self, *args, **kwargs): + func(self, *args, **kwargs) + self.refresh_triangulation() + + return wrapper + class OpenGLVMobject(OpenGLMobject): """A vectorized mobject.""" @@ -1499,15 +1507,6 @@ def get_triangulation(self): self.needs_new_triangulation = False return tri_indices - @staticmethod - def triggers_refreshed_triangulation(func: Callable): - @wraps(func) - def wrapper(self, *args, **kwargs): - func(self, *args, **kwargs) - self.refresh_triangulation() - - return wrapper - @triggers_refreshed_triangulation def set_points(self, points): super().set_points(points) From 4231751e276e0b8b8ab4eaa98a8949565c2e6e54 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 14:21:22 +0000 Subject: [PATCH 022/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/camera/cairo_camera.py | 2 +- manim/mobject/opengl/opengl_mobject.py | 2 ++ manim/mobject/opengl/opengl_vectorized_mobject.py | 1 + manim/scene/scene.py | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/manim/camera/cairo_camera.py b/manim/camera/cairo_camera.py index 734dbd7388..9b1671ecce 100644 --- a/manim/camera/cairo_camera.py +++ b/manim/camera/cairo_camera.py @@ -39,7 +39,7 @@ class CairoCamera: - """Cairo rendering implementation. + """Cairo rendering implementation. This is the object which takes care of what exactly is displayed on screen at any given moment. diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index 5e452c2cf4..3087c08802 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -59,6 +59,7 @@ UNIFORM_DTYPE = np.float64 + def stash_mobject_pointers(func: Callable): @wraps(func) def wrapper(self, *args, **kwargs): @@ -87,6 +88,7 @@ def wrapper(self): return wrapper + class OpenGLMobject: """Mathematical Object: base class for objects that can be displayed on screen. diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 41016808e9..a844ddb6e0 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -63,6 +63,7 @@ def wrapper(self, *args, **kwargs): return wrapper + class OpenGLVMobject(OpenGLMobject): """A vectorized mobject.""" diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 6a5ae9568f..88fedc5d60 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -16,13 +16,13 @@ from manim._config import logger as log from manim.animation.animation import prepare_animation +from manim.camera.camera import OpenGLCamera as Camera from manim.constants import DEFAULT_WAIT_TIME from manim.event_handler import EVENT_DISPATCHER from manim.event_handler.event_type import EventType from manim.mobject.frame import FullScreenRectangle from manim.mobject.mobject import Group, Mobject, Point, _AnimationBuilder from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.camera.camera import OpenGLCamera as Camera from manim.scene.scene_file_writer import SceneFileWriter from manim.utils.color import RED from manim.utils.family_ops import ( From 56e9914916eb9d841ac9762b4ff3c113e766fb3b Mon Sep 17 00:00:00 2001 From: "Jason G. Villanueva" Date: Sun, 3 Sep 2023 13:48:42 -0700 Subject: [PATCH 023/106] Initial Renderer abstraction --- manim/renderer/renderer.py | 80 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 manim/renderer/renderer.py diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py new file mode 100644 index 0000000000..65c252146a --- /dev/null +++ b/manim/renderer/renderer.py @@ -0,0 +1,80 @@ +import numpy as np + +from abc import ABC, abstractclassmethod, abstractstaticmethod +from typing import TYPE_CHECKING + +from manim.scene import Scene +from manim import config +from manim.mobject.types.vectorized_mobject import VMobject +from manim.mobject.types.image_mobject import ImageMobject + +if TYPE_CHECKING: + from typing import TypeAlias + Image : TypeAlias = np.ndarray + +class Renderer(ABC): + + def __init__(self): + self.fbo = np.zeros((config.height, config.width)) + self.capabilities= { + VMobject: self.render_vmobject, + ImageMobject: self.render_imobject, + } + + def render(self, renderables: [VMobject]) -> Image: # Image + for mob in renderables: + if type(mob) in self.capabilities: + self.capabilities[type(mob)](mob) + return self.fbo.get_pixels() + + + @abstractclassmethod + def render_vmobject(self, mob): + raise NotImplementedError + + def render_mesh(self, mob): + raise NotImplementedError + + def render_image(self, mob): + raise NotImplementedError + +# NOTE: The user should expect depth between renderers not to be handled discussed at 03.09.2023 Between jsonv and MrDiver +# NOTE: Cairo_camera overlay_PIL_image for MultiRenderer + +# class Compositor: +# def __init__(self): +# self.renderers = [] + +# def add_capability(self, renderer) -> None: +# self.renderers.append(renderer) + +# def add(img1, img2): +# raise NotImplementedError + +# def subtract(*images: List[Image]): +# raise NotImplementedError + +# def mix(): +# raise NotImplementedError + +# def multiply(): +# raise NotImplementedError + +# def divide(): +# raise NotImplementedError + + +# class GraphScene(Scene): +# def construct(self): +# config.renderer = + +# class VolumetricScene(Scene): +# def construct(self): +# pass + +# compositor = Compositor() +# compositor.add_capability(GraphScene, OpenGL) # no file writing +# compositor.add_capability(VolumetricScene, Blender, ) # 3 sec +# compositor.addPostFX(CustomShader) +# compositor.render() + From 1d4f0d9665cdd27a24a2a359dc5a15157c05ae27 Mon Sep 17 00:00:00 2001 From: "Jason G. Villanueva" Date: Sun, 3 Sep 2023 17:24:12 -0700 Subject: [PATCH 024/106] changed Camera back to Renderer Co-authored-by: Tristan Schulz --- .../opengl/opengl_vectorized_mobject.py | 14 +- manim/renderer/opengl_renderer.py | 386 ++++++++++++++++++ manim/renderer/renderer.py | 14 +- 3 files changed, 403 insertions(+), 11 deletions(-) create mode 100644 manim/renderer/opengl_renderer.py diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index a844ddb6e0..73ac7b4953 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -1342,15 +1342,11 @@ def insert_n_curves_to_point_list(self, n: int, points: np.ndarray) -> np.ndarra def interpolate(self, mobject1, mobject2, alpha, *args, **kwargs): super().interpolate(mobject1, mobject2, alpha, *args, **kwargs) - # TODO: Do we still need this? Because for many scenes it just doesn't work - if config["use_projection_fill_shaders"]: - self.refresh_triangulation() - else: - if self.has_fill(): - tri1 = mobject1.get_triangulation() - tri2 = mobject2.get_triangulation() - if len(tri1) != len(tri1) or not np.all(tri1 == tri2): - self.refresh_triangulation() + if self.has_fill(): + tri1 = mobject1.get_triangulation() + tri2 = mobject2.get_triangulation() + if len(tri1) != len(tri2) or not np.all(tri1 == tri2): + self.refresh_triangulation() return self # TODO: compare to 3b1b/manim again check if something changed so we don't need the cairo interpolation anymore diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py new file mode 100644 index 0000000000..28a88a0303 --- /dev/null +++ b/manim/renderer/opengl_renderer.py @@ -0,0 +1,386 @@ +import numpy as np +from renderer import Renderer + +from manim.mobject.types.vectorized_mobject import VMobject +from renderer import RendererData + +class GLRenderData(RendererData): + def __init__(self) -> None: + super().__init__() + self.fill_rgbas = np.zeros((1,4)) + self.stroke_rgbas = np.zeros((1,4)) + self.normals = np.zeros((1,4)) + self.mesh = np.zeros((0,3)) + self.bounding_box = np.zeros((3,3)) + +class OpenGLRenderer(Renderer): + def __init__( + self, + ctx: moderngl.Context | None = None, + background_image: str | None = None, + frame_config: dict = {}, + pixel_width: int = config.pixel_width, + pixel_height: int = config.pixel_height, + fps: int = config.frame_rate, + # Note: frame height and width will be resized to match the pixel aspect rati + background_color=BLACK, + background_opacity: float = 1.0, + # Points in vectorized mobjects with norm greater + # than this value will be rescaled + max_allowable_norm: float = 1.0, + image_mode: str = "RGBA", + n_channels: int = 4, + pixel_array_dtype: type = np.uint8, + light_source_position: np.ndarray = np.array([-10, 10, 10]), + # Although vector graphics handle antialiasing fine + # without multisampling, for 3d scenes one might want + # to set samples to be greater than 0. + samples: int = 0, + ) -> None: + self.background_image = background_image + self.pixel_width = pixel_width + self.pixel_height = pixel_height + self.fps = fps + self.max_allowable_norm = max_allowable_norm + self.image_mode = image_mode + self.n_channels = n_channels + self.pixel_array_dtype = pixel_array_dtype + self.light_source_position = light_source_position + self.samples = samples + + self.rgb_max_val: float = np.iinfo(self.pixel_array_dtype).max + self.background_color: list[float] = list( + color_to_rgba(background_color, background_opacity) + ) + # self.init_frame(**frame_config) + # self.init_context(ctx) + # self.init_shaders() + # self.init_textures() + # self.init_light_source() + # self.refresh_perspective_uniforms() + # A cached map from mobjects to their associated list of render groups + # so that these render groups are not regenerated unnecessarily for static + # mobjects + self.mob_to_render_groups: dict = {} + + def render_vmobject(self, mob: VMobject) -> None: + # Should be in OpenGL renderer + if not mob.renderer_data: + # Initalization + mob.renderer_data = GLRenderData() + + if mob.colors_changed: + mob.renderer_data.fill_rgbas = np.resize(mob.fill_color, (len(mob.renderer_data.mesh),4)) + + if mob.points_changed: + if(mob.has_fill()): + mob.renderer_data.mesh = ... # Triangulation todo + + # set shader + # use vbo + # render fill + + # set shader + # use vbo + # render stroke + self.fbo ... + +# def init_frame(self, **config) -> None: +# self.frame = OpenGLCameraFrame(**config) + +# def init_context(self, ctx: moderngl.Context | None = None) -> None: +# if ctx is None: +# ctx = moderngl.create_standalone_context() +# fbo = self.get_fbo(ctx, 0) +# else: +# fbo = ctx.detect_framebuffer() + +# self.ctx = ctx +# self.fbo = fbo +# self.set_ctx_blending() + +# # For multisample antisampling +# fbo_msaa = self.get_fbo(ctx, self.samples) +# fbo_msaa.use() +# self.fbo_msaa = fbo_msaa + +# def set_ctx_blending(self, enable: bool = True) -> None: +# if enable: +# self.ctx.enable(moderngl.BLEND) +# else: +# self.ctx.disable(moderngl.BLEND) + +# def set_ctx_depth_test(self, enable: bool = True) -> None: +# if enable: +# self.ctx.enable(moderngl.DEPTH_TEST) +# else: +# self.ctx.disable(moderngl.DEPTH_TEST) + +# def init_light_source(self) -> None: +# self.light_source = OpenGLPoint(self.light_source_position) + +# # Methods associated with the frame buffer +# def get_fbo(self, ctx: moderngl.Context, samples: int = 0) -> moderngl.Framebuffer: +# pw = self.pixel_width +# ph = self.pixel_height +# return ctx.framebuffer( +# color_attachments=ctx.texture( +# (pw, ph), components=self.n_channels, samples=samples +# ), +# depth_attachment=ctx.depth_renderbuffer((pw, ph), samples=samples), +# ) + +# def clear(self) -> None: +# self.fbo.clear(*self.background_color) +# self.fbo_msaa.clear(*self.background_color) + +# def reset_pixel_shape(self, new_width: int, new_height: int) -> None: +# self.pixel_width = new_width +# self.pixel_height = new_height +# self.refresh_perspective_uniforms() + +# def get_raw_fbo_data(self, dtype: str = "f1") -> bytes: +# # Copy blocks from the fbo_msaa to the drawn fbo using Blit +# # pw, ph = (self.pixel_width, self.pixel_height) +# # gl.glBindFramebuffer(gl.GL_READ_FRAMEBUFFER, self.fbo_msaa.glo) +# # gl.glBindFramebuffer(gl.GL_DRAW_FRAMEBUFFER, self.fbo.glo) +# # gl.glBlitFramebuffer( +# # 0, 0, pw, ph, 0, 0, pw, ph, gl.GL_COLOR_BUFFER_BIT, gl.GL_LINEAR +# # ) + +# self.ctx.copy_framebuffer(self.fbo, self.fbo_msaa) +# return self.fbo.read( +# viewport=self.fbo.viewport, +# components=self.n_channels, +# dtype=dtype, +# ) + +# def get_image(self) -> Image.Image: +# return Image.frombytes( +# "RGBA", +# self.get_pixel_shape(), +# self.get_raw_fbo_data(), +# "raw", +# "RGBA", +# 0, +# -1, +# ) + +# def get_pixel_array(self) -> np.ndarray: +# raw = self.get_raw_fbo_data(dtype="f4") +# flat_arr = np.frombuffer(raw, dtype="f4") +# arr = flat_arr.reshape([*reversed(self.fbo.size), self.n_channels]) +# arr = arr[::-1] +# # Convert from float +# return (self.rgb_max_val * arr).astype(self.pixel_array_dtype) + +# def get_texture(self): +# texture = self.ctx.texture( +# size=self.fbo.size, components=4, data=self.get_raw_fbo_data(), dtype="f4" +# ) +# return texture + +# # Getting camera attributes +# def get_pixel_shape(self) -> tuple[int, int]: +# return self.fbo.viewport[2:4] +# # return (self.pixel_width, self.pixel_height) + +# def get_pixel_width(self) -> int: +# return self.get_pixel_shape()[0] + +# def get_pixel_height(self) -> int: +# return self.get_pixel_shape()[1] + +# def get_frame_height(self) -> float: +# return self.frame.get_height() + +# def get_frame_width(self) -> float: +# return self.frame.get_width() + +# def get_frame_shape(self) -> tuple[float, float]: +# return (self.get_frame_width(), self.get_frame_height()) + +# def get_frame_center(self) -> np.ndarray: +# return self.frame.get_center() + +# def get_location(self) -> tuple[float, float, float] | np.ndarray: +# return self.frame.get_implied_camera_location() + +# def resize_frame_shape(self, fixed_dimension: bool = False) -> None: +# """ +# Changes frame_shape to match the aspect ratio +# of the pixels, where fixed_dimension determines +# whether frame_height or frame_width +# remains fixed while the other changes accordingly. +# """ +# pixel_height = self.get_pixel_height() +# pixel_width = self.get_pixel_width() +# frame_height = self.get_frame_height() +# frame_width = self.get_frame_width() +# aspect_ratio = fdiv(pixel_width, pixel_height) +# if not fixed_dimension: +# frame_height = frame_width / aspect_ratio +# else: +# frame_width = aspect_ratio * frame_height +# self.frame.set_height(frame_height) +# self.frame.set_width(frame_width) + +# # Rendering +# def capture(self, *mobjects: OpenGLMobject) -> None: +# self.refresh_perspective_uniforms() +# for mobject in mobjects: +# for render_group in self.get_render_group_list(mobject): +# self.render(render_group) + +# def render(self, render_group: dict[str, Any]) -> None: +# shader_wrapper: ShaderWrapper = render_group["shader_wrapper"] +# shader_program = render_group["prog"] +# self.set_shader_uniforms(shader_program, shader_wrapper) +# self.set_ctx_depth_test(shader_wrapper.depth_test) +# render_group["vao"].render(int(shader_wrapper.render_primitive)) +# if render_group["single_use"]: +# self.release_render_group(render_group) + +# def get_render_group_list(self, mobject: OpenGLMobject) -> Iterable[dict[str, Any]]: +# if mobject.is_changing(): +# return self.generate_render_group_list(mobject) + +# # Otherwise, cache result for later use +# key = id(mobject) +# if key not in self.mob_to_render_groups: +# self.mob_to_render_groups[key] = list( +# self.generate_render_group_list(mobject) +# ) +# return self.mob_to_render_groups[key] + +# def generate_render_group_list( +# self, mobject: OpenGLMobject +# ) -> Iterable[dict[str, Any]]: +# return ( +# self.get_render_group(sw, single_use=mobject.is_changing()) +# for sw in mobject.get_shader_wrapper_list() +# ) + +# def get_render_group( +# self, shader_wrapper: ShaderWrapper, single_use: bool = True +# ) -> dict[str, Any]: +# # Data buffers +# vbo = self.ctx.buffer(shader_wrapper.vert_data.tobytes()) +# if shader_wrapper.vert_indices is None: +# ibo = None +# else: +# vert_index_data = shader_wrapper.vert_indices.astype("i4").tobytes() +# if vert_index_data: +# ibo = self.ctx.buffer(vert_index_data) +# else: +# ibo = None + +# # Program an vertex array +# shader_program, vert_format = self.get_shader_program(shader_wrapper) # type: ignore +# vao = self.ctx.vertex_array( +# program=shader_program, +# content=[(vbo, vert_format, *shader_wrapper.vert_attributes)], +# index_buffer=ibo, +# ) +# return { +# "vbo": vbo, +# "ibo": ibo, +# "vao": vao, +# "prog": shader_program, +# "shader_wrapper": shader_wrapper, +# "single_use": single_use, +# } + +# def release_render_group(self, render_group: dict[str, Any]) -> None: +# for key in ["vbo", "ibo", "vao"]: +# if render_group[key] is not None: +# render_group[key].release() + +# def refresh_static_mobjects(self) -> None: +# for render_group in it.chain(*self.mob_to_render_groups.values()): +# self.release_render_group(render_group) +# self.mob_to_render_groups = {} + +# # Shaders +# def init_shaders(self) -> None: +# # Initialize with the null id going to None +# self.id_to_shader_program: dict[int, tuple[moderngl.Program, str] | None] = { +# hash(""): None +# } + +# def get_shader_program( +# self, shader_wrapper: ShaderWrapper +# ) -> tuple[moderngl.Program, str] | None: +# sid = shader_wrapper.get_program_id() +# if sid not in self.id_to_shader_program: +# # Create shader program for the first time, then cache +# # in the id_to_shader_program dictionary +# program = self.ctx.program(**shader_wrapper.get_program_code()) +# vert_format = moderngl.detect_format( +# program, shader_wrapper.vert_attributes +# ) +# self.id_to_shader_program[sid] = (program, vert_format) + +# return self.id_to_shader_program[sid] + +# def set_shader_uniforms( +# self, +# shader: moderngl.Program, +# shader_wrapper: ShaderWrapper, +# ) -> None: +# for name, path in shader_wrapper.texture_paths.items(): +# tid = self.get_texture_id(path) +# shader[name].value = tid +# for name, value in it.chain( +# self.perspective_uniforms.items(), shader_wrapper.uniforms.items() +# ): +# if name in shader: +# if isinstance(value, np.ndarray) and value.ndim > 0: +# value = tuple(value) +# shader[name].value = value +# else: +# logger.debug(f"Uniform {name} not found in shader {shader}") + +# def refresh_perspective_uniforms(self) -> None: +# frame = self.frame +# # Orient light +# rotation = frame.get_inverse_camera_rotation_matrix() +# offset = frame.get_center() +# light_pos = np.dot(rotation, self.light_source.get_location() + offset) +# cam_pos = self.frame.get_implied_camera_location() # TODO + +# self.perspective_uniforms = { +# "frame_shape": frame.get_shape(), +# "pixel_shape": self.get_pixel_shape(), +# "camera_offset": tuple(offset), +# "camera_rotation": tuple(np.array(rotation).T.flatten()), +# "camera_position": tuple(cam_pos), +# "light_source_position": tuple(light_pos), +# "focal_distance": frame.get_focal_distance(), +# } + +# def init_textures(self) -> None: +# self.n_textures: int = 0 +# self.path_to_texture: dict[str, tuple[int, moderngl.Texture]] = {} + +# def get_texture_id(self, path: str) -> int: +# if path not in self.path_to_texture: +# if self.n_textures == 15: # I have no clue why this is needed +# self.n_textures += 1 +# tid = self.n_textures +# self.n_textures += 1 +# im = Image.open(path).convert("RGBA") +# texture = self.ctx.texture( +# size=im.size, +# components=len(im.getbands()), +# data=im.tobytes(), +# ) +# texture.use(location=tid) +# self.path_to_texture[path] = (tid, texture) +# return self.path_to_texture[path][0] + +# def release_texture(self, path: str): +# tid_and_texture = self.path_to_texture.pop(path, None) +# if tid_and_texture: +# tid_and_texture[1].release() +# return self \ No newline at end of file diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index 65c252146a..bf2c256c55 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -12,6 +12,11 @@ from typing import TypeAlias Image : TypeAlias = np.ndarray + + +class RendererData: + pass + class Renderer(ABC): def __init__(self): @@ -21,15 +26,19 @@ def __init__(self): ImageMobject: self.render_imobject, } - def render(self, renderables: [VMobject]) -> Image: # Image + def render(self, camera, renderables: [VMobject]) -> Image: # Image for mob in renderables: if type(mob) in self.capabilities: + mob.points self.capabilities[type(mob)](mob) + else: + print("WARNING: NOT SUPPORTED") + return self.fbo.get_pixels() @abstractclassmethod - def render_vmobject(self, mob): + def render_vmobject(self, mob:VMobject): raise NotImplementedError def render_mesh(self, mob): @@ -37,6 +46,7 @@ def render_mesh(self, mob): def render_image(self, mob): raise NotImplementedError + # NOTE: The user should expect depth between renderers not to be handled discussed at 03.09.2023 Between jsonv and MrDiver # NOTE: Cairo_camera overlay_PIL_image for MultiRenderer From c2d1a406f104656faa177b6afae67b0528a1f86d Mon Sep 17 00:00:00 2001 From: "Jason G. Villanueva" Date: Sun, 3 Sep 2023 19:32:20 -0700 Subject: [PATCH 025/106] small color fix openglvmobject --- manim/mobject/opengl/opengl_vectorized_mobject.py | 1 + 1 file changed, 1 insertion(+) diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 8e7efdb089..508b42324f 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -90,6 +90,7 @@ class OpenGLVMobject(OpenGLMobject): def __init__( self, + color: ParsableManimColor | None = None, fill_color: ParsableManimColor | None = None, fill_opacity: float = 0.0, stroke_color: ParsableManimColor | None = None, From aa18dc44d15800fd6375d1b93ba46da7adc7543b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 02:41:13 +0000 Subject: [PATCH 026/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- conftest.py | 1 - manim/_config/utils.py | 6 ++- manim/animation/changing.py | 10 +--- manim/animation/transform.py | 9 +--- manim/animation/transform_matching_parts.py | 3 +- manim/cli/init/commands.py | 8 +--- manim/cli/new/group.py | 8 +--- manim/mobject/geometry/arc.py | 10 ++-- manim/mobject/geometry/labeled.py | 6 +-- manim/mobject/geometry/line.py | 6 ++- manim/mobject/geometry/polygram.py | 3 +- manim/mobject/graphing/coordinate_systems.py | 29 ++++------- manim/mobject/graphing/probability.py | 13 ++--- manim/mobject/mobject.py | 27 ++--------- manim/mobject/opengl/opengl_geometry.py | 18 ++----- manim/mobject/opengl/opengl_image_mobject.py | 3 +- manim/mobject/opengl/opengl_mobject.py | 25 +++------- .../opengl/opengl_point_cloud_mobject.py | 3 +- .../mobject/opengl/opengl_three_dimensions.py | 3 +- .../opengl/opengl_vectorized_mobject.py | 48 +++++++------------ manim/mobject/text/tex_mobject.py | 3 +- manim/mobject/three_d/three_dimensions.py | 16 ++----- manim/mobject/types/point_cloud_mobject.py | 11 +---- manim/mobject/types/vectorized_mobject.py | 20 ++++---- manim/mobject/vector_field.py | 12 +---- manim/renderer/opengl_renderer.py | 12 ++--- manim/renderer/renderer.py | 17 ++++--- manim/scene/scene.py | 6 +-- manim/scene/scene_file_writer.py | 8 ++-- manim/scene/vector_space_scene.py | 16 ++----- manim/utils/ipython_magic.py | 8 +--- manim/utils/iterables.py | 3 +- manim/utils/testing/frames_comparison.py | 10 ++-- tests/module/mobject/text/test_texmobject.py | 3 +- .../test_vectorized_mobject.py | 14 +----- tests/test_config.py | 3 +- tests/test_graphical_units/test_boolops.py | 14 +----- .../opengl/test_play_logic_opengl.py | 11 ++--- tests/test_scene_rendering/test_play_logic.py | 11 ++--- 39 files changed, 140 insertions(+), 297 deletions(-) diff --git a/conftest.py b/conftest.py index da37e19ba5..99b4de16ed 100644 --- a/conftest.py +++ b/conftest.py @@ -12,7 +12,6 @@ pass import moderngl - # If it is running Doctest the current directory # is changed because it also tests the config module # itself. If it's a normal test then it uses the diff --git a/manim/_config/utils.py b/manim/_config/utils.py index 35b862d749..d4ac0aec19 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -1249,9 +1249,11 @@ def renderer(self, val: str | RendererType) -> None: val = val.lower() renderer = RendererType(val) try: - from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL + from manim.mobject.opengl.opengl_compatibility import \ + ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject - from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject + from manim.mobject.opengl.opengl_vectorized_mobject import \ + OpenGLVMobject from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VMobject diff --git a/manim/animation/changing.py b/manim/animation/changing.py index 0354a1c002..1b4d6c5bad 100644 --- a/manim/animation/changing.py +++ b/manim/animation/changing.py @@ -9,14 +9,8 @@ from manim._config import config from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.utils.color import ( - BLUE_B, - BLUE_D, - BLUE_E, - GREY_BROWN, - WHITE, - ParsableManimColor, -) +from manim.utils.color import (BLUE_B, BLUE_D, BLUE_E, GREY_BROWN, WHITE, + ParsableManimColor) from manim.utils.rate_functions import smooth diff --git a/manim/animation/transform.py b/manim/animation/transform.py index 85b1fbca4b..110cfb7571 100644 --- a/manim/animation/transform.py +++ b/manim/animation/transform.py @@ -36,13 +36,8 @@ from .. import config from ..animation.animation import Animation -from ..constants import ( - DEFAULT_POINTWISE_FUNCTION_RUN_TIME, - DEGREES, - ORIGIN, - OUT, - RendererType, -) +from ..constants import (DEFAULT_POINTWISE_FUNCTION_RUN_TIME, DEGREES, ORIGIN, + OUT, RendererType) from ..mobject.mobject import Group, Mobject from ..utils.paths import path_along_arc, path_along_circles from ..utils.rate_functions import smooth, squish_rate_func diff --git a/manim/animation/transform_matching_parts.py b/manim/animation/transform_matching_parts.py index 8c97643860..6babda7a7c 100644 --- a/manim/animation/transform_matching_parts.py +++ b/manim/animation/transform_matching_parts.py @@ -9,7 +9,8 @@ import numpy as np from manim.mobject.opengl.opengl_mobject import OpenGLGroup, OpenGLMobject -from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup, OpenGLVMobject +from manim.mobject.opengl.opengl_vectorized_mobject import (OpenGLVGroup, + OpenGLVMobject) from .._config import config from ..constants import RendererType diff --git a/manim/cli/init/commands.py b/manim/cli/init/commands.py index 67dc751646..6b1a744a34 100644 --- a/manim/cli/init/commands.py +++ b/manim/cli/init/commands.py @@ -15,12 +15,8 @@ from ... import console from ...constants import CONTEXT_SETTINGS, EPILOG, QUALITIES -from ...utils.file_ops import ( - add_import_statement, - copy_template_files, - get_template_names, - get_template_path, -) +from ...utils.file_ops import (add_import_statement, copy_template_files, + get_template_names, get_template_path) CFG_DEFAULTS = { "frame_rate": 30, diff --git a/manim/cli/new/group.py b/manim/cli/new/group.py index 6058102695..a0cd910240 100644 --- a/manim/cli/new/group.py +++ b/manim/cli/new/group.py @@ -8,12 +8,8 @@ from ... import console from ...constants import CONTEXT_SETTINGS, EPILOG, QUALITIES -from ...utils.file_ops import ( - add_import_statement, - copy_template_files, - get_template_names, - get_template_path, -) +from ...utils.file_ops import (add_import_statement, copy_template_files, + get_template_names, get_template_path) CFG_DEFAULTS = { "frame_rate": 30, diff --git a/manim/mobject/geometry/arc.py b/manim/mobject/geometry/arc.py index 5672907187..04151c0ae1 100644 --- a/manim/mobject/geometry/arc.py +++ b/manim/mobject/geometry/arc.py @@ -54,13 +54,9 @@ def construct(self): from manim.mobject.types.vectorized_mobject import VMobject from manim.utils.color import * from manim.utils.iterables import adjacent_pairs -from manim.utils.space_ops import ( - angle_of_vector, - cartesian_to_spherical, - line_intersection, - perpendicular_bisector, - rotate_vector, -) +from manim.utils.space_ops import (angle_of_vector, cartesian_to_spherical, + line_intersection, perpendicular_bisector, + rotate_vector) if TYPE_CHECKING: from manim.mobject.mobject import Mobject diff --git a/manim/mobject/geometry/labeled.py b/manim/mobject/geometry/labeled.py index 1a39ee2771..ee80a038e9 100644 --- a/manim/mobject/geometry/labeled.py +++ b/manim/mobject/geometry/labeled.py @@ -6,10 +6,8 @@ from manim.constants import * from manim.mobject.geometry.line import Arrow, Line -from manim.mobject.geometry.shape_matchers import ( - BackgroundRectangle, - SurroundingRectangle, -) +from manim.mobject.geometry.shape_matchers import (BackgroundRectangle, + SurroundingRectangle) from manim.mobject.text.tex_mobject import MathTex, Tex from manim.mobject.text.text_mobject import Text from manim.utils.color import WHITE, ManimColor, ParsableManimColor diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index 3a69de3d4f..a5eecde11a 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -20,12 +20,14 @@ from manim import config from manim.constants import * -from manim.mobject.geometry.arc import Arc, ArcBetweenPoints, Dot, TipableVMobject +from manim.mobject.geometry.arc import (Arc, ArcBetweenPoints, Dot, + TipableVMobject) from manim.mobject.geometry.tips import ArrowTriangleFilledTip from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject -from manim.mobject.types.vectorized_mobject import DashedVMobject, VGroup, VMobject +from manim.mobject.types.vectorized_mobject import (DashedVMobject, VGroup, + VMobject) from manim.utils.color import * from manim.utils.space_ops import angle_of_vector, line_intersection, normalize diff --git a/manim/mobject/geometry/polygram.py b/manim/mobject/geometry/polygram.py index 5064ff737e..779ea19725 100644 --- a/manim/mobject/geometry/polygram.py +++ b/manim/mobject/geometry/polygram.py @@ -26,7 +26,8 @@ from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.utils.color import * from manim.utils.iterables import adjacent_n_tuples, adjacent_pairs -from manim.utils.space_ops import angle_between_vectors, normalize, regular_vertices +from manim.utils.space_ops import (angle_between_vectors, normalize, + regular_vertices) class Polygram(VMobject, metaclass=ConvertToOpenGL): diff --git a/manim/mobject/graphing/coordinate_systems.py b/manim/mobject/graphing/coordinate_systems.py index 8bfc98dd8c..71adea710c 100644 --- a/manim/mobject/graphing/coordinate_systems.py +++ b/manim/mobject/graphing/coordinate_systems.py @@ -23,32 +23,21 @@ from manim.mobject.geometry.arc import Circle, Dot from manim.mobject.geometry.line import Arrow, DashedLine, Line from manim.mobject.geometry.polygram import Polygon, Rectangle, RegularPolygon -from manim.mobject.graphing.functions import ImplicitFunction, ParametricFunction +from manim.mobject.graphing.functions import (ImplicitFunction, + ParametricFunction) from manim.mobject.graphing.number_line import NumberLine from manim.mobject.graphing.scale import LinearBase from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_surface import OpenGLSurface from manim.mobject.text.tex_mobject import MathTex from manim.mobject.three_d.three_dimensions import Surface -from manim.mobject.types.vectorized_mobject import ( - VDict, - VectorizedPoint, - VGroup, - VMobject, -) -from manim.utils.color import ( - BLACK, - BLUE, - BLUE_D, - GREEN, - WHITE, - YELLOW, - ManimColor, - ParsableManimColor, - color_gradient, - invert_color, -) -from manim.utils.config_ops import merge_dicts_recursively, update_dict_recursively +from manim.mobject.types.vectorized_mobject import (VDict, VectorizedPoint, + VGroup, VMobject) +from manim.utils.color import (BLACK, BLUE, BLUE_D, GREEN, WHITE, YELLOW, + ManimColor, ParsableManimColor, color_gradient, + invert_color) +from manim.utils.config_ops import (merge_dicts_recursively, + update_dict_recursively) from manim.utils.simple_functions import binary_search from manim.utils.space_ops import angle_of_vector diff --git a/manim/mobject/graphing/probability.py b/manim/mobject/graphing/probability.py index 92fb7355e1..fa9f11a0a9 100644 --- a/manim/mobject/graphing/probability.py +++ b/manim/mobject/graphing/probability.py @@ -18,16 +18,9 @@ from manim.mobject.svg.brace import Brace from manim.mobject.text.tex_mobject import MathTex, Tex from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.utils.color import ( - BLUE_E, - DARK_GREY, - GREEN_E, - LIGHT_GREY, - MAROON_B, - YELLOW, - ParsableManimColor, - color_gradient, -) +from manim.utils.color import (BLUE_E, DARK_GREY, GREEN_E, LIGHT_GREY, + MAROON_B, YELLOW, ParsableManimColor, + color_gradient) from manim.utils.iterables import tuplify EPSILON = 0.0001 diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 79ccc41231..4509343091 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -15,19 +15,8 @@ from functools import partialmethod, reduce from math import ceil from pathlib import Path -from typing import ( - TYPE_CHECKING, - Callable, - Dict, - Iterable, - List, - Optional, - Sequence, - Tuple, - Type, - TypeVar, - Union, -) +from typing import (TYPE_CHECKING, Callable, Dict, Iterable, List, Optional, + Sequence, Tuple, Type, TypeVar, Union) import numpy as np @@ -35,15 +24,9 @@ from .. import config, logger from ..constants import * -from ..utils.color import ( - BLACK, - WHITE, - YELLOW_C, - ManimColor, - ParsableManimColor, - color_gradient, - interpolate_color, -) +from ..utils.color import (BLACK, WHITE, YELLOW_C, ManimColor, + ParsableManimColor, color_gradient, + interpolate_color) from ..utils.exceptions import MultiAnimationOverrideException from ..utils.iterables import list_update, remove_list_redundancies from ..utils.paths import straight_path diff --git a/manim/mobject/opengl/opengl_geometry.py b/manim/mobject/opengl/opengl_geometry.py index 3f9379b14d..bb12590cee 100644 --- a/manim/mobject/opengl/opengl_geometry.py +++ b/manim/mobject/opengl/opengl_geometry.py @@ -5,22 +5,14 @@ from manim.constants import * from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_vectorized_mobject import ( - OpenGLDashedVMobject, - OpenGLVGroup, - OpenGLVMobject, -) + OpenGLDashedVMobject, OpenGLVGroup, OpenGLVMobject) from manim.utils.color import * from manim.utils.iterables import adjacent_n_tuples, adjacent_pairs from manim.utils.simple_functions import clip -from manim.utils.space_ops import ( - angle_between_vectors, - angle_of_vector, - compass_directions, - find_intersection, - normalize, - rotate_vector, - rotation_matrix_transpose, -) +from manim.utils.space_ops import (angle_between_vectors, angle_of_vector, + compass_directions, find_intersection, + normalize, rotate_vector, + rotation_matrix_transpose) DEFAULT_DOT_RADIUS = 0.08 DEFAULT_SMALL_DOT_RADIUS = 0.04 diff --git a/manim/mobject/opengl/opengl_image_mobject.py b/manim/mobject/opengl/opengl_image_mobject.py index 7f2828712f..794f7426e7 100644 --- a/manim/mobject/opengl/opengl_image_mobject.py +++ b/manim/mobject/opengl/opengl_image_mobject.py @@ -10,7 +10,8 @@ from PIL import Image from PIL.Image import Resampling -from manim.mobject.opengl.opengl_surface import OpenGLSurface, OpenGLTexturedSurface +from manim.mobject.opengl.opengl_surface import (OpenGLSurface, + OpenGLTexturedSurface) from manim.utils.images import get_full_raster_image_path diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index faa0d5e68a..0d69343690 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -23,27 +23,16 @@ from manim.utils.bezier import integer_interpolate, interpolate from manim.utils.color import * from manim.utils.deprecation import deprecated - # from ..utils.iterables import batch_by_property -from manim.utils.iterables import ( - batch_by_property, - list_update, - listify, - make_even, - resize_array, - resize_preserving_order, - resize_with_interpolation, - uniq_chain, -) +from manim.utils.iterables import (batch_by_property, list_update, listify, + make_even, resize_array, + resize_preserving_order, + resize_with_interpolation, uniq_chain) from manim.utils.paths import straight_path from manim.utils.simple_functions import get_parameters -from manim.utils.space_ops import ( - angle_between_vectors, - angle_of_vector, - get_norm, - normalize, - rotation_matrix_transpose, -) +from manim.utils.space_ops import (angle_between_vectors, angle_of_vector, + get_norm, normalize, + rotation_matrix_transpose) if TYPE_CHECKING: from typing import Callable, Iterable, Sequence, Tuple, Union diff --git a/manim/mobject/opengl/opengl_point_cloud_mobject.py b/manim/mobject/opengl/opengl_point_cloud_mobject.py index 6f1d879ae7..1e7b3a4972 100644 --- a/manim/mobject/opengl/opengl_point_cloud_mobject.py +++ b/manim/mobject/opengl/opengl_point_cloud_mobject.py @@ -8,7 +8,8 @@ from manim.constants import * from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.utils.bezier import interpolate -from manim.utils.color import BLACK, WHITE, YELLOW, color_gradient, color_to_rgba +from manim.utils.color import (BLACK, WHITE, YELLOW, color_gradient, + color_to_rgba) from manim.utils.config_ops import _Uniforms from manim.utils.iterables import resize_with_interpolation diff --git a/manim/mobject/opengl/opengl_three_dimensions.py b/manim/mobject/opengl/opengl_three_dimensions.py index 097d5739b9..88695999ea 100644 --- a/manim/mobject/opengl/opengl_three_dimensions.py +++ b/manim/mobject/opengl/opengl_three_dimensions.py @@ -3,7 +3,8 @@ import numpy as np from manim.mobject.opengl.opengl_surface import OpenGLSurface -from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup, OpenGLVMobject +from manim.mobject.opengl.opengl_vectorized_mobject import (OpenGLVGroup, + OpenGLVMobject) class OpenGLSurfaceMesh(OpenGLVGroup): diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 508b42324f..705e83acba 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -10,40 +10,24 @@ from manim import config from manim.constants import * -from manim.mobject.opengl.opengl_mobject import ( - UNIFORM_DTYPE, - OpenGLMobject, - OpenGLPoint, -) +from manim.mobject.opengl.opengl_mobject import (UNIFORM_DTYPE, OpenGLMobject, + OpenGLPoint) from manim.renderer.shader_wrapper import ShaderWrapper -from manim.utils.bezier import ( - bezier, - get_quadratic_approximation_of_cubic, - get_smooth_cubic_bezier_handle_points, - get_smooth_quadratic_bezier_handle_points, - integer_interpolate, - interpolate, - inverse_interpolate, - partial_quadratic_bezier_points, - proportions_along_bezier_curve_for_point, - quadratic_bezier_remap, -) +from manim.utils.bezier import (bezier, get_quadratic_approximation_of_cubic, + get_smooth_cubic_bezier_handle_points, + get_smooth_quadratic_bezier_handle_points, + integer_interpolate, interpolate, + inverse_interpolate, + partial_quadratic_bezier_points, + proportions_along_bezier_curve_for_point, + quadratic_bezier_remap) from manim.utils.color import * -from manim.utils.iterables import ( - listify, - make_even, - resize_array, - resize_with_interpolation, -) -from manim.utils.space_ops import ( - angle_between_vectors, - cross2d, - earclip_triangulation, - get_norm, - get_unit_normal, - shoelace_direction, - z_to_vector, -) +from manim.utils.iterables import (listify, make_even, resize_array, + resize_with_interpolation) +from manim.utils.space_ops import (angle_between_vectors, cross2d, + earclip_triangulation, get_norm, + get_unit_normal, shoelace_direction, + z_to_vector) if TYPE_CHECKING: from typing import Callable, Iterable, Optional, Sequence diff --git a/manim/mobject/text/tex_mobject.py b/manim/mobject/text/tex_mobject.py index 22922ab543..6ea930157a 100644 --- a/manim/mobject/text/tex_mobject.py +++ b/manim/mobject/text/tex_mobject.py @@ -34,7 +34,8 @@ from manim.constants import * from manim.mobject.geometry.line import Line from manim.mobject.svg.svg_mobject import SVGMobject -from manim.mobject.types.vectorized_mobject import VectorizedPoint, VGroup, VMobject +from manim.mobject.types.vectorized_mobject import (VectorizedPoint, VGroup, + VMobject) from manim.utils.tex import TexTemplate from manim.utils.tex_file_writing import tex_to_svg_file diff --git a/manim/mobject/three_d/three_dimensions.py b/manim/mobject/three_d/three_dimensions.py index e2ac7babc2..3db72ae963 100644 --- a/manim/mobject/three_d/three_dimensions.py +++ b/manim/mobject/three_d/three_dimensions.py @@ -28,18 +28,12 @@ from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.utils.color import ( - BLUE, - BLUE_D, - BLUE_E, - LIGHT_GREY, - WHITE, - ManimColor, - ParsableManimColor, - interpolate_color, -) +from manim.utils.color import (BLUE, BLUE_D, BLUE_E, LIGHT_GREY, WHITE, + ManimColor, ParsableManimColor, + interpolate_color) from manim.utils.iterables import tuplify -from manim.utils.space_ops import normalize, perpendicular_bisector, z_to_vector +from manim.utils.space_ops import (normalize, perpendicular_bisector, + z_to_vector) class ThreeDVMobject(VMobject, metaclass=ConvertToOpenGL): diff --git a/manim/mobject/types/point_cloud_mobject.py b/manim/mobject/types/point_cloud_mobject.py index 43e2ff08e2..14b8a98c81 100644 --- a/manim/mobject/types/point_cloud_mobject.py +++ b/manim/mobject/types/point_cloud_mobject.py @@ -12,15 +12,8 @@ from ...constants import * from ...mobject.mobject import Mobject from ...utils.bezier import interpolate -from ...utils.color import ( - BLACK, - WHITE, - YELLOW, - ManimColor, - color_gradient, - color_to_rgba, - rgba_to_color, -) +from ...utils.color import (BLACK, WHITE, YELLOW, ManimColor, color_gradient, + color_to_rgba, rgba_to_color) from ...utils.iterables import stretch_array_to_length diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index da8e560b59..86a9ba980a 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -22,23 +22,19 @@ from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject -from manim.mobject.three_d.three_d_utils import ( - get_3d_vmob_gradient_start_and_end_points, -) +from manim.mobject.three_d.three_d_utils import \ + get_3d_vmob_gradient_start_and_end_points from ... import config from ...constants import * from ...mobject.mobject import Mobject -from ...utils.bezier import ( - bezier, - get_smooth_handle_points, - integer_interpolate, - interpolate, - partial_bezier_points, - proportions_along_bezier_curve_for_point, -) +from ...utils.bezier import (bezier, get_smooth_handle_points, + integer_interpolate, interpolate, + partial_bezier_points, + proportions_along_bezier_curve_for_point) from ...utils.color import BLACK, WHITE, ManimColor, ParsableManimColor -from ...utils.iterables import make_even, resize_array, stretch_array_to_length, tuplify +from ...utils.iterables import (make_even, resize_array, + stretch_array_to_length, tuplify) from ...utils.space_ops import rotate_vector, shoelace_direction # TODO diff --git a/manim/mobject/vector_field.py b/manim/mobject/vector_field.py index 58a21c8614..838770ccd4 100644 --- a/manim/mobject/vector_field.py +++ b/manim/mobject/vector_field.py @@ -28,16 +28,8 @@ from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VGroup, VMobject from ..utils.bezier import interpolate, inverse_interpolate -from ..utils.color import ( - BLUE_E, - GREEN, - RED, - YELLOW, - ManimColor, - ParsableManimColor, - color_to_rgb, - rgb_to_color, -) +from ..utils.color import (BLUE_E, GREEN, RED, YELLOW, ManimColor, + ParsableManimColor, color_to_rgb, rgb_to_color) from ..utils.rate_functions import ease_out_sine, linear from ..utils.simple_functions import sigmoid diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 28a88a0303..e599d7cf2e 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -1,8 +1,8 @@ import numpy as np -from renderer import Renderer +from renderer import Renderer, RendererData from manim.mobject.types.vectorized_mobject import VMobject -from renderer import RendererData + class GLRenderData(RendererData): def __init__(self) -> None: @@ -13,7 +13,7 @@ def __init__(self) -> None: self.mesh = np.zeros((0,3)) self.bounding_box = np.zeros((3,3)) -class OpenGLRenderer(Renderer): +class OpenGLRenderer(Renderer): def __init__( self, ctx: moderngl.Context | None = None, @@ -71,11 +71,11 @@ def render_vmobject(self, mob: VMobject) -> None: if mob.colors_changed: mob.renderer_data.fill_rgbas = np.resize(mob.fill_color, (len(mob.renderer_data.mesh),4)) - + if mob.points_changed: if(mob.has_fill()): mob.renderer_data.mesh = ... # Triangulation todo - + # set shader # use vbo # render fill @@ -383,4 +383,4 @@ def render_vmobject(self, mob: VMobject) -> None: # tid_and_texture = self.path_to_texture.pop(path, None) # if tid_and_texture: # tid_and_texture[1].release() -# return self \ No newline at end of file +# return self diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index bf2c256c55..d98653e111 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -1,12 +1,12 @@ -import numpy as np - from abc import ABC, abstractclassmethod, abstractstaticmethod from typing import TYPE_CHECKING -from manim.scene import Scene +import numpy as np + from manim import config -from manim.mobject.types.vectorized_mobject import VMobject from manim.mobject.types.image_mobject import ImageMobject +from manim.mobject.types.vectorized_mobject import VMobject +from manim.scene import Scene if TYPE_CHECKING: from typing import TypeAlias @@ -33,7 +33,7 @@ def render(self, camera, renderables: [VMobject]) -> Image: # Image self.capabilities[type(mob)](mob) else: print("WARNING: NOT SUPPORTED") - + return self.fbo.get_pixels() @@ -46,7 +46,7 @@ def render_mesh(self, mob): def render_image(self, mob): raise NotImplementedError - + # NOTE: The user should expect depth between renderers not to be handled discussed at 03.09.2023 Between jsonv and MrDiver # NOTE: Cairo_camera overlay_PIL_image for MultiRenderer @@ -66,7 +66,7 @@ def render_image(self, mob): # def mix(): # raise NotImplementedError - + # def multiply(): # raise NotImplementedError @@ -76,7 +76,7 @@ def render_image(self, mob): # class GraphScene(Scene): # def construct(self): -# config.renderer = +# config.renderer = # class VolumetricScene(Scene): # def construct(self): @@ -87,4 +87,3 @@ def render_image(self, mob): # compositor.add_capability(VolumetricScene, Blender, ) # 3 sec # compositor.addPostFX(CustomShader) # compositor.render() - diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 04016e1b54..6dbea48315 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -25,10 +25,8 @@ from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.scene.scene_file_writer import SceneFileWriter from manim.utils.color import RED -from manim.utils.family_ops import ( - extract_mobject_family_members, - recursive_mobject_remove, -) +from manim.utils.family_ops import (extract_mobject_family_members, + recursive_mobject_remove) from manim.utils.module_ops import get_module if TYPE_CHECKING: diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 93185867b2..51f6ad100d 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -15,11 +15,9 @@ from manim import config from manim._config import logger as log from manim.mobject.mobject import Mobject -from manim.utils.file_ops import ( - add_extension_if_not_present, - get_sorted_integer_files, - guarantee_existence, -) +from manim.utils.file_ops import (add_extension_if_not_present, + get_sorted_integer_files, + guarantee_existence) from manim.utils.sounds import get_full_sound_file_path if TYPE_CHECKING: diff --git a/manim/scene/vector_space_scene.py b/manim/scene/vector_space_scene.py index f651c2c86a..e60a98521f 100644 --- a/manim/scene/vector_space_scene.py +++ b/manim/scene/vector_space_scene.py @@ -21,23 +21,15 @@ from ..animation.creation import Create, Write from ..animation.fading import FadeOut from ..animation.growing import GrowArrow -from ..animation.transform import ApplyFunction, ApplyPointwiseFunction, Transform +from ..animation.transform import (ApplyFunction, ApplyPointwiseFunction, + Transform) from ..constants import * from ..mobject.matrix import Matrix from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VGroup, VMobject from ..scene.scene import Scene -from ..utils.color import ( - BLACK, - BLUE_D, - GREEN_C, - GREY, - RED_C, - WHITE, - YELLOW, - ManimColor, - ParsableManimColor, -) +from ..utils.color import (BLACK, BLUE_D, GREEN_C, GREY, RED_C, WHITE, YELLOW, + ManimColor, ParsableManimColor) from ..utils.rate_functions import rush_from, rush_into from ..utils.space_ops import angle_of_vector diff --git a/manim/utils/ipython_magic.py b/manim/utils/ipython_magic.py index c95e78a828..e499a02c0a 100644 --- a/manim/utils/ipython_magic.py +++ b/manim/utils/ipython_magic.py @@ -18,12 +18,8 @@ try: from IPython import get_ipython from IPython.core.interactiveshell import InteractiveShell - from IPython.core.magic import ( - Magics, - line_cell_magic, - magics_class, - needs_local_scope, - ) + from IPython.core.magic import (Magics, line_cell_magic, magics_class, + needs_local_scope) from IPython.display import Image, Video, display except ImportError: pass diff --git a/manim/utils/iterables.py b/manim/utils/iterables.py index 4b20cfe704..cf0ac6863f 100644 --- a/manim/utils/iterables.py +++ b/manim/utils/iterables.py @@ -19,7 +19,8 @@ ] import itertools as it -from typing import Any, Callable, Collection, Generator, Iterable, Reversible, Sequence +from typing import (Any, Callable, Collection, Generator, Iterable, Reversible, + Sequence) import numpy as np diff --git a/manim/utils/testing/frames_comparison.py b/manim/utils/testing/frames_comparison.py index e20e1a2a56..8842095b9e 100644 --- a/manim/utils/testing/frames_comparison.py +++ b/manim/utils/testing/frames_comparison.py @@ -15,12 +15,10 @@ from manim.scene.three_d_scene import ThreeDScene from ._frames_testers import _ControlDataWriter, _FramesTester -from ._test_class_makers import ( - DummySceneFileWriter, - _make_scene_file_writer_class, - _make_test_renderer_class, - _make_test_scene_class, -) +from ._test_class_makers import (DummySceneFileWriter, + _make_scene_file_writer_class, + _make_test_renderer_class, + _make_test_scene_class) SCENE_PARAMETER_NAME = "scene" _tests_root_dir_path = Path(__file__).absolute().parents[2] diff --git a/tests/module/mobject/text/test_texmobject.py b/tests/module/mobject/text/test_texmobject.py index c45681fad2..3e72ddeb38 100644 --- a/tests/module/mobject/text/test_texmobject.py +++ b/tests/module/mobject/text/test_texmobject.py @@ -4,7 +4,8 @@ import pytest -from manim import MathTex, SingleStringMathTex, Tex, TexTemplate, config, tempconfig +from manim import (MathTex, SingleStringMathTex, Tex, TexTemplate, config, + tempconfig) from manim.mobject.types.vectorized_mobject import VMobject from manim.utils.color import RED diff --git a/tests/module/mobject/types/vectorized_mobject/test_vectorized_mobject.py b/tests/module/mobject/types/vectorized_mobject/test_vectorized_mobject.py index a17383fd98..0850da7a42 100644 --- a/tests/module/mobject/types/vectorized_mobject/test_vectorized_mobject.py +++ b/tests/module/mobject/types/vectorized_mobject/test_vectorized_mobject.py @@ -3,18 +3,8 @@ import numpy as np import pytest -from manim import ( - Circle, - CurvesAsSubmobjects, - Line, - Mobject, - Polygon, - RegularPolygon, - Square, - VDict, - VGroup, - VMobject, -) +from manim import (Circle, CurvesAsSubmobjects, Line, Mobject, Polygon, + RegularPolygon, Square, VDict, VGroup, VMobject) from manim.constants import PI diff --git a/tests/test_config.py b/tests/test_config.py index b543e8a5e6..9e82b377ae 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -8,7 +8,8 @@ from manim import WHITE, Scene, Square, Tex, Text, config, tempconfig from manim._config.utils import ManimConfig -from tests.assert_utils import assert_dir_exists, assert_dir_filled, assert_file_exists +from tests.assert_utils import (assert_dir_exists, assert_dir_filled, + assert_file_exists) def test_tempconfig(): diff --git a/tests/test_graphical_units/test_boolops.py b/tests/test_graphical_units/test_boolops.py index d8e43e1e5a..4366f87a13 100644 --- a/tests/test_graphical_units/test_boolops.py +++ b/tests/test_graphical_units/test_boolops.py @@ -1,17 +1,7 @@ from __future__ import annotations -from manim import ( - BLUE, - Circle, - Difference, - Exclusion, - Intersection, - Rectangle, - Square, - Triangle, - Union, -) - +from manim import (BLUE, Circle, Difference, Exclusion, Intersection, + Rectangle, Square, Triangle, Union) # not exported by default, so directly import from manim.utils.testing.frames_comparison import frames_comparison diff --git a/tests/test_scene_rendering/opengl/test_play_logic_opengl.py b/tests/test_scene_rendering/opengl/test_play_logic_opengl.py index 5e51aee926..c0f2bc7c92 100644 --- a/tests/test_scene_rendering/opengl/test_play_logic_opengl.py +++ b/tests/test_scene_rendering/opengl/test_play_logic_opengl.py @@ -7,14 +7,9 @@ from manim import * from manim import config -from ..simple_scenes import ( - SceneForFrozenFrameTests, - SceneWithMultipleCalls, - SceneWithNonStaticWait, - SceneWithSceneUpdater, - SceneWithStaticWait, - SquareToCircle, -) +from ..simple_scenes import (SceneForFrozenFrameTests, SceneWithMultipleCalls, + SceneWithNonStaticWait, SceneWithSceneUpdater, + SceneWithStaticWait, SquareToCircle) @pytest.mark.skipif( diff --git a/tests/test_scene_rendering/test_play_logic.py b/tests/test_scene_rendering/test_play_logic.py index a0d97920bd..6892acaf6a 100644 --- a/tests/test_scene_rendering/test_play_logic.py +++ b/tests/test_scene_rendering/test_play_logic.py @@ -8,14 +8,9 @@ from manim import * from manim import config -from .simple_scenes import ( - SceneForFrozenFrameTests, - SceneWithMultipleCalls, - SceneWithNonStaticWait, - SceneWithSceneUpdater, - SceneWithStaticWait, - SquareToCircle, -) +from .simple_scenes import (SceneForFrozenFrameTests, SceneWithMultipleCalls, + SceneWithNonStaticWait, SceneWithSceneUpdater, + SceneWithStaticWait, SquareToCircle) @pytest.mark.skipif( From 9904627b19b0b8130c822f98af72345d17a8551e Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Sun, 10 Sep 2023 14:05:00 +0200 Subject: [PATCH 027/106] wip: copy data functions to opengl_renderer, preparing uniforms and shaders --- example_scenes/test_new.py | 14 + manim/camera/camera.py | 18 +- manim/mobject/opengl/opengl_mobject.py | 35 +- .../opengl/opengl_vectorized_mobject.py | 149 +++--- manim/opengl/__init__.py | 1 - manim/renderer/opengl_renderer.py | 262 ++++++++--- manim/renderer/opengl_shader_program.py | 90 ++++ manim/renderer/renderer.py | 21 +- manim/renderer/shader.py | 445 ------------------ .../renderer/vectorized_mobject_rendering.py | 287 ----------- manim/utils/color/core.py | 25 +- pyproject.toml | 3 - tests/experimental/test_vmobject_init.py | 18 + 13 files changed, 483 insertions(+), 885 deletions(-) create mode 100644 example_scenes/test_new.py create mode 100644 manim/renderer/opengl_shader_program.py delete mode 100644 manim/renderer/shader.py delete mode 100644 manim/renderer/vectorized_mobject_rendering.py create mode 100644 tests/experimental/test_vmobject_init.py diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py new file mode 100644 index 0000000000..14b015d233 --- /dev/null +++ b/example_scenes/test_new.py @@ -0,0 +1,14 @@ +import manim.utils.color.manim_colors as col +from manim.camera.camera import OpenGLCamera, OpenGLCameraFrame +from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject +from manim.renderer.opengl_renderer import OpenGLRenderer + +renderer = OpenGLRenderer(1920, 1080) +vm = OpenGLVMobject([col.RED, col.GREEN]) +vm.set_points_as_corners([[0, 0, 0], [1, 0, 0], [1, 1, 0]]) +# print(vm.color) +# print(vm.fill_color) +# print(vm.stroke_color) + +camera = OpenGLCameraFrame((1920, 1090)) +renderer.render_vmobject(vm, camera) diff --git a/manim/camera/camera.py b/manim/camera/camera.py index 701819af53..413ce60c89 100644 --- a/manim/camera/camera.py +++ b/manim/camera/camera.py @@ -30,6 +30,7 @@ from ..utils.space_ops import normalize +# TODO: This becomes the new camera in the future class OpenGLCameraFrame(OpenGLMobject): def __init__( self, @@ -41,13 +42,11 @@ def __init__( self.frame_shape = frame_shape self.center_point = center_point self.focal_dist_to_height = focal_dist_to_height + self.orientation = Rotation.identity().as_quat() super().__init__(**kwargs) def init_uniforms(self): super().init_uniforms() - # as a quarternion - self.uniforms["orientation"] = Rotation.identity().as_quat() - self.uniforms["focal_dist_to_height"] = self.focal_dist_to_height def init_points(self) -> None: self.set_points([ORIGIN, LEFT, RIGHT, DOWN, UP]) @@ -56,11 +55,11 @@ def init_points(self) -> None: self.move_to(self.center_point) def set_orientation(self, rotation: Rotation): - self.uniforms["orientation"] = rotation.as_quat() + self.orientation = rotation.as_quat() return self def get_orientation(self): - return Rotation.from_quat(self.uniforms["orientation"]) + return Rotation.from_quat(self.orientation) def to_default_state(self): self.center() @@ -137,11 +136,11 @@ def increment_gamma(self, dgamma: float): return self def set_focal_distance(self, focal_distance: float): - self.uniforms["focal_dist_to_height"] = focal_distance / self.get_height() + self.focal_dist_to_height = focal_distance / self.get_height() return self def set_field_of_view(self, field_of_view: float): - self.uniforms["focal_dist_to_height"] = 2 * math.tan(field_of_view / 2) + self.focal_dist_to_height = 2 * math.tan(field_of_view / 2) return self def get_shape(self): @@ -160,10 +159,10 @@ def get_height(self) -> float: return points[4, 1] - points[3, 1] def get_focal_distance(self) -> float: - return self.uniforms["focal_dist_to_height"] * self.get_height() # type: ignore + return self.focal_dist_to_height * self.get_height() # type: ignore def get_field_of_view(self) -> float: - return 2 * math.atan(self.uniforms["focal_dist_to_height"] / 2) + return 2 * math.atan(self.focal_dist_to_height / 2) def get_implied_camera_location(self) -> np.ndarray: to_camera = self.get_inverse_camera_rotation_matrix()[2] @@ -171,6 +170,7 @@ def get_implied_camera_location(self) -> np.ndarray: return self.get_center() + dist * to_camera +# TODO: This is already ported to the renderer and now is useless, leavefor now for compoatibilty reasons class OpenGLCamera: def __init__( self, diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index 0d69343690..f212295704 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -13,6 +13,7 @@ import moderngl import numpy as np +from typing_extensions import TypeVar from manim import config, logger from manim.constants import * @@ -23,16 +24,27 @@ from manim.utils.bezier import integer_interpolate, interpolate from manim.utils.color import * from manim.utils.deprecation import deprecated + # from ..utils.iterables import batch_by_property -from manim.utils.iterables import (batch_by_property, list_update, listify, - make_even, resize_array, - resize_preserving_order, - resize_with_interpolation, uniq_chain) +from manim.utils.iterables import ( + batch_by_property, + list_update, + listify, + make_even, + resize_array, + resize_preserving_order, + resize_with_interpolation, + uniq_chain, +) from manim.utils.paths import straight_path from manim.utils.simple_functions import get_parameters -from manim.utils.space_ops import (angle_between_vectors, angle_of_vector, - get_norm, normalize, - rotation_matrix_transpose) +from manim.utils.space_ops import ( + angle_between_vectors, + angle_of_vector, + get_norm, + normalize, + rotation_matrix_transpose, +) if TYPE_CHECKING: from typing import Callable, Iterable, Sequence, Tuple, Union @@ -43,6 +55,9 @@ NonTimeUpdater: TypeAlias = Callable[[OpenGLMobject], OpenGLMobject | None] Updater: TypeAlias = Union[TimeBasedUpdater, NonTimeUpdater] PointUpdateFunction: TypeAlias = Callable[[np.ndarray], np.ndarray] + from manim.renderer.renderer import RendererData + + T = TypeVar("T", bound=RendererData) UNIFORM_DTYPE = np.float64 @@ -135,6 +150,10 @@ def __init__( self.data: dict[str, np.ndarray] = {} self.uniforms: dict[str, float | np.ndarray] = {} + self.renderer_data: T | None = None + self.colors_changed: bool = False + self.points_changed: bool = False + self.init_data() self.init_uniforms() self.init_updaters() @@ -156,7 +175,7 @@ def __str__(self): return self.__class__.__name__ def __repr__(self): - return str(self.name) + return str(self) def __add__(self, other: OpenGLMobject) -> Self: if not isinstance(other, OpenGLMobject): diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 705e83acba..84354df619 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -10,24 +10,41 @@ from manim import config from manim.constants import * -from manim.mobject.opengl.opengl_mobject import (UNIFORM_DTYPE, OpenGLMobject, - OpenGLPoint) +from manim.mobject.opengl.opengl_mobject import ( + UNIFORM_DTYPE, + OpenGLMobject, + OpenGLPoint, +) from manim.renderer.shader_wrapper import ShaderWrapper -from manim.utils.bezier import (bezier, get_quadratic_approximation_of_cubic, - get_smooth_cubic_bezier_handle_points, - get_smooth_quadratic_bezier_handle_points, - integer_interpolate, interpolate, - inverse_interpolate, - partial_quadratic_bezier_points, - proportions_along_bezier_curve_for_point, - quadratic_bezier_remap) +from manim.utils.bezier import ( + bezier, + get_quadratic_approximation_of_cubic, + get_smooth_cubic_bezier_handle_points, + get_smooth_quadratic_bezier_handle_points, + integer_interpolate, + interpolate, + inverse_interpolate, + partial_quadratic_bezier_points, + proportions_along_bezier_curve_for_point, + quadratic_bezier_remap, +) from manim.utils.color import * -from manim.utils.iterables import (listify, make_even, resize_array, - resize_with_interpolation) -from manim.utils.space_ops import (angle_between_vectors, cross2d, - earclip_triangulation, get_norm, - get_unit_normal, shoelace_direction, - z_to_vector) +from manim.utils.iterables import ( + listify, + make_even, + resize_array, + resize_with_interpolation, + tuplify, +) +from manim.utils.space_ops import ( + angle_between_vectors, + cross2d, + earclip_triangulation, + get_norm, + get_unit_normal, + shoelace_direction, + z_to_vector, +) if TYPE_CHECKING: from typing import Callable, Iterable, Optional, Sequence @@ -74,43 +91,42 @@ class OpenGLVMobject(OpenGLMobject): def __init__( self, - color: ParsableManimColor | None = None, - fill_color: ParsableManimColor | None = None, - fill_opacity: float = 0.0, - stroke_color: ParsableManimColor | None = None, - stroke_opacity: float = 1.0, + color: ParsableManimColor | list[ParsableManimColor] | None = None, + fill_color: ParsableManimColor | list[ParsableManimColor] | None = None, + fill_opacity: float | None = None, + stroke_color: ParsableManimColor | list[ParsableManimColor] | None = None, + stroke_opacity: float | None = None, stroke_width: float = DEFAULT_STROKE_WIDTH, draw_stroke_behind_fill: bool = False, background_image_file: str | None = None, long_lines: bool = False, joint_type: LineJointType = LineJointType.AUTO, flat_stroke: bool = False, - # Measured in pixel widths - anti_alias_width: float = 1.0, **kwargs, ): - self.fill_color = fill_color or color or DEFAULT_FILL_COLOR - self.fill_opacity = fill_opacity - self.stroke_color = stroke_color or color or DEFAULT_STROKE_COLOR - self.stroke_opacity = stroke_opacity + if fill_color is None: + fill_color = color + if stroke_color is None: + stroke_color = color + self.fill_color: Iterable[ManimColor] = listify(ManimColor.parse(fill_color)) + self.set_fill(opacity=fill_opacity) + self.stroke_color = listify(ManimColor.parse(stroke_color)) + self.set_stroke(opacity=stroke_opacity) + self.stroke_width = stroke_width self.draw_stroke_behind_fill = draw_stroke_behind_fill self.background_image_file = background_image_file self.long_lines = long_lines self.joint_type = joint_type self.flat_stroke = flat_stroke - self.anti_alias_width = anti_alias_width + # TODO: Remove this because the new shader doesn't need it + self.anti_alias_width = 1.0 self.needs_new_triangulation = True self.triangulation = np.zeros(0, dtype="i4") super().__init__(**kwargs) - self.refresh_unit_normal() - - if fill_color is not None: - self.fill_color = ManimColor.parse(fill_color) - if stroke_color is not None: - self.stroke_color = ManimColor.parse(stroke_color) + # self.refresh_unit_normal() def get_group_class(self): return OpenGLVGroup @@ -177,19 +193,19 @@ def copy(self, deep: bool = False) -> Self: # Colors def init_colors(self): - self.set_fill( - color=self.fill_color or self.color, - opacity=self.fill_opacity, - ) - self.set_stroke( - color=self.stroke_color or self.color, - width=self.stroke_width, - opacity=self.stroke_opacity, - background=self.draw_stroke_behind_fill, - ) - self.set_gloss(self.gloss) - self.set_flat_stroke(self.flat_stroke) - self.color = self.get_color() + # self.set_fill( + # color=self.fill_color or self.color, + # opacity=self.fill_opacity, + # ) + # self.set_stroke( + # color=self.stroke_color or self.color, + # width=self.stroke_width, + # opacity=self.stroke_opacity, + # background=self.draw_stroke_behind_fill, + # ) + # self.set_gloss(self.gloss) + # self.set_flat_stroke(self.flat_stroke) + # self.color = self.get_color() return self def set_rgba_array( @@ -209,7 +225,7 @@ def set_rgba_array( def set_fill( self, - color: ParsableManimColor | None = None, + color: ParsableManimColor | Iterable[ParsableManimColor] | None = None, opacity: float | None = None, recurse: bool = True, ) -> Self: @@ -248,7 +264,12 @@ def construct(self): -------- :meth:`~.OpenGLVMobject.set_style` """ - self.set_rgba_array_by_color(color, opacity, "fill_rgba", recurse) + for mob in self.get_family(recurse): + if color is not None: + mob.fill_color = listify(ManimColor.parse(color)) + if opacity is not None: + for c in mob.fill_color: + c.set_opacity(opacity) return self def set_stroke( @@ -259,18 +280,17 @@ def set_stroke( background=None, recurse=True, ): - self.set_rgba_array_by_color(color, opacity, "stroke_rgba", recurse) + for mob in self.get_family(recurse): + if color is not None: + mob.stroke_color = listify(ManimColor.parse(color)) + if opacity is not None: + for c in mob.stroke_color: + c.set_opacity(opacity) - if width is not None: - for mob in self.get_family(recurse): - if isinstance(width, np.ndarray): - arr = width.reshape((len(width), 1)) - else: - arr = np.array([[w] for w in listify(width)], dtype=float) - mob.data["stroke_width"] = arr + if width is not None: + mob.stroke_width = listify(width) - if background is not None: - for mob in self.get_family(recurse): + if background is not None: mob.draw_stroke_behind_fill = background return self @@ -389,19 +409,19 @@ def fade(self, darkness=0.5, recurse=True) -> Self: # Todo im not quite sure why we are doing this def get_fill_colors(self): - return [ManimColor.from_rgb(rgba[:3]) for rgba in self.fill_rgba] + return self.fill_color def get_fill_opacities(self) -> np.ndarray: - return self.data["fill_rgba"][:, 3] + return (c.to_rgba()[3] for c in self.fill_color) def get_stroke_colors(self): - return [ManimColor.from_rgb(rgba[:3]) for rgba in self.stroke_rgba] + return self.stroke_color def get_stroke_opacities(self) -> np.ndarray: - return self.data["stroke_rgba"][:, 3] + return (c.to_rgba()[3] for c in self.stroke_color) def get_stroke_widths(self) -> np.ndarray: - return self.data["stroke_width"][:, 0] + return self.stroke_width # TODO, it's weird for these to return the first of various lists # rather than the full information @@ -434,6 +454,7 @@ def get_color(self) -> str: return self.get_stroke_color() def has_stroke(self) -> bool: + # TODO: This currently doesn't make sense needs fixing return any(self.data["stroke_width"]) and any(self.data["stroke_rgba"][:, 3]) def has_fill(self) -> bool: diff --git a/manim/opengl/__init__.py b/manim/opengl/__init__.py index 83f6a4ccde..79f9c112df 100644 --- a/manim/opengl/__init__.py +++ b/manim/opengl/__init__.py @@ -14,5 +14,4 @@ from manim.mobject.opengl.opengl_three_dimensions import * from manim.mobject.opengl.opengl_vectorized_mobject import * -from ..renderer.shader import * from ..utils.opengl import * diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index e599d7cf2e..c466f56a58 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -1,80 +1,231 @@ +import re +from functools import lru_cache +from pathlib import Path +from typing import TYPE_CHECKING + +import moderngl as gl import numpy as np -from renderer import Renderer, RendererData +from typing_extensions import override + +import manim.constants as const +import manim.utils.color.manim_colors as color +from manim._config import config, logger +from manim.camera.camera import OpenGLCameraFrame +from manim.renderer.opengl_shader_program import load_shader_program_by_folder +from manim.renderer.renderer import Renderer, RendererData +from manim.utils.space_ops import cross2d, earclip_triangulation, z_to_vector + +if TYPE_CHECKING: + from manim.mobject.types.vectorized_mobject import VMobject -from manim.mobject.types.vectorized_mobject import VMobject +import manim.utils.color.core as c +from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject class GLRenderData(RendererData): def __init__(self) -> None: super().__init__() - self.fill_rgbas = np.zeros((1,4)) - self.stroke_rgbas = np.zeros((1,4)) - self.normals = np.zeros((1,4)) - self.mesh = np.zeros((0,3)) - self.bounding_box = np.zeros((3,3)) + self.fill_rgbas = np.zeros((1, 4)) + self.stroke_rgbas = np.zeros((1, 4)) + self.normals = np.zeros((1, 4)) + self.orientation = None + self.mesh = np.zeros((0, 3)) + self.bounding_box = np.zeros((3, 3)) + + def __repr__(self) -> str: + return f"""GLRenderData +fill: +{self.fill_rgbas} +stroke: +{self.stroke_rgbas} +normals: +{self.normals} +orientation: +{self.orientation} +mesh: +{self.mesh} +bounding_box: +{self.bounding_box} + """ + + +def get_triangulation(vmobject: OpenGLVMobject): + # Figure out how to triangulate the interior to know + # how to send the points as to the vertex shader. + # First triangles come directly from the points + points = vmobject.points + + if len(points) <= 1: + vmobject.triangulation = np.zeros(0, dtype="i4") + vmobject.needs_new_triangulation = False + return vmobject.triangulation + + normal_vector = vmobject.get_unit_normal() + indices = np.arange(len(points), dtype=int) + + # Rotate points such that unit normal vector is OUT + if not np.isclose(normal_vector, const.OUT).all(): + points = np.dot(points, z_to_vector(normal_vector)) + + atol = vmobject.tolerance_for_point_equality + end_of_loop = np.zeros(len(points) // 3, dtype=bool) + end_of_loop[:-1] = (np.abs(points[2:-3:3] - points[3::3]) > atol).any(1) + end_of_loop[-1] = True + + v01s = points[1::3] - points[0::3] + v12s = points[2::3] - points[1::3] + curve_orientations = np.sign(cross2d(v01s, v12s)) + orientation = np.transpose([curve_orientations.repeat(3)]) + + concave_parts = curve_orientations < 0 + + # These are the vertices to which we'll apply a polygon triangulation + inner_vert_indices = np.hstack( + [ + indices[0::3], + indices[1::3][concave_parts], + indices[2::3][end_of_loop], + ] + ) + inner_vert_indices.sort() + rings = np.arange(1, len(inner_vert_indices) + 1)[inner_vert_indices % 3 == 2] + + # Triangulate + inner_verts = points[inner_vert_indices] + inner_tri_indices = inner_vert_indices[earclip_triangulation(inner_verts, rings)] + + tri_indices = np.hstack([indices, inner_tri_indices]) + return tri_indices, orientation + + +def prepare_array(values: np.ndarray, desired_length: int): + """Interpolates a given list of colors to match the desired length + + Parameters + ---------- + values : np.ndarray + a 2 dimensional numpy array where values are interpolated on the y axis + desired_length : int + the desired length for the array + + Returns + ------- + np.ndarray + the interpolated array of values + """ + fill_length = len(values) + if fill_length == 1: + return np.repeat(values, desired_length, axis=0) + xm = np.linspace(0, fill_length - 1, desired_length) + rgbas = [] + for x in xm: + minimum = int(np.floor(x)) + maximum = int(np.ceil(x)) + alpha = x - minimum + if alpha == 0: + rgbas.append(values[minimum]) + continue + + val_a = values[minimum] + val_b = values[maximum] + rgbas.append(val_a * (1 - alpha) + val_b * alpha) + return np.array(rgbas) + + +def compute_bounding_box(mob): + all_points = np.vstack( + [ + mob.points, + *(m.get_bounding_box() for m in mob.get_family()[1:] if m.has_points()), + ], + ) + if len(all_points) == 0: + return np.zeros((3, mob.dim)) + else: + # Lower left and upper right corners + mins = all_points.min(0) + maxs = all_points.max(0) + mids = (mins + maxs) / 2 + return np.array([mins, mids, maxs]) + class OpenGLRenderer(Renderer): + pixel_array_dtype = np.uint8 + def __init__( self, - ctx: moderngl.Context | None = None, - background_image: str | None = None, - frame_config: dict = {}, pixel_width: int = config.pixel_width, pixel_height: int = config.pixel_height, - fps: int = config.frame_rate, - # Note: frame height and width will be resized to match the pixel aspect rati - background_color=BLACK, + samples=4, + background_color: c.ManimColor = color.BLACK, background_opacity: float = 1.0, - # Points in vectorized mobjects with norm greater - # than this value will be rescaled - max_allowable_norm: float = 1.0, - image_mode: str = "RGBA", - n_channels: int = 4, - pixel_array_dtype: type = np.uint8, - light_source_position: np.ndarray = np.array([-10, 10, 10]), - # Although vector graphics handle antialiasing fine - # without multisampling, for 3d scenes one might want - # to set samples to be greater than 0. - samples: int = 0, + background_image: str | None = None, ) -> None: - self.background_image = background_image + logger.debug("Initializing OpenGLRenderer") self.pixel_width = pixel_width self.pixel_height = pixel_height - self.fps = fps - self.max_allowable_norm = max_allowable_norm - self.image_mode = image_mode - self.n_channels = n_channels - self.pixel_array_dtype = pixel_array_dtype - self.light_source_position = light_source_position self.samples = samples + self.background_color = (color.BLACK,) + self.background_image = background_image self.rgb_max_val: float = np.iinfo(self.pixel_array_dtype).max - self.background_color: list[float] = list( - color_to_rgba(background_color, background_opacity) + + # Initializing Context + logger.debug("Initializing OpenGL context and framebuffers") + self.ctx = gl.create_context(standalone=True) + self.target_fbo = self.ctx.simple_framebuffer( + (self.pixel_width, self.pixel_height), samples=self.samples + ) + self.output_fbo = self.ctx.framebuffer( + color_attachments=[ + self.ctx.renderbuffer((self.pixel_width, self.pixel_height)) + ] + ) + + # Preparing vmobject shader + logger.debug("Initializing Shader Programs") + self.vmobject_fill_program = load_shader_program_by_folder( + self.ctx, "quadratic_bezier_fill" + ) + self.vmobject_stroke_program = load_shader_program_by_folder( + self.ctx, "quadratic_bezier_stroke" ) - # self.init_frame(**frame_config) - # self.init_context(ctx) - # self.init_shaders() - # self.init_textures() - # self.init_light_source() - # self.refresh_perspective_uniforms() - # A cached map from mobjects to their associated list of render groups - # so that these render groups are not regenerated unnecessarily for static - # mobjects - self.mob_to_render_groups: dict = {} - - def render_vmobject(self, mob: VMobject) -> None: - # Should be in OpenGL renderer - if not mob.renderer_data: - # Initalization - mob.renderer_data = GLRenderData() - if mob.colors_changed: - mob.renderer_data.fill_rgbas = np.resize(mob.fill_color, (len(mob.renderer_data.mesh),4)) + @override + def render_vmobject(self, mob: OpenGLVMobject, camera: OpenGLCameraFrame) -> None: + # Setting camera uniforms - if mob.points_changed: - if(mob.has_fill()): - mob.renderer_data.mesh = ... # Triangulation todo + if mob.renderer_data is None: + # Initialize + # TODO: Intialize all the data also for submobjects + logger.debug("Initializing GLRenderData") + mob.renderer_data = GLRenderData() + # Generate Mesh + mob.renderer_data.mesh, mob.renderer_data.orientation = get_triangulation( + mob + ) + mesh_length = len(mob.renderer_data.mesh) + + # Generate Fill Color + fill_color = np.array([c._internal_value for c in mob.fill_color]) + stroke_color = np.array([c._internal_value for c in mob.stroke_color]) + mob.renderer_data.fill_rgbas = prepare_array(fill_color, mesh_length) + mob.renderer_data.stroke_rgbas = prepare_array(stroke_color, mesh_length) + mob.renderer_data.normals = np.repeat( + [mob.get_unit_normal()], mesh_length, axis=0 + ) + mob.renderer_data.bounding_box = compute_bounding_box(mob) + + # print(mob.renderer_data.mesh) + # print(mob.renderer_data.orientation) + # print(mob.points) + + # if mob.colors_changed: + # mob.renderer_data.fill_rgbas = np.resize(mob.fill_color, (len(mob.renderer_data.mesh),4)) + + # if mob.points_changed:3357 + # if(mob.has_fill()): + # mob.renderer_data.mesh = ... # Triangulation todo # set shader # use vbo @@ -83,7 +234,8 @@ def render_vmobject(self, mob: VMobject) -> None: # set shader # use vbo # render stroke - self.fbo ... + # self.fbo ... + # def init_frame(self, **config) -> None: # self.frame = OpenGLCameraFrame(**config) diff --git a/manim/renderer/opengl_shader_program.py b/manim/renderer/opengl_shader_program.py new file mode 100644 index 0000000000..1aadcc25b4 --- /dev/null +++ b/manim/renderer/opengl_shader_program.py @@ -0,0 +1,90 @@ +# For caching +import re +from functools import lru_cache +from pathlib import Path + +import moderngl as gl + +from manim._config import logger + +filename_to_code_map: dict = {} + + +def get_shader_dir(): + return Path(__file__).parent / "shaders" + + +def find_file(file_name: Path, directories: list[Path]) -> Path: + # Check if what was passed in is already a valid path to a file + if file_name.exists(): + return file_name + possible_paths = (directory / file_name for directory in directories) + for path in possible_paths: + logger.debug(f"Searching for {file_name} in {path}") + if path.exists(): + return path + else: + logger.debug(f"shader_wrapper.py::find_file() : {path} does not exist.") + raise OSError(f"{file_name} not Found") + + +@lru_cache(maxsize=12) +def get_shader_code_from_file(filename: Path) -> str | None: + if filename in filename_to_code_map: + return filename_to_code_map[filename] + try: + filepath = find_file( + filename, + directories=[get_shader_dir(), Path("/")], + ) + except OSError: + logger.warning(f"Could not find shader file {filename}") + return None + + result = filepath.read_text() + + # To share functionality between shaders, some functions are read in + # from other files an inserted into the relevant strings before + # passing to ctx.program for compiling + # Replace "#INSERT " lines with relevant code + insertions = re.findall( + r"^#include.*", + result, + flags=re.MULTILINE, + ) + for line in insertions: + include_path = line.strip().replace("#include", "") + include_path = include_path.replace('"', "") + path = (filepath.parent / Path(include_path.strip())).resolve() + logger.debug(f"Trying to get code from: {path} to include in {filepath.name}") + inserted_code = get_shader_code_from_file( + path, + ) + if inserted_code is None: + return None + + result = result.replace( + line, + f"// Start include of: {include_path}\n\n{inserted_code}\n\n// End include of: {include_path}", + ) + filename_to_code_map[filename] = result + return result + + +def load_shader_program_by_folder(ctx: gl.Context, folder_name: str): + vertex_code = get_shader_code_from_file(Path(folder_name + "/vert.glsl")) + geometry_code = get_shader_code_from_file(Path(folder_name + "/geom.glsl")) + fragment_code = get_shader_code_from_file(Path(folder_name + "/frag.glsl")) + if vertex_code is None or fragment_code is None: + logger.error( + f"Invalid program definition for {folder_name} vertex or fragment shader not present" + ) + raise RuntimeError("Loading Shader Program Error") + if geometry_code is None: + return ctx.program(vertex_shader=vertex_code, fragment_shader=fragment_code) + elif geometry_code is not None: + return ctx.program( + vertex_shader=vertex_code, + geometry_shader=geometry_code, + fragment_shader=fragment_code, + ) diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index d98653e111..6c53f5f79e 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -2,31 +2,29 @@ from typing import TYPE_CHECKING import numpy as np +from typing_extensions import TypeAlias from manim import config +from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.mobject.types.image_mobject import ImageMobject from manim.mobject.types.vectorized_mobject import VMobject -from manim.scene import Scene - -if TYPE_CHECKING: - from typing import TypeAlias - Image : TypeAlias = np.ndarray +Image: TypeAlias = np.ndarray class RendererData: pass -class Renderer(ABC): +class Renderer(ABC): def __init__(self): self.fbo = np.zeros((config.height, config.width)) - self.capabilities= { + self.capabilities = { VMobject: self.render_vmobject, ImageMobject: self.render_imobject, } - def render(self, camera, renderables: [VMobject]) -> Image: # Image + def render(self, camera, renderables: [VMobject]) -> Image: # Image for mob in renderables: if type(mob) in self.capabilities: mob.points @@ -36,15 +34,14 @@ def render(self, camera, renderables: [VMobject]) -> Image: # Image return self.fbo.get_pixels() - @abstractclassmethod - def render_vmobject(self, mob:VMobject): + def render_vmobject(self, mob: OpenGLVMobject) -> None: raise NotImplementedError - def render_mesh(self, mob): + def render_mesh(self, mob) -> None: raise NotImplementedError - def render_image(self, mob): + def render_image(self, mob) -> None: raise NotImplementedError diff --git a/manim/renderer/shader.py b/manim/renderer/shader.py deleted file mode 100644 index 5740fe94ba..0000000000 --- a/manim/renderer/shader.py +++ /dev/null @@ -1,445 +0,0 @@ -from __future__ import annotations - -import re -import textwrap -from pathlib import Path - -import moderngl -import numpy as np - -from .. import config -from ..utils import opengl -from ..utils.simple_functions import get_parameters - -SHADER_FOLDER = Path(__file__).parent / "shaders" -shader_program_cache: dict = {} -file_path_to_code_map: dict = {} - -__all__ = [ - "Object3D", - "Mesh", - "Shader", - "FullScreenQuad", -] - - -def get_shader_code_from_file(file_path: Path) -> str: - # TODO: Is this code used ? - if file_path in file_path_to_code_map: - return file_path_to_code_map[file_path] - source = file_path.read_text() - include_lines = re.finditer( - r"^#include (?P.*\.glsl)$", - source, - flags=re.MULTILINE, - ) - for match in include_lines: - include_path = match.group("include_path") - included_code = get_shader_code_from_file( - file_path.parent / include_path, - ) - source = source.replace(match.group(0), included_code) - file_path_to_code_map[file_path] = source - return source - - -def filter_attributes(unfiltered_attributes, attributes): - # Construct attributes for only those needed by the shader. - filtered_attributes_dtype = [] - for i, dtype_name in enumerate(unfiltered_attributes.dtype.names): - if dtype_name in attributes: - filtered_attributes_dtype.append( - ( - dtype_name, - unfiltered_attributes.dtype[i].subdtype[0].str, - unfiltered_attributes.dtype[i].shape, - ), - ) - - filtered_attributes = np.zeros( - unfiltered_attributes[unfiltered_attributes.dtype.names[0]].shape[0], - dtype=filtered_attributes_dtype, - ) - - for dtype_name in unfiltered_attributes.dtype.names: - if dtype_name in attributes: - filtered_attributes[dtype_name] = unfiltered_attributes[dtype_name] - - return filtered_attributes - - -class Object3D: - def __init__(self, *children): - self.model_matrix = np.eye(4) - self.normal_matrix = np.eye(4) - self.children = [] - self.parent = None - self.add(*children) - self.init_updaters() - - # TODO: Use path_func. - def interpolate(self, start, end, alpha, _): - self.model_matrix = (1 - alpha) * start.model_matrix + alpha * end.model_matrix - self.normal_matrix = ( - 1 - alpha - ) * start.normal_matrix + alpha * end.normal_matrix - - def single_copy(self): - copy = Object3D() - copy.model_matrix = self.model_matrix.copy() - copy.normal_matrix = self.normal_matrix.copy() - return copy - - def copy(self): - node_to_copy = {} - - bfs = [self] - while bfs: - node = bfs.pop(0) - bfs.extend(node.children) - - node_copy = node.single_copy() - node_to_copy[node] = node_copy - - # Add the copy to the copy of the parent. - if node.parent is not None and node is not self: - node_to_copy[node.parent].add(node_copy) - return node_to_copy[self] - - def add(self, *children): - for child in children: - if child.parent is not None: - raise Exception( - "Attempt to add child that's already added to another Object3D", - ) - self.remove(*children, current_children_only=False) - self.children.extend(children) - for child in children: - child.parent = self - - def remove(self, *children, current_children_only=True): - if current_children_only: - for child in children: - if child.parent != self: - raise Exception( - "Attempt to remove child that isn't added to this Object3D", - ) - self.children = list(filter(lambda child: child not in children, self.children)) - for child in children: - child.parent = None - - def get_position(self): - return self.model_matrix[:, 3][:3] - - def set_position(self, position): - self.model_matrix[:, 3][:3] = position - return self - - def get_meshes(self): - dfs = [self] - while dfs: - parent = dfs.pop() - if isinstance(parent, Mesh): - yield parent - dfs.extend(parent.children) - - def get_family(self): - dfs = [self] - while dfs: - parent = dfs.pop() - yield parent - dfs.extend(parent.children) - - def align_data_and_family(self, _): - pass - - def hierarchical_model_matrix(self): - if self.parent is None: - return self.model_matrix - - model_matrices = [self.model_matrix] - current_object = self - while current_object.parent is not None: - model_matrices.append(current_object.parent.model_matrix) - current_object = current_object.parent - return np.linalg.multi_dot(list(reversed(model_matrices))) - - def hierarchical_normal_matrix(self): - if self.parent is None: - return self.normal_matrix[:3, :3] - - normal_matrices = [self.normal_matrix] - current_object = self - while current_object.parent is not None: - normal_matrices.append(current_object.parent.model_matrix) - current_object = current_object.parent - return np.linalg.multi_dot(list(reversed(normal_matrices)))[:3, :3] - - def init_updaters(self): - self.time_based_updaters = [] - self.non_time_updaters = [] - self.has_updaters = False - self.updating_suspended = False - - def update(self, dt=0): - if not self.has_updaters or self.updating_suspended: - return self - for updater in self.time_based_updaters: - updater(self, dt) - for updater in self.non_time_updaters: - updater(self) - return self - - def get_time_based_updaters(self): - return self.time_based_updaters - - def has_time_based_updater(self): - return len(self.time_based_updaters) > 0 - - def get_updaters(self): - return self.time_based_updaters + self.non_time_updaters - - def add_updater(self, update_function, index=None, call_updater=True): - if "dt" in get_parameters(update_function): - updater_list = self.time_based_updaters - else: - updater_list = self.non_time_updaters - - if index is None: - updater_list.append(update_function) - else: - updater_list.insert(index, update_function) - - self.refresh_has_updater_status() - if call_updater: - self.update() - return self - - def remove_updater(self, update_function): - for updater_list in [self.time_based_updaters, self.non_time_updaters]: - while update_function in updater_list: - updater_list.remove(update_function) - self.refresh_has_updater_status() - return self - - def clear_updaters(self): - self.time_based_updaters = [] - self.non_time_updaters = [] - self.refresh_has_updater_status() - return self - - def match_updaters(self, mobject): - self.clear_updaters() - for updater in mobject.get_updaters(): - self.add_updater(updater) - return self - - def suspend_updating(self): - self.updating_suspended = True - return self - - def resume_updating(self, call_updater=True): - self.updating_suspended = False - if call_updater: - self.update(dt=0) - return self - - def refresh_has_updater_status(self): - self.has_updaters = len(self.get_updaters()) > 0 - return self - - -class Mesh(Object3D): - def __init__( - self, - shader=None, - attributes=None, - geometry=None, - material=None, - indices=None, - use_depth_test=True, - primitive=moderngl.TRIANGLES, - ): - super().__init__() - if shader is not None and attributes is not None: - self.shader = shader - self.attributes = attributes - self.indices = indices - elif geometry is not None and material is not None: - self.shader = material - self.attributes = geometry.attributes - self.indices = geometry.index - else: - raise Exception( - "Mesh requires either attributes and a Shader or a Geometry and a " - "Material", - ) - self.use_depth_test = use_depth_test - self.primitive = primitive - self.skip_render = False - self.init_updaters() - - def single_copy(self): - copy = Mesh( - attributes=self.attributes.copy(), - shader=self.shader, - indices=self.indices.copy() if self.indices is not None else None, - use_depth_test=self.use_depth_test, - primitive=self.primitive, - ) - copy.skip_render = self.skip_render - copy.model_matrix = self.model_matrix.copy() - copy.normal_matrix = self.normal_matrix.copy() - # TODO: Copy updaters? - return copy - - def set_uniforms(self, renderer): - self.shader.set_uniform( - "u_model_matrix", - opengl.matrix_to_shader_input(self.model_matrix), - ) - self.shader.set_uniform("u_view_matrix", renderer.camera.formatted_view_matrix) - self.shader.set_uniform( - "u_projection_matrix", - renderer.camera.projection_matrix, - ) - - def render(self): - if self.skip_render: - return - - if self.use_depth_test: - self.shader.context.enable(moderngl.DEPTH_TEST) - else: - self.shader.context.disable(moderngl.DEPTH_TEST) - - from moderngl import Attribute - - shader_attributes = [] - for k, v in self.shader.shader_program._members.items(): - if isinstance(v, Attribute): - shader_attributes.append(k) - shader_attributes = filter_attributes(self.attributes, shader_attributes) - - vertex_buffer_object = self.shader.context.buffer(shader_attributes.tobytes()) - if self.indices is None: - index_buffer_object = None - else: - vert_index_data = self.indices.astype("i4").tobytes() - if vert_index_data: - index_buffer_object = self.shader.context.buffer(vert_index_data) - else: - index_buffer_object = None - vertex_array_object = self.shader.context.simple_vertex_array( - self.shader.shader_program, - vertex_buffer_object, - *shader_attributes.dtype.names, - index_buffer=index_buffer_object, - ) - vertex_array_object.render(self.primitive) - vertex_buffer_object.release() - vertex_array_object.release() - if index_buffer_object is not None: - index_buffer_object.release() - - -class Shader: - def __init__( - self, - context, - name=None, - source=None, - ): - global shader_program_cache - self.context = context - self.name = name - - # See if the program is cached. - if ( - self.name in shader_program_cache - and shader_program_cache[self.name].ctx == self.context - ): - self.shader_program = shader_program_cache[self.name] - elif source is not None: - # Generate the shader from inline code if it was passed. - self.shader_program = context.program(**source) - else: - # Search for a file containing the shader. - source_dict = {} - source_dict_key = { - "vert": "vertex_shader", - "frag": "fragment_shader", - "geom": "geometry_shader", - } - shader_folder = SHADER_FOLDER / name - for shader_file in shader_folder.iterdir(): - shader_file_path = shader_folder / shader_file - shader_source = get_shader_code_from_file(shader_file_path) - source_dict[source_dict_key[shader_file_path.stem]] = shader_source - self.shader_program = context.program(**source_dict) - - # Cache the shader. - if name is not None and name not in shader_program_cache: - shader_program_cache[self.name] = self.shader_program - - def set_uniform(self, name, value): - try: - self.shader_program[name] = value - except KeyError: - pass - - -class FullScreenQuad(Mesh): - def __init__( - self, - context, - fragment_shader_source=None, - fragment_shader_name=None, - ): - if fragment_shader_source is None and fragment_shader_name is None: - raise Exception("Must either pass shader name or shader source.") - - if fragment_shader_name is not None: - # Use the name. - shader_file_path = SHADER_FOLDER / f"{fragment_shader_name}.frag" - fragment_shader_source = get_shader_code_from_file(shader_file_path) - elif fragment_shader_source is not None: - fragment_shader_source = textwrap.dedent(fragment_shader_source.lstrip()) - - shader = Shader( - context, - source={ - "vertex_shader": """ - #version 330 - in vec4 in_vert; - uniform mat4 u_model_view_matrix; - uniform mat4 u_projection_matrix; - void main() {{ - vec4 camera_space_vertex = u_model_view_matrix * in_vert; - vec4 clip_space_vertex = u_projection_matrix * camera_space_vertex; - gl_Position = clip_space_vertex; - }} - """, - "fragment_shader": fragment_shader_source, - }, - ) - attributes = np.zeros(6, dtype=[("in_vert", np.float32, (4,))]) - attributes["in_vert"] = np.array( - [ - [-config["frame_x_radius"], -config["frame_y_radius"], 0, 1], - [-config["frame_x_radius"], config["frame_y_radius"], 0, 1], - [config["frame_x_radius"], config["frame_y_radius"], 0, 1], - [-config["frame_x_radius"], -config["frame_y_radius"], 0, 1], - [config["frame_x_radius"], -config["frame_y_radius"], 0, 1], - [config["frame_x_radius"], config["frame_y_radius"], 0, 1], - ], - ) - shader.set_uniform("u_model_view_matrix", opengl.view_matrix()) - shader.set_uniform( - "u_projection_matrix", - opengl.orthographic_projection_matrix(), - ) - super().__init__(shader, attributes) - - def render(self): - super().render() diff --git a/manim/renderer/vectorized_mobject_rendering.py b/manim/renderer/vectorized_mobject_rendering.py deleted file mode 100644 index 4cfd582d20..0000000000 --- a/manim/renderer/vectorized_mobject_rendering.py +++ /dev/null @@ -1,287 +0,0 @@ -from __future__ import annotations - -import collections - -import numpy as np - -from ..utils import opengl -from ..utils.space_ops import cross2d, earclip_triangulation -from .shader import Shader - - -def build_matrix_lists(mob): - root_hierarchical_matrix = mob.hierarchical_model_matrix() - matrix_to_mobject_list = collections.defaultdict(list) - if mob.has_points(): - matrix_to_mobject_list[tuple(root_hierarchical_matrix.ravel())].append(mob) - mobject_to_hierarchical_matrix = {mob: root_hierarchical_matrix} - dfs = [mob] - while dfs: - parent = dfs.pop() - for child in parent.submobjects: - child_hierarchical_matrix = ( - mobject_to_hierarchical_matrix[parent] @ child.model_matrix - ) - mobject_to_hierarchical_matrix[child] = child_hierarchical_matrix - if child.has_points(): - matrix_to_mobject_list[tuple(child_hierarchical_matrix.ravel())].append( - child, - ) - dfs.append(child) - return matrix_to_mobject_list - - -def render_opengl_vectorized_mobject_fill(renderer, mobject): - matrix_to_mobject_list = build_matrix_lists(mobject) - - for matrix_tuple, mobject_list in matrix_to_mobject_list.items(): - model_matrix = np.array(matrix_tuple).reshape((4, 4)) - render_mobject_fills_with_matrix(renderer, model_matrix, mobject_list) - - -def render_mobject_fills_with_matrix(renderer, model_matrix, mobjects): - # Precompute the total number of vertices for which to reserve space. - # Note that triangulate_mobject() will cache its results. - total_size = 0 - for submob in mobjects: - total_size += triangulate_mobject(submob).shape[0] - - attributes = np.empty( - total_size, - dtype=[ - ("in_vert", np.float32, (3,)), - ("in_color", np.float32, (4,)), - ("texture_coords", np.float32, (2,)), - ("texture_mode", np.int32), - ], - ) - - write_offset = 0 - for submob in mobjects: - if not submob.has_points(): - continue - mobject_triangulation = triangulate_mobject(submob) - end_offset = write_offset + mobject_triangulation.shape[0] - attributes[write_offset:end_offset] = mobject_triangulation - attributes["in_color"][write_offset:end_offset] = np.repeat( - submob.fill_rgba, - mobject_triangulation.shape[0], - axis=0, - ) - write_offset = end_offset - - fill_shader = Shader(renderer.context, name="vectorized_mobject_fill") - fill_shader.set_uniform( - "u_model_view_matrix", - opengl.matrix_to_shader_input( - renderer.camera.unformatted_view_matrix @ model_matrix, - ), - ) - fill_shader.set_uniform( - "u_projection_matrix", - renderer.scene.camera.projection_matrix, - ) - - vbo = renderer.context.buffer(attributes.tobytes()) - vao = renderer.context.simple_vertex_array( - fill_shader.shader_program, - vbo, - *attributes.dtype.names, - ) - vao.render() - vao.release() - vbo.release() - - -def triangulate_mobject(mob): - if not mob.needs_new_triangulation: - return mob.triangulation - - # Figure out how to triangulate the interior to know - # how to send the points as to the vertex shader. - # First triangles come directly from the points - # normal_vector = mob.get_unit_normal() - points = mob.points - - b0s = points[0::3] - b1s = points[1::3] - b2s = points[2::3] - v01s = b1s - b0s - v12s = b2s - b1s - - crosses = cross2d(v01s, v12s) - convexities = np.sign(crosses) - if mob.orientation == 1: - concave_parts = convexities > 0 - convex_parts = convexities <= 0 - else: - concave_parts = convexities < 0 - convex_parts = convexities >= 0 - - # These are the vertices to which we'll apply a polygon triangulation - atol = mob.tolerance_for_point_equality - end_of_loop = np.zeros(len(b0s), dtype=bool) - end_of_loop[:-1] = (np.abs(b2s[:-1] - b0s[1:]) > atol).any(1) - end_of_loop[-1] = True - - indices = np.arange(len(points), dtype=int) - inner_vert_indices = np.hstack( - [ - indices[0::3], - indices[1::3][concave_parts], - indices[2::3][end_of_loop], - ], - ) - inner_vert_indices.sort() - rings = np.arange(1, len(inner_vert_indices) + 1)[inner_vert_indices % 3 == 2] - - # Triangulate - inner_verts = points[inner_vert_indices] - inner_tri_indices = inner_vert_indices[earclip_triangulation(inner_verts, rings)] - - bezier_triangle_indices = np.reshape(indices, (-1, 3)) - concave_triangle_indices = np.reshape(bezier_triangle_indices[concave_parts], (-1)) - convex_triangle_indices = np.reshape(bezier_triangle_indices[convex_parts], (-1)) - - points = points[ - np.hstack( - [ - concave_triangle_indices, - convex_triangle_indices, - inner_tri_indices, - ], - ) - ] - texture_coords = np.tile( - [ - [0.0, 0.0], - [0.5, 0.0], - [1.0, 1.0], - ], - (points.shape[0] // 3, 1), - ) - texture_mode = np.hstack( - ( - np.ones(concave_triangle_indices.shape[0]), - -1 * np.ones(convex_triangle_indices.shape[0]), - np.zeros(inner_tri_indices.shape[0]), - ), - ) - - attributes = np.zeros( - points.shape[0], - dtype=[ - ("in_vert", np.float32, (3,)), - ("in_color", np.float32, (4,)), - ("texture_coords", np.float32, (2,)), - ("texture_mode", np.int32), - ], - ) - attributes["in_vert"] = points - attributes["texture_coords"] = texture_coords - attributes["texture_mode"] = texture_mode - - mob.triangulation = attributes - mob.needs_new_triangulation = False - - return attributes - - -def render_opengl_vectorized_mobject_stroke(renderer, mobject): - matrix_to_mobject_list = build_matrix_lists(mobject) - for matrix_tuple, mobject_list in matrix_to_mobject_list.items(): - model_matrix = np.array(matrix_tuple).reshape((4, 4)) - render_mobject_strokes_with_matrix(renderer, model_matrix, mobject_list) - - -def render_mobject_strokes_with_matrix(renderer, model_matrix, mobjects): - # Precompute the total number of vertices for which to reserve space. - total_size = 0 - for submob in mobjects: - total_size += submob.points.shape[0] - - points = np.empty((total_size, 3)) - colors = np.empty((total_size, 4)) - widths = np.empty(total_size) - - write_offset = 0 - for submob in mobjects: - if not submob.has_points(): - continue - end_offset = write_offset + submob.points.shape[0] - - points[write_offset:end_offset] = submob.points - if submob.stroke_rgba.shape[0] == points[write_offset:end_offset].shape[0]: - colors[write_offset:end_offset] = submob.stroke_rgba - else: - colors[write_offset:end_offset] = np.repeat( - submob.stroke_rgba, - submob.points.shape[0], - axis=0, - ) - widths[write_offset:end_offset] = np.repeat( - submob.stroke_width, - submob.points.shape[0], - ) - write_offset = end_offset - - stroke_data = np.zeros( - len(points), - dtype=[ - # ("previous_curve", np.float32, (3, 3)), - ("current_curve", np.float32, (3, 3)), - # ("next_curve", np.float32, (3, 3)), - ("tile_coordinate", np.float32, (2,)), - ("in_color", np.float32, (4,)), - ("in_width", np.float32), - ], - ) - - stroke_data["in_color"] = colors - stroke_data["in_width"] = widths - curves = np.reshape(points, (-1, 3, 3)) - # stroke_data["previous_curve"] = np.repeat(np.roll(curves, 1, axis=0), 3, axis=0) - stroke_data["current_curve"] = np.repeat(curves, 3, axis=0) - # stroke_data["next_curve"] = np.repeat(np.roll(curves, -1, axis=0), 3, axis=0) - - # Repeat each vertex in order to make a tile. - stroke_data = np.tile(stroke_data, 2) - stroke_data["tile_coordinate"] = np.vstack( - ( - np.tile( - [ - [0.0, 0.0], - [0.0, 1.0], - [1.0, 1.0], - ], - (len(points) // 3, 1), - ), - np.tile( - [ - [0.0, 0.0], - [1.0, 0.0], - [1.0, 1.0], - ], - (len(points) // 3, 1), - ), - ), - ) - - shader = Shader(renderer.context, "vectorized_mobject_stroke") - shader.set_uniform( - "u_model_view_matrix", - opengl.matrix_to_shader_input( - renderer.camera.unformatted_view_matrix @ model_matrix, - ), - ) - shader.set_uniform("u_projection_matrix", renderer.scene.camera.projection_matrix) - shader.set_uniform("manim_unit_normal", tuple(-mobjects[0].unit_normal[0])) - - vbo = renderer.context.buffer(stroke_data.tobytes()) - vao = renderer.context.simple_vertex_array( - shader.shader_program, vbo, *stroke_data.dtype.names - ) - renderer.frame_buffer_object.use() - vao.render() - vao.release() - vbo.release() diff --git a/manim/utils/color/core.py b/manim/utils/color/core.py index 2994504ce5..dc06825db7 100644 --- a/manim/utils/color/core.py +++ b/manim/utils/color/core.py @@ -87,7 +87,7 @@ def __init__( alpha: float = 1.0, ) -> None: if value is None: - self._internal_value = np.array((0, 0, 0, alpha), dtype=ManimColorDType) + self._internal_value = np.array((1, 1, 1, alpha), dtype=ManimColorDType) elif isinstance(value, ManimColor): # logger.info( # "ManimColor was passed another ManimColor. This is probably not what " @@ -509,6 +509,29 @@ def interpolate(self, other: ManimColor, alpha: float) -> ManimColor: self._internal_value * (1 - alpha) + other._internal_value * alpha ) + def set_opacity(self, opacity: float) -> ManimColor: + """Sets the alpha value for the current ManimColor + + Parameters + ---------- + opacity : float + + + Returns + ------- + ManimColor + The color with the changed opacity value + + Raises + ------ + ValueError + Raises an exception if the opacity value is not in range 0 to 1 + """ + if opacity < 0 or opacity > 1: + raise ValueError(f"Alpha value is not in range 0-1 it is {opacity}") + self._internal_value[3] = opacity + return self + @classmethod def from_rgb( cls, diff --git a/pyproject.toml b/pyproject.toml index 6e2f3b375a..5171a58688 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,12 +56,9 @@ screeninfo = "^0.8" Pygments = "^2.10.0" "backports.cached-property" = { version = "^1.0.1", python = "<3.8" } svgelements = "^1.8.0" -<<<<<<< HEAD ipython = "^8.7.0" pyopengl = "^3.1.6" -======= typing-extensions = "^4.7.1" ->>>>>>> 50d663eb8b3b3ddb43fb20cce1943348abf9cc59 [tool.poetry.extras] jupyterlab = ["jupyterlab", "notebook"] diff --git a/tests/experimental/test_vmobject_init.py b/tests/experimental/test_vmobject_init.py new file mode 100644 index 0000000000..fabda63630 --- /dev/null +++ b/tests/experimental/test_vmobject_init.py @@ -0,0 +1,18 @@ +import pytest + +from manim import manim_colors as col +from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject + +VMobject = OpenGLVMobject + + +def test_vmobject_init(): + vm = VMobject(col.RED) + assert vm.fill_color == [col.RED] + assert vm.stroke_color == [col.RED] + vm = VMobject(col.GREEN, stroke_color=col.YELLOW) + assert vm.fill_color == [col.GREEN] + assert vm.stroke_color == [col.YELLOW] + vm = VMobject() + assert vm.fill_color == [col.WHITE] + assert vm.stroke_color == [col.WHITE] From 76694e528b78a036c83e63bfb22600b7183f538e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 10 Sep 2023 12:05:55 +0000 Subject: [PATCH 028/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- conftest.py | 1 + manim/_config/utils.py | 6 ++-- manim/animation/changing.py | 10 +++++-- manim/animation/transform.py | 9 ++++-- manim/animation/transform_matching_parts.py | 3 +- manim/cli/init/commands.py | 8 +++-- manim/cli/new/group.py | 8 +++-- manim/mobject/geometry/arc.py | 10 +++++-- manim/mobject/geometry/labeled.py | 6 ++-- manim/mobject/geometry/line.py | 6 ++-- manim/mobject/geometry/polygram.py | 3 +- manim/mobject/graphing/coordinate_systems.py | 29 +++++++++++++------ manim/mobject/graphing/probability.py | 13 +++++++-- manim/mobject/mobject.py | 27 +++++++++++++---- manim/mobject/opengl/opengl_geometry.py | 18 ++++++++---- manim/mobject/opengl/opengl_image_mobject.py | 3 +- .../opengl/opengl_point_cloud_mobject.py | 3 +- .../mobject/opengl/opengl_three_dimensions.py | 3 +- manim/mobject/text/tex_mobject.py | 3 +- manim/mobject/three_d/three_dimensions.py | 16 ++++++---- manim/mobject/types/point_cloud_mobject.py | 11 +++++-- manim/mobject/types/vectorized_mobject.py | 20 ++++++++----- manim/mobject/vector_field.py | 12 ++++++-- manim/scene/scene.py | 8 +++-- manim/scene/scene_file_writer.py | 8 +++-- manim/scene/vector_space_scene.py | 16 +++++++--- manim/utils/ipython_magic.py | 8 +++-- manim/utils/iterables.py | 3 +- manim/utils/testing/frames_comparison.py | 10 ++++--- tests/module/mobject/text/test_texmobject.py | 3 +- .../test_vectorized_mobject.py | 14 +++++++-- tests/test_config.py | 3 +- tests/test_graphical_units/test_boolops.py | 14 +++++++-- .../opengl/test_play_logic_opengl.py | 11 +++++-- tests/test_scene_rendering/test_play_logic.py | 11 +++++-- 35 files changed, 233 insertions(+), 104 deletions(-) diff --git a/conftest.py b/conftest.py index 99b4de16ed..da37e19ba5 100644 --- a/conftest.py +++ b/conftest.py @@ -12,6 +12,7 @@ pass import moderngl + # If it is running Doctest the current directory # is changed because it also tests the config module # itself. If it's a normal test then it uses the diff --git a/manim/_config/utils.py b/manim/_config/utils.py index d4ac0aec19..35b862d749 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -1249,11 +1249,9 @@ def renderer(self, val: str | RendererType) -> None: val = val.lower() renderer = RendererType(val) try: - from manim.mobject.opengl.opengl_compatibility import \ - ConvertToOpenGL + from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject - from manim.mobject.opengl.opengl_vectorized_mobject import \ - OpenGLVMobject + from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VMobject diff --git a/manim/animation/changing.py b/manim/animation/changing.py index 1b4d6c5bad..0354a1c002 100644 --- a/manim/animation/changing.py +++ b/manim/animation/changing.py @@ -9,8 +9,14 @@ from manim._config import config from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.utils.color import (BLUE_B, BLUE_D, BLUE_E, GREY_BROWN, WHITE, - ParsableManimColor) +from manim.utils.color import ( + BLUE_B, + BLUE_D, + BLUE_E, + GREY_BROWN, + WHITE, + ParsableManimColor, +) from manim.utils.rate_functions import smooth diff --git a/manim/animation/transform.py b/manim/animation/transform.py index 110cfb7571..85b1fbca4b 100644 --- a/manim/animation/transform.py +++ b/manim/animation/transform.py @@ -36,8 +36,13 @@ from .. import config from ..animation.animation import Animation -from ..constants import (DEFAULT_POINTWISE_FUNCTION_RUN_TIME, DEGREES, ORIGIN, - OUT, RendererType) +from ..constants import ( + DEFAULT_POINTWISE_FUNCTION_RUN_TIME, + DEGREES, + ORIGIN, + OUT, + RendererType, +) from ..mobject.mobject import Group, Mobject from ..utils.paths import path_along_arc, path_along_circles from ..utils.rate_functions import smooth, squish_rate_func diff --git a/manim/animation/transform_matching_parts.py b/manim/animation/transform_matching_parts.py index 6babda7a7c..8c97643860 100644 --- a/manim/animation/transform_matching_parts.py +++ b/manim/animation/transform_matching_parts.py @@ -9,8 +9,7 @@ import numpy as np from manim.mobject.opengl.opengl_mobject import OpenGLGroup, OpenGLMobject -from manim.mobject.opengl.opengl_vectorized_mobject import (OpenGLVGroup, - OpenGLVMobject) +from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup, OpenGLVMobject from .._config import config from ..constants import RendererType diff --git a/manim/cli/init/commands.py b/manim/cli/init/commands.py index 6b1a744a34..67dc751646 100644 --- a/manim/cli/init/commands.py +++ b/manim/cli/init/commands.py @@ -15,8 +15,12 @@ from ... import console from ...constants import CONTEXT_SETTINGS, EPILOG, QUALITIES -from ...utils.file_ops import (add_import_statement, copy_template_files, - get_template_names, get_template_path) +from ...utils.file_ops import ( + add_import_statement, + copy_template_files, + get_template_names, + get_template_path, +) CFG_DEFAULTS = { "frame_rate": 30, diff --git a/manim/cli/new/group.py b/manim/cli/new/group.py index a0cd910240..6058102695 100644 --- a/manim/cli/new/group.py +++ b/manim/cli/new/group.py @@ -8,8 +8,12 @@ from ... import console from ...constants import CONTEXT_SETTINGS, EPILOG, QUALITIES -from ...utils.file_ops import (add_import_statement, copy_template_files, - get_template_names, get_template_path) +from ...utils.file_ops import ( + add_import_statement, + copy_template_files, + get_template_names, + get_template_path, +) CFG_DEFAULTS = { "frame_rate": 30, diff --git a/manim/mobject/geometry/arc.py b/manim/mobject/geometry/arc.py index 04151c0ae1..5672907187 100644 --- a/manim/mobject/geometry/arc.py +++ b/manim/mobject/geometry/arc.py @@ -54,9 +54,13 @@ def construct(self): from manim.mobject.types.vectorized_mobject import VMobject from manim.utils.color import * from manim.utils.iterables import adjacent_pairs -from manim.utils.space_ops import (angle_of_vector, cartesian_to_spherical, - line_intersection, perpendicular_bisector, - rotate_vector) +from manim.utils.space_ops import ( + angle_of_vector, + cartesian_to_spherical, + line_intersection, + perpendicular_bisector, + rotate_vector, +) if TYPE_CHECKING: from manim.mobject.mobject import Mobject diff --git a/manim/mobject/geometry/labeled.py b/manim/mobject/geometry/labeled.py index ee80a038e9..1a39ee2771 100644 --- a/manim/mobject/geometry/labeled.py +++ b/manim/mobject/geometry/labeled.py @@ -6,8 +6,10 @@ from manim.constants import * from manim.mobject.geometry.line import Arrow, Line -from manim.mobject.geometry.shape_matchers import (BackgroundRectangle, - SurroundingRectangle) +from manim.mobject.geometry.shape_matchers import ( + BackgroundRectangle, + SurroundingRectangle, +) from manim.mobject.text.tex_mobject import MathTex, Tex from manim.mobject.text.text_mobject import Text from manim.utils.color import WHITE, ManimColor, ParsableManimColor diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index a5eecde11a..3a69de3d4f 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -20,14 +20,12 @@ from manim import config from manim.constants import * -from manim.mobject.geometry.arc import (Arc, ArcBetweenPoints, Dot, - TipableVMobject) +from manim.mobject.geometry.arc import Arc, ArcBetweenPoints, Dot, TipableVMobject from manim.mobject.geometry.tips import ArrowTriangleFilledTip from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject -from manim.mobject.types.vectorized_mobject import (DashedVMobject, VGroup, - VMobject) +from manim.mobject.types.vectorized_mobject import DashedVMobject, VGroup, VMobject from manim.utils.color import * from manim.utils.space_ops import angle_of_vector, line_intersection, normalize diff --git a/manim/mobject/geometry/polygram.py b/manim/mobject/geometry/polygram.py index 779ea19725..5064ff737e 100644 --- a/manim/mobject/geometry/polygram.py +++ b/manim/mobject/geometry/polygram.py @@ -26,8 +26,7 @@ from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.utils.color import * from manim.utils.iterables import adjacent_n_tuples, adjacent_pairs -from manim.utils.space_ops import (angle_between_vectors, normalize, - regular_vertices) +from manim.utils.space_ops import angle_between_vectors, normalize, regular_vertices class Polygram(VMobject, metaclass=ConvertToOpenGL): diff --git a/manim/mobject/graphing/coordinate_systems.py b/manim/mobject/graphing/coordinate_systems.py index 71adea710c..8bfc98dd8c 100644 --- a/manim/mobject/graphing/coordinate_systems.py +++ b/manim/mobject/graphing/coordinate_systems.py @@ -23,21 +23,32 @@ from manim.mobject.geometry.arc import Circle, Dot from manim.mobject.geometry.line import Arrow, DashedLine, Line from manim.mobject.geometry.polygram import Polygon, Rectangle, RegularPolygon -from manim.mobject.graphing.functions import (ImplicitFunction, - ParametricFunction) +from manim.mobject.graphing.functions import ImplicitFunction, ParametricFunction from manim.mobject.graphing.number_line import NumberLine from manim.mobject.graphing.scale import LinearBase from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_surface import OpenGLSurface from manim.mobject.text.tex_mobject import MathTex from manim.mobject.three_d.three_dimensions import Surface -from manim.mobject.types.vectorized_mobject import (VDict, VectorizedPoint, - VGroup, VMobject) -from manim.utils.color import (BLACK, BLUE, BLUE_D, GREEN, WHITE, YELLOW, - ManimColor, ParsableManimColor, color_gradient, - invert_color) -from manim.utils.config_ops import (merge_dicts_recursively, - update_dict_recursively) +from manim.mobject.types.vectorized_mobject import ( + VDict, + VectorizedPoint, + VGroup, + VMobject, +) +from manim.utils.color import ( + BLACK, + BLUE, + BLUE_D, + GREEN, + WHITE, + YELLOW, + ManimColor, + ParsableManimColor, + color_gradient, + invert_color, +) +from manim.utils.config_ops import merge_dicts_recursively, update_dict_recursively from manim.utils.simple_functions import binary_search from manim.utils.space_ops import angle_of_vector diff --git a/manim/mobject/graphing/probability.py b/manim/mobject/graphing/probability.py index fa9f11a0a9..92fb7355e1 100644 --- a/manim/mobject/graphing/probability.py +++ b/manim/mobject/graphing/probability.py @@ -18,9 +18,16 @@ from manim.mobject.svg.brace import Brace from manim.mobject.text.tex_mobject import MathTex, Tex from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.utils.color import (BLUE_E, DARK_GREY, GREEN_E, LIGHT_GREY, - MAROON_B, YELLOW, ParsableManimColor, - color_gradient) +from manim.utils.color import ( + BLUE_E, + DARK_GREY, + GREEN_E, + LIGHT_GREY, + MAROON_B, + YELLOW, + ParsableManimColor, + color_gradient, +) from manim.utils.iterables import tuplify EPSILON = 0.0001 diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 4509343091..79ccc41231 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -15,8 +15,19 @@ from functools import partialmethod, reduce from math import ceil from pathlib import Path -from typing import (TYPE_CHECKING, Callable, Dict, Iterable, List, Optional, - Sequence, Tuple, Type, TypeVar, Union) +from typing import ( + TYPE_CHECKING, + Callable, + Dict, + Iterable, + List, + Optional, + Sequence, + Tuple, + Type, + TypeVar, + Union, +) import numpy as np @@ -24,9 +35,15 @@ from .. import config, logger from ..constants import * -from ..utils.color import (BLACK, WHITE, YELLOW_C, ManimColor, - ParsableManimColor, color_gradient, - interpolate_color) +from ..utils.color import ( + BLACK, + WHITE, + YELLOW_C, + ManimColor, + ParsableManimColor, + color_gradient, + interpolate_color, +) from ..utils.exceptions import MultiAnimationOverrideException from ..utils.iterables import list_update, remove_list_redundancies from ..utils.paths import straight_path diff --git a/manim/mobject/opengl/opengl_geometry.py b/manim/mobject/opengl/opengl_geometry.py index bb12590cee..3f9379b14d 100644 --- a/manim/mobject/opengl/opengl_geometry.py +++ b/manim/mobject/opengl/opengl_geometry.py @@ -5,14 +5,22 @@ from manim.constants import * from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_vectorized_mobject import ( - OpenGLDashedVMobject, OpenGLVGroup, OpenGLVMobject) + OpenGLDashedVMobject, + OpenGLVGroup, + OpenGLVMobject, +) from manim.utils.color import * from manim.utils.iterables import adjacent_n_tuples, adjacent_pairs from manim.utils.simple_functions import clip -from manim.utils.space_ops import (angle_between_vectors, angle_of_vector, - compass_directions, find_intersection, - normalize, rotate_vector, - rotation_matrix_transpose) +from manim.utils.space_ops import ( + angle_between_vectors, + angle_of_vector, + compass_directions, + find_intersection, + normalize, + rotate_vector, + rotation_matrix_transpose, +) DEFAULT_DOT_RADIUS = 0.08 DEFAULT_SMALL_DOT_RADIUS = 0.04 diff --git a/manim/mobject/opengl/opengl_image_mobject.py b/manim/mobject/opengl/opengl_image_mobject.py index 794f7426e7..7f2828712f 100644 --- a/manim/mobject/opengl/opengl_image_mobject.py +++ b/manim/mobject/opengl/opengl_image_mobject.py @@ -10,8 +10,7 @@ from PIL import Image from PIL.Image import Resampling -from manim.mobject.opengl.opengl_surface import (OpenGLSurface, - OpenGLTexturedSurface) +from manim.mobject.opengl.opengl_surface import OpenGLSurface, OpenGLTexturedSurface from manim.utils.images import get_full_raster_image_path diff --git a/manim/mobject/opengl/opengl_point_cloud_mobject.py b/manim/mobject/opengl/opengl_point_cloud_mobject.py index 1e7b3a4972..6f1d879ae7 100644 --- a/manim/mobject/opengl/opengl_point_cloud_mobject.py +++ b/manim/mobject/opengl/opengl_point_cloud_mobject.py @@ -8,8 +8,7 @@ from manim.constants import * from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.utils.bezier import interpolate -from manim.utils.color import (BLACK, WHITE, YELLOW, color_gradient, - color_to_rgba) +from manim.utils.color import BLACK, WHITE, YELLOW, color_gradient, color_to_rgba from manim.utils.config_ops import _Uniforms from manim.utils.iterables import resize_with_interpolation diff --git a/manim/mobject/opengl/opengl_three_dimensions.py b/manim/mobject/opengl/opengl_three_dimensions.py index 88695999ea..097d5739b9 100644 --- a/manim/mobject/opengl/opengl_three_dimensions.py +++ b/manim/mobject/opengl/opengl_three_dimensions.py @@ -3,8 +3,7 @@ import numpy as np from manim.mobject.opengl.opengl_surface import OpenGLSurface -from manim.mobject.opengl.opengl_vectorized_mobject import (OpenGLVGroup, - OpenGLVMobject) +from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup, OpenGLVMobject class OpenGLSurfaceMesh(OpenGLVGroup): diff --git a/manim/mobject/text/tex_mobject.py b/manim/mobject/text/tex_mobject.py index 6ea930157a..22922ab543 100644 --- a/manim/mobject/text/tex_mobject.py +++ b/manim/mobject/text/tex_mobject.py @@ -34,8 +34,7 @@ from manim.constants import * from manim.mobject.geometry.line import Line from manim.mobject.svg.svg_mobject import SVGMobject -from manim.mobject.types.vectorized_mobject import (VectorizedPoint, VGroup, - VMobject) +from manim.mobject.types.vectorized_mobject import VectorizedPoint, VGroup, VMobject from manim.utils.tex import TexTemplate from manim.utils.tex_file_writing import tex_to_svg_file diff --git a/manim/mobject/three_d/three_dimensions.py b/manim/mobject/three_d/three_dimensions.py index 3db72ae963..e2ac7babc2 100644 --- a/manim/mobject/three_d/three_dimensions.py +++ b/manim/mobject/three_d/three_dimensions.py @@ -28,12 +28,18 @@ from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.utils.color import (BLUE, BLUE_D, BLUE_E, LIGHT_GREY, WHITE, - ManimColor, ParsableManimColor, - interpolate_color) +from manim.utils.color import ( + BLUE, + BLUE_D, + BLUE_E, + LIGHT_GREY, + WHITE, + ManimColor, + ParsableManimColor, + interpolate_color, +) from manim.utils.iterables import tuplify -from manim.utils.space_ops import (normalize, perpendicular_bisector, - z_to_vector) +from manim.utils.space_ops import normalize, perpendicular_bisector, z_to_vector class ThreeDVMobject(VMobject, metaclass=ConvertToOpenGL): diff --git a/manim/mobject/types/point_cloud_mobject.py b/manim/mobject/types/point_cloud_mobject.py index 14b8a98c81..43e2ff08e2 100644 --- a/manim/mobject/types/point_cloud_mobject.py +++ b/manim/mobject/types/point_cloud_mobject.py @@ -12,8 +12,15 @@ from ...constants import * from ...mobject.mobject import Mobject from ...utils.bezier import interpolate -from ...utils.color import (BLACK, WHITE, YELLOW, ManimColor, color_gradient, - color_to_rgba, rgba_to_color) +from ...utils.color import ( + BLACK, + WHITE, + YELLOW, + ManimColor, + color_gradient, + color_to_rgba, + rgba_to_color, +) from ...utils.iterables import stretch_array_to_length diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 86a9ba980a..da8e560b59 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -22,19 +22,23 @@ from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject -from manim.mobject.three_d.three_d_utils import \ - get_3d_vmob_gradient_start_and_end_points +from manim.mobject.three_d.three_d_utils import ( + get_3d_vmob_gradient_start_and_end_points, +) from ... import config from ...constants import * from ...mobject.mobject import Mobject -from ...utils.bezier import (bezier, get_smooth_handle_points, - integer_interpolate, interpolate, - partial_bezier_points, - proportions_along_bezier_curve_for_point) +from ...utils.bezier import ( + bezier, + get_smooth_handle_points, + integer_interpolate, + interpolate, + partial_bezier_points, + proportions_along_bezier_curve_for_point, +) from ...utils.color import BLACK, WHITE, ManimColor, ParsableManimColor -from ...utils.iterables import (make_even, resize_array, - stretch_array_to_length, tuplify) +from ...utils.iterables import make_even, resize_array, stretch_array_to_length, tuplify from ...utils.space_ops import rotate_vector, shoelace_direction # TODO diff --git a/manim/mobject/vector_field.py b/manim/mobject/vector_field.py index 838770ccd4..58a21c8614 100644 --- a/manim/mobject/vector_field.py +++ b/manim/mobject/vector_field.py @@ -28,8 +28,16 @@ from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VGroup, VMobject from ..utils.bezier import interpolate, inverse_interpolate -from ..utils.color import (BLUE_E, GREEN, RED, YELLOW, ManimColor, - ParsableManimColor, color_to_rgb, rgb_to_color) +from ..utils.color import ( + BLUE_E, + GREEN, + RED, + YELLOW, + ManimColor, + ParsableManimColor, + color_to_rgb, + rgb_to_color, +) from ..utils.rate_functions import ease_out_sine, linear from ..utils.simple_functions import sigmoid diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 6dbea48315..2ef9d89707 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -25,8 +25,10 @@ from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.scene.scene_file_writer import SceneFileWriter from manim.utils.color import RED -from manim.utils.family_ops import (extract_mobject_family_members, - recursive_mobject_remove) +from manim.utils.family_ops import ( + extract_mobject_family_members, + recursive_mobject_remove, +) from manim.utils.module_ops import get_module if TYPE_CHECKING: @@ -684,7 +686,7 @@ def get_wait_time_progression( kw["override_skip_animations"] = True return self.get_time_progression(duration, **kw) - def pre_play(self): # Doesn't exist in Main + def pre_play(self): # Doesn't exist in Main if self.presenter_mode and self.num_plays == 0: self.hold_loop() diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 51f6ad100d..93185867b2 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -15,9 +15,11 @@ from manim import config from manim._config import logger as log from manim.mobject.mobject import Mobject -from manim.utils.file_ops import (add_extension_if_not_present, - get_sorted_integer_files, - guarantee_existence) +from manim.utils.file_ops import ( + add_extension_if_not_present, + get_sorted_integer_files, + guarantee_existence, +) from manim.utils.sounds import get_full_sound_file_path if TYPE_CHECKING: diff --git a/manim/scene/vector_space_scene.py b/manim/scene/vector_space_scene.py index e60a98521f..f651c2c86a 100644 --- a/manim/scene/vector_space_scene.py +++ b/manim/scene/vector_space_scene.py @@ -21,15 +21,23 @@ from ..animation.creation import Create, Write from ..animation.fading import FadeOut from ..animation.growing import GrowArrow -from ..animation.transform import (ApplyFunction, ApplyPointwiseFunction, - Transform) +from ..animation.transform import ApplyFunction, ApplyPointwiseFunction, Transform from ..constants import * from ..mobject.matrix import Matrix from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VGroup, VMobject from ..scene.scene import Scene -from ..utils.color import (BLACK, BLUE_D, GREEN_C, GREY, RED_C, WHITE, YELLOW, - ManimColor, ParsableManimColor) +from ..utils.color import ( + BLACK, + BLUE_D, + GREEN_C, + GREY, + RED_C, + WHITE, + YELLOW, + ManimColor, + ParsableManimColor, +) from ..utils.rate_functions import rush_from, rush_into from ..utils.space_ops import angle_of_vector diff --git a/manim/utils/ipython_magic.py b/manim/utils/ipython_magic.py index e499a02c0a..c95e78a828 100644 --- a/manim/utils/ipython_magic.py +++ b/manim/utils/ipython_magic.py @@ -18,8 +18,12 @@ try: from IPython import get_ipython from IPython.core.interactiveshell import InteractiveShell - from IPython.core.magic import (Magics, line_cell_magic, magics_class, - needs_local_scope) + from IPython.core.magic import ( + Magics, + line_cell_magic, + magics_class, + needs_local_scope, + ) from IPython.display import Image, Video, display except ImportError: pass diff --git a/manim/utils/iterables.py b/manim/utils/iterables.py index cf0ac6863f..4b20cfe704 100644 --- a/manim/utils/iterables.py +++ b/manim/utils/iterables.py @@ -19,8 +19,7 @@ ] import itertools as it -from typing import (Any, Callable, Collection, Generator, Iterable, Reversible, - Sequence) +from typing import Any, Callable, Collection, Generator, Iterable, Reversible, Sequence import numpy as np diff --git a/manim/utils/testing/frames_comparison.py b/manim/utils/testing/frames_comparison.py index 8842095b9e..e20e1a2a56 100644 --- a/manim/utils/testing/frames_comparison.py +++ b/manim/utils/testing/frames_comparison.py @@ -15,10 +15,12 @@ from manim.scene.three_d_scene import ThreeDScene from ._frames_testers import _ControlDataWriter, _FramesTester -from ._test_class_makers import (DummySceneFileWriter, - _make_scene_file_writer_class, - _make_test_renderer_class, - _make_test_scene_class) +from ._test_class_makers import ( + DummySceneFileWriter, + _make_scene_file_writer_class, + _make_test_renderer_class, + _make_test_scene_class, +) SCENE_PARAMETER_NAME = "scene" _tests_root_dir_path = Path(__file__).absolute().parents[2] diff --git a/tests/module/mobject/text/test_texmobject.py b/tests/module/mobject/text/test_texmobject.py index 3e72ddeb38..c45681fad2 100644 --- a/tests/module/mobject/text/test_texmobject.py +++ b/tests/module/mobject/text/test_texmobject.py @@ -4,8 +4,7 @@ import pytest -from manim import (MathTex, SingleStringMathTex, Tex, TexTemplate, config, - tempconfig) +from manim import MathTex, SingleStringMathTex, Tex, TexTemplate, config, tempconfig from manim.mobject.types.vectorized_mobject import VMobject from manim.utils.color import RED diff --git a/tests/module/mobject/types/vectorized_mobject/test_vectorized_mobject.py b/tests/module/mobject/types/vectorized_mobject/test_vectorized_mobject.py index 0850da7a42..a17383fd98 100644 --- a/tests/module/mobject/types/vectorized_mobject/test_vectorized_mobject.py +++ b/tests/module/mobject/types/vectorized_mobject/test_vectorized_mobject.py @@ -3,8 +3,18 @@ import numpy as np import pytest -from manim import (Circle, CurvesAsSubmobjects, Line, Mobject, Polygon, - RegularPolygon, Square, VDict, VGroup, VMobject) +from manim import ( + Circle, + CurvesAsSubmobjects, + Line, + Mobject, + Polygon, + RegularPolygon, + Square, + VDict, + VGroup, + VMobject, +) from manim.constants import PI diff --git a/tests/test_config.py b/tests/test_config.py index 9e82b377ae..b543e8a5e6 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -8,8 +8,7 @@ from manim import WHITE, Scene, Square, Tex, Text, config, tempconfig from manim._config.utils import ManimConfig -from tests.assert_utils import (assert_dir_exists, assert_dir_filled, - assert_file_exists) +from tests.assert_utils import assert_dir_exists, assert_dir_filled, assert_file_exists def test_tempconfig(): diff --git a/tests/test_graphical_units/test_boolops.py b/tests/test_graphical_units/test_boolops.py index 4366f87a13..d8e43e1e5a 100644 --- a/tests/test_graphical_units/test_boolops.py +++ b/tests/test_graphical_units/test_boolops.py @@ -1,7 +1,17 @@ from __future__ import annotations -from manim import (BLUE, Circle, Difference, Exclusion, Intersection, - Rectangle, Square, Triangle, Union) +from manim import ( + BLUE, + Circle, + Difference, + Exclusion, + Intersection, + Rectangle, + Square, + Triangle, + Union, +) + # not exported by default, so directly import from manim.utils.testing.frames_comparison import frames_comparison diff --git a/tests/test_scene_rendering/opengl/test_play_logic_opengl.py b/tests/test_scene_rendering/opengl/test_play_logic_opengl.py index c0f2bc7c92..5e51aee926 100644 --- a/tests/test_scene_rendering/opengl/test_play_logic_opengl.py +++ b/tests/test_scene_rendering/opengl/test_play_logic_opengl.py @@ -7,9 +7,14 @@ from manim import * from manim import config -from ..simple_scenes import (SceneForFrozenFrameTests, SceneWithMultipleCalls, - SceneWithNonStaticWait, SceneWithSceneUpdater, - SceneWithStaticWait, SquareToCircle) +from ..simple_scenes import ( + SceneForFrozenFrameTests, + SceneWithMultipleCalls, + SceneWithNonStaticWait, + SceneWithSceneUpdater, + SceneWithStaticWait, + SquareToCircle, +) @pytest.mark.skipif( diff --git a/tests/test_scene_rendering/test_play_logic.py b/tests/test_scene_rendering/test_play_logic.py index 6892acaf6a..a0d97920bd 100644 --- a/tests/test_scene_rendering/test_play_logic.py +++ b/tests/test_scene_rendering/test_play_logic.py @@ -8,9 +8,14 @@ from manim import * from manim import config -from .simple_scenes import (SceneForFrozenFrameTests, SceneWithMultipleCalls, - SceneWithNonStaticWait, SceneWithSceneUpdater, - SceneWithStaticWait, SquareToCircle) +from .simple_scenes import ( + SceneForFrozenFrameTests, + SceneWithMultipleCalls, + SceneWithNonStaticWait, + SceneWithSceneUpdater, + SceneWithStaticWait, + SquareToCircle, +) @pytest.mark.skipif( From 5d8ea6a4a30a3ebe2c830a5255735d9c4e9086a8 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Sun, 10 Sep 2023 14:30:47 +0200 Subject: [PATCH 029/106] Merge 3320-fix-antialiasing-opengl into experimental --- manim/mobject/text/text_mobject.py | 5 + .../shaders/quadratic_bezier_fill/frag.glsl | 50 +++---- .../shaders/quadratic_bezier_fill/geom.glsl | 63 +-------- manim/utils/space_ops.py | 123 +++++++++--------- .../control_data/opengl/Circle.npz | Bin 6611 -> 6544 bytes 5 files changed, 87 insertions(+), 154 deletions(-) diff --git a/manim/mobject/text/text_mobject.py b/manim/mobject/text/text_mobject.py index ecfe557dec..d82444e824 100644 --- a/manim/mobject/text/text_mobject.py +++ b/manim/mobject/text/text_mobject.py @@ -559,6 +559,11 @@ def add_line_to(end): # anti-aliasing if height is None and width is None: self.scale(TEXT_MOB_SCALE_FACTOR) + + # Just a temporary hack to get better triangulation + # See pr #1552 for details + for i in self.submobjects: + i.insert_n_curves(len(i.get_all_points())) self.initial_height = self.height def __repr__(self): diff --git a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl index 317f1ced2c..dfc5cd4f6a 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl @@ -6,21 +6,13 @@ in vec4 color; in float fill_all; // Either 0 or 1 in float uv_anti_alias_width; -in vec3 xyz_coords; in float orientation; in vec2 uv_coords; -in vec2 uv_b2; in float bezier_degree; out vec4 frag_color; -// Needed for quadratic_bezier_distance insertion below -float modify_distance_for_endpoints(vec2 p, float dist, float t) -{ - return dist; -} - -#include "../include/quadratic_bezier_distance.glsl" +#define ANTI_ALIASING float sdf() { @@ -28,30 +20,15 @@ float sdf() { return abs(uv_coords[1]); } - float u2 = uv_b2.x; - float v2 = uv_b2.y; - // For really flat curves, just take the distance to x-axis - if (abs(v2 / u2) < 0.1 * uv_anti_alias_width) - { - return abs(uv_coords[1]); - } - // This converts uv_coords to yet another space where the bezier points sit on - // (0, 0), (1/2, 0) and (1, 1), so that the curve can be expressed implicityly - // as y = x^2. - mat2 to_simple_space = mat2(v2, 0, 2 - u2, 4 * v2); - vec2 p = to_simple_space * uv_coords; - // Sign takes care of whether we should be filling the inside or outside of - // curve. - float sgn = orientation * sign(v2); - float Fp = (p.x * p.x - p.y); - if (sgn * Fp <= 0) - { - return 0.0; - } - else - { - return min_dist_to_curve(uv_coords, uv_b2, bezier_degree); - } + vec2 p = uv_coords; + float sgn = orientation; + float q = (p.x * p.x - p.y); +#ifdef ANTI_ALIASING + return sgn * q / sqrt(dFdx(q) * dFdx(q) + dFdy(q) * dFdy(q)); +#endif +#ifndef ANTI_ALIASING + return -sgn * q; +#endif } void main() @@ -61,5 +38,10 @@ void main() frag_color = color; if (fill_all == 1.0) return; - frag_color.a *= smoothstep(1, 0, sdf() / uv_anti_alias_width); +#ifdef ANTI_ALIASING + frag_color.a *= 0.5 - sdf(); // Anti-aliasing +#endif +#ifndef ANTI_ALIASING + frag_color.a *= float(sdf() > 0); // No anti-aliasing +#endif } diff --git a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl index 57d02ae6e8..34cdc1db5a 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl @@ -24,17 +24,11 @@ in float v_vert_index[3]; out vec4 color; out float fill_all; -out float uv_anti_alias_width; -out vec3 xyz_coords; out float orientation; -// uv space is where b0 = (0, 0), b1 = (1, 0), and transform is orthogonal out vec2 uv_coords; -out vec2 uv_b2; out float bezier_degree; -vec3 unit_normal; - // Analog of import for manim only // Comment to prevent formatting #include "../include/quadratic_bezier_geometry_functions.glsl" @@ -45,12 +39,13 @@ vec3 unit_normal; // #include "../include/finalize_color.glsl" +const vec2 uv_coords_arr[3] = vec2[3](vec2(0, 0), vec2(0.5, 0), vec2(1, 1)); + void emit_vertex_wrapper(vec3 point, int index) { - color = finalize_color(v_color[index], point, unit_normal, light_source_position, camera_position, reflectiveness, - gloss, shadow); - xyz_coords = point; - gl_Position = get_gl_Position(xyz_coords); + color = finalize_color(v_color[index], point, v_global_unit_normal[index], light_source_position, gloss, shadow); + gl_Position = get_gl_Position(point); + uv_coords = uv_coords_arr[index]; EmitVertex(); } @@ -63,52 +58,6 @@ void emit_simple_triangle() EndPrimitive(); } -void emit_pentagon(vec3[3] points, vec3 normal) -{ - vec3 p0 = points[0]; - vec3 p1 = points[1]; - vec3 p2 = points[2]; - // Tangent vectors - vec3 t01 = normalize(p1 - p0); - vec3 t12 = normalize(p2 - p1); - // Vectors perpendicular to the curve in the plane of the curve pointing - // outside the curve - vec3 p0_perp = cross(t01, normal); - vec3 p2_perp = cross(t12, normal); - - bool fill_inside = orientation > 0.0; - float aaw = anti_alias_width * frame_shape.y / pixel_shape.y; - vec3 corners[5]; - if (bezier_degree == 1.0) - { - // For straight lines, buff out in both directions - corners = vec3[5](p0 + aaw * p0_perp, p0 - aaw * p0_perp, p1 + 0.5 * aaw * (p0_perp + p2_perp), - p2 - aaw * p2_perp, p2 + aaw * p2_perp); - } - else if (fill_inside) - { - // If curved, and filling insight, just buff out away interior - corners = vec3[5](p0 + aaw * p0_perp, p0, p1 + 0.5 * aaw * (p0_perp + p2_perp), p2, p2 + aaw * p2_perp); - } - else - { - corners = vec3[5](p0, p0 - aaw * p0_perp, p1, p2 - aaw * p2_perp, p2); - } - - mat4 xyz_to_uv = get_xyz_to_uv(p0, p1, normal); - uv_b2 = (xyz_to_uv * vec4(p2, 1)).xy; - uv_anti_alias_width = aaw / length(p1 - p0); - - for (int i = 0; i < 5; i++) - { - vec3 corner = corners[i]; - uv_coords = (xyz_to_uv * vec4(corner, 1)).xy; - int j = int(sign(i - 1) + 1); // Maps i = [0, 1, 2, 3, 4] onto j = [0, 0, 1, 2, 2] - emit_vertex_wrapper(corner, j); - } - EndPrimitive(); -} - void main() { // If vert indices are sequential, don't fill all @@ -127,7 +76,7 @@ void main() if (bezier_degree >= 1) { - emit_pentagon(new_bp, unit_normal); + emit_simple_triangle(); } // Don't emit any vertices for bezier_degree 0 } diff --git a/manim/utils/space_ops.py b/manim/utils/space_ops.py index f2aacdd93c..2f009679b7 100644 --- a/manim/utils/space_ops.py +++ b/manim/utils/space_ops.py @@ -671,73 +671,70 @@ def earclip_triangulation(verts: np.ndarray, ring_ends: list) -> list: list A list of indices giving a triangulation of a polygon. """ - # First, connect all the rings so that the polygon - # with holes is instead treated as a (very convex) - # polygon with one edge. Do this by drawing connections - # between rings close to each other + rings = [list(range(e0, e1)) for e0, e1 in zip([0, *ring_ends], ring_ends)] - attached_rings = rings[:1] - detached_rings = rings[1:] - loop_connections = {} - - while detached_rings: - i_range, j_range = ( - list( - filter( - # Ignore indices that are already being - # used to draw some connection - lambda i: i not in loop_connections, - it.chain(*ring_group), - ), - ) - for ring_group in (attached_rings, detached_rings) + + def is_in(point, ring_id): + return ( + abs(abs(get_winding_number([i - point for i in verts[rings[ring_id]]])) - 1) + < 1e-5 ) - # Closest point on the attached rings to an estimated midpoint - # of the detached rings - tmp_j_vert = midpoint(verts[j_range[0]], verts[j_range[len(j_range) // 2]]) - i = min(i_range, key=lambda i: norm_squared(verts[i] - tmp_j_vert)) - # Closest point of the detached rings to the aforementioned - # point of the attached rings - j = min(j_range, key=lambda j: norm_squared(verts[i] - verts[j])) - # Recalculate i based on new j - i = min(i_range, key=lambda i: norm_squared(verts[i] - verts[j])) - - # Remember to connect the polygon at these points - loop_connections[i] = j - loop_connections[j] = i - - # Move the ring which j belongs to from the - # attached list to the detached list - new_ring = next(filter(lambda ring: ring[0] <= j < ring[-1], detached_rings)) - detached_rings.remove(new_ring) - attached_rings.append(new_ring) - - # Setup linked list - after = [] - end0 = 0 - for end1 in ring_ends: - after.extend(range(end0 + 1, end1)) - after.append(end0) - end0 = end1 - - # Find an ordering of indices walking around the polygon - indices = [] - i = 0 - for _ in range(len(verts) + len(ring_ends) - 1): - # starting = False - if i in loop_connections: - j = loop_connections[i] - indices.extend([i, j]) - i = after[j] - else: - indices.append(i) - i = after[i] - if i == 0: - break + def ring_area(ring_id): + ring = rings[ring_id] + s = 0 + for i, j in zip(ring[1:], ring): + s += cross2d(verts[i], verts[j]) + return abs(s) / 2 + + # Points at the same position may cause problems + for i in rings: + verts[i[0]] += (verts[i[1]] - verts[i[0]]) * 1e-6 + verts[i[-1]] += (verts[i[-2]] - verts[i[-1]]) * 1e-6 + + # First, we should know which rings are directly contained in it for each ring + + right = [max(verts[rings[i], 0]) for i in range(len(rings))] + left = [min(verts[rings[i], 0]) for i in range(len(rings))] + top = [max(verts[rings[i], 1]) for i in range(len(rings))] + bottom = [min(verts[rings[i], 1]) for i in range(len(rings))] + area = [ring_area(i) for i in range(len(rings))] + + # The larger ring must be outside + rings_sorted = list(range(len(rings))) + rings_sorted.sort(key=lambda x: area[x], reverse=True) + + def is_in_fast(ring_a, ring_b): + # Whether a is in b + return ( + left[ring_b] <= left[ring_a] <= right[ring_a] <= right[ring_b] + and bottom[ring_b] <= bottom[ring_a] <= top[ring_a] <= top[ring_b] + and is_in(verts[rings[ring_a][0]], ring_b) + ) - meta_indices = earcut(verts[indices, :2], [len(indices)]) - return [indices[mi] for mi in meta_indices] + children = [[]] * len(rings) + for idx, i in enumerate(rings_sorted): + for j in rings_sorted[:idx][::-1]: + if is_in_fast(i, j): + children[j].append(i) + break + + res = [] + + # Then, we can use earcut for each part + used = [False] * len(rings) + for i in rings_sorted: + if used[i]: + continue + v = rings[i] + ring_ends = [len(v)] + for j in children[i]: + used[j] = True + v += rings[j] + ring_ends.append(len(v)) + res += [v[i] for i in earcut(verts[v, :2], ring_ends)] + + return res def cartesian_to_spherical(vec: Sequence[float]) -> np.ndarray: diff --git a/tests/test_graphical_units/control_data/opengl/Circle.npz b/tests/test_graphical_units/control_data/opengl/Circle.npz index 5dd50f220e2203efc3b5feead02d15d590252e51..c68316bc1675d584366f8a4c3e949f2cdde1b037 100644 GIT binary patch literal 6544 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 literal 6611 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 S6#v}@zQ8C6`B`1@*FOLah$|fc From 1e57feccdb552f6889923341e17730141a8ed648 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Sun, 10 Sep 2023 22:12:53 +0200 Subject: [PATCH 030/106] Something is rendering now but the relative manim units don't work Co-authored-by: Jason Villanueva --- example_scenes/test_new.py | 34 +- manim/mobject/opengl/shader.py | 444 ++++++++++++++++++ manim/renderer/opengl_renderer.py | 170 ++++++- manim/renderer/opengl_shader_program.py | 3 + manim/renderer/renderer.py | 7 +- .../include/camera_uniform_declarations.glsl | 5 +- .../shaders/include/finalize_color.glsl | 76 ++- .../include/position_point_into_frame.glsl | 23 +- .../shaders/quadratic_bezier_fill/frag.glsl | 20 +- .../shaders/quadratic_bezier_fill/geom.glsl | 43 +- .../shaders/quadratic_bezier_fill/vert.glsl | 14 +- .../shaders/quadratic_bezier_stroke/frag.glsl | 57 +-- .../shaders/quadratic_bezier_stroke/geom.glsl | 171 +++---- .../shaders/quadratic_bezier_stroke/vert.glsl | 12 +- 14 files changed, 836 insertions(+), 243 deletions(-) create mode 100644 manim/mobject/opengl/shader.py diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index 14b015d233..b21a3bbc1a 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -1,14 +1,32 @@ +import time + +from pyglet.gl import Config +from pyglet.window import Window + import manim.utils.color.manim_colors as col +from manim._config import tempconfig from manim.camera.camera import OpenGLCamera, OpenGLCameraFrame +from manim.constants import OUT +from manim.mobject.geometry.arc import Circle from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.renderer.opengl_renderer import OpenGLRenderer -renderer = OpenGLRenderer(1920, 1080) -vm = OpenGLVMobject([col.RED, col.GREEN]) -vm.set_points_as_corners([[0, 0, 0], [1, 0, 0], [1, 1, 0]]) -# print(vm.color) -# print(vm.fill_color) -# print(vm.stroke_color) +if __name__ == "__main__": + with tempconfig({"renderer": "opengl"}): + win = Window(width=1920, height=1080) + renderer = OpenGLRenderer(1920, 1080) + # vm = OpenGLVMobject([col.RED, col.GREEN]) + vm = Circle(radius=100) + # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) + # print(vm.color) + # print(vm.fill_color) + # print(vm.stroke_color) + + camera = OpenGLCameraFrame((1920, 1080), center_point=OUT * 10) + renderer.set_camera(camera) -camera = OpenGLCameraFrame((1920, 1090)) -renderer.render_vmobject(vm, camera) + for _ in range(4): + renderer.render_vmobject(vm) + win.dispatch_events() + win.flip() + time.sleep(1) diff --git a/manim/mobject/opengl/shader.py b/manim/mobject/opengl/shader.py new file mode 100644 index 0000000000..892ccb5892 --- /dev/null +++ b/manim/mobject/opengl/shader.py @@ -0,0 +1,444 @@ +from __future__ import annotations + +import re +import textwrap +from pathlib import Path + +import moderngl +import numpy as np + +from .. import config +from ..utils import opengl +from ..utils.simple_functions import get_parameters + +SHADER_FOLDER = Path(__file__).parent / "shaders" +shader_program_cache: dict = {} +file_path_to_code_map: dict = {} + +__all__ = [ + "Object3D", + "Mesh", + "Shader", + "FullScreenQuad", +] + + +def get_shader_code_from_file(file_path: Path) -> str: + if file_path in file_path_to_code_map: + return file_path_to_code_map[file_path] + source = file_path.read_text() + include_lines = re.finditer( + r"^#include (?P.*\.glsl)$", + source, + flags=re.MULTILINE, + ) + for match in include_lines: + include_path = match.group("include_path") + included_code = get_shader_code_from_file( + file_path.parent / include_path, + ) + source = source.replace(match.group(0), included_code) + file_path_to_code_map[file_path] = source + return source + + +def filter_attributes(unfiltered_attributes, attributes): + # Construct attributes for only those needed by the shader. + filtered_attributes_dtype = [] + for i, dtype_name in enumerate(unfiltered_attributes.dtype.names): + if dtype_name in attributes: + filtered_attributes_dtype.append( + ( + dtype_name, + unfiltered_attributes.dtype[i].subdtype[0].str, + unfiltered_attributes.dtype[i].shape, + ), + ) + + filtered_attributes = np.zeros( + unfiltered_attributes[unfiltered_attributes.dtype.names[0]].shape[0], + dtype=filtered_attributes_dtype, + ) + + for dtype_name in unfiltered_attributes.dtype.names: + if dtype_name in attributes: + filtered_attributes[dtype_name] = unfiltered_attributes[dtype_name] + + return filtered_attributes + + +class Object3D: + def __init__(self, *children): + self.model_matrix = np.eye(4) + self.normal_matrix = np.eye(4) + self.children = [] + self.parent = None + self.add(*children) + self.init_updaters() + + # TODO: Use path_func. + def interpolate(self, start, end, alpha, _): + self.model_matrix = (1 - alpha) * start.model_matrix + alpha * end.model_matrix + self.normal_matrix = ( + 1 - alpha + ) * start.normal_matrix + alpha * end.normal_matrix + + def single_copy(self): + copy = Object3D() + copy.model_matrix = self.model_matrix.copy() + copy.normal_matrix = self.normal_matrix.copy() + return copy + + def copy(self): + node_to_copy = {} + + bfs = [self] + while bfs: + node = bfs.pop(0) + bfs.extend(node.children) + + node_copy = node.single_copy() + node_to_copy[node] = node_copy + + # Add the copy to the copy of the parent. + if node.parent is not None and node is not self: + node_to_copy[node.parent].add(node_copy) + return node_to_copy[self] + + def add(self, *children): + for child in children: + if child.parent is not None: + raise Exception( + "Attempt to add child that's already added to another Object3D", + ) + self.remove(*children, current_children_only=False) + self.children.extend(children) + for child in children: + child.parent = self + + def remove(self, *children, current_children_only=True): + if current_children_only: + for child in children: + if child.parent != self: + raise Exception( + "Attempt to remove child that isn't added to this Object3D", + ) + self.children = list(filter(lambda child: child not in children, self.children)) + for child in children: + child.parent = None + + def get_position(self): + return self.model_matrix[:, 3][:3] + + def set_position(self, position): + self.model_matrix[:, 3][:3] = position + return self + + def get_meshes(self): + dfs = [self] + while dfs: + parent = dfs.pop() + if isinstance(parent, Mesh): + yield parent + dfs.extend(parent.children) + + def get_family(self): + dfs = [self] + while dfs: + parent = dfs.pop() + yield parent + dfs.extend(parent.children) + + def align_data_and_family(self, _): + pass + + def hierarchical_model_matrix(self): + if self.parent is None: + return self.model_matrix + + model_matrices = [self.model_matrix] + current_object = self + while current_object.parent is not None: + model_matrices.append(current_object.parent.model_matrix) + current_object = current_object.parent + return np.linalg.multi_dot(list(reversed(model_matrices))) + + def hierarchical_normal_matrix(self): + if self.parent is None: + return self.normal_matrix[:3, :3] + + normal_matrices = [self.normal_matrix] + current_object = self + while current_object.parent is not None: + normal_matrices.append(current_object.parent.model_matrix) + current_object = current_object.parent + return np.linalg.multi_dot(list(reversed(normal_matrices)))[:3, :3] + + def init_updaters(self): + self.time_based_updaters = [] + self.non_time_updaters = [] + self.has_updaters = False + self.updating_suspended = False + + def update(self, dt=0): + if not self.has_updaters or self.updating_suspended: + return self + for updater in self.time_based_updaters: + updater(self, dt) + for updater in self.non_time_updaters: + updater(self) + return self + + def get_time_based_updaters(self): + return self.time_based_updaters + + def has_time_based_updater(self): + return len(self.time_based_updaters) > 0 + + def get_updaters(self): + return self.time_based_updaters + self.non_time_updaters + + def add_updater(self, update_function, index=None, call_updater=True): + if "dt" in get_parameters(update_function): + updater_list = self.time_based_updaters + else: + updater_list = self.non_time_updaters + + if index is None: + updater_list.append(update_function) + else: + updater_list.insert(index, update_function) + + self.refresh_has_updater_status() + if call_updater: + self.update() + return self + + def remove_updater(self, update_function): + for updater_list in [self.time_based_updaters, self.non_time_updaters]: + while update_function in updater_list: + updater_list.remove(update_function) + self.refresh_has_updater_status() + return self + + def clear_updaters(self): + self.time_based_updaters = [] + self.non_time_updaters = [] + self.refresh_has_updater_status() + return self + + def match_updaters(self, mobject): + self.clear_updaters() + for updater in mobject.get_updaters(): + self.add_updater(updater) + return self + + def suspend_updating(self): + self.updating_suspended = True + return self + + def resume_updating(self, call_updater=True): + self.updating_suspended = False + if call_updater: + self.update(dt=0) + return self + + def refresh_has_updater_status(self): + self.has_updaters = len(self.get_updaters()) > 0 + return self + + +class Mesh(Object3D): + def __init__( + self, + shader=None, + attributes=None, + geometry=None, + material=None, + indices=None, + use_depth_test=True, + primitive=moderngl.TRIANGLES, + ): + super().__init__() + if shader is not None and attributes is not None: + self.shader = shader + self.attributes = attributes + self.indices = indices + elif geometry is not None and material is not None: + self.shader = material + self.attributes = geometry.attributes + self.indices = geometry.index + else: + raise Exception( + "Mesh requires either attributes and a Shader or a Geometry and a " + "Material", + ) + self.use_depth_test = use_depth_test + self.primitive = primitive + self.skip_render = False + self.init_updaters() + + def single_copy(self): + copy = Mesh( + attributes=self.attributes.copy(), + shader=self.shader, + indices=self.indices.copy() if self.indices is not None else None, + use_depth_test=self.use_depth_test, + primitive=self.primitive, + ) + copy.skip_render = self.skip_render + copy.model_matrix = self.model_matrix.copy() + copy.normal_matrix = self.normal_matrix.copy() + # TODO: Copy updaters? + return copy + + def set_uniforms(self, renderer): + self.shader.set_uniform( + "u_model_matrix", + opengl.matrix_to_shader_input(self.model_matrix), + ) + self.shader.set_uniform("u_view_matrix", renderer.camera.formatted_view_matrix) + self.shader.set_uniform( + "u_projection_matrix", + renderer.camera.projection_matrix, + ) + + def render(self): + if self.skip_render: + return + + if self.use_depth_test: + self.shader.context.enable(moderngl.DEPTH_TEST) + else: + self.shader.context.disable(moderngl.DEPTH_TEST) + + from moderngl import Attribute + + shader_attributes = [] + for k, v in self.shader.shader_program._members.items(): + if isinstance(v, Attribute): + shader_attributes.append(k) + shader_attributes = filter_attributes(self.attributes, shader_attributes) + + vertex_buffer_object = self.shader.context.buffer(shader_attributes.tobytes()) + if self.indices is None: + index_buffer_object = None + else: + vert_index_data = self.indices.astype("i4").tobytes() + if vert_index_data: + index_buffer_object = self.shader.context.buffer(vert_index_data) + else: + index_buffer_object = None + vertex_array_object = self.shader.context.simple_vertex_array( + self.shader.shader_program, + vertex_buffer_object, + *shader_attributes.dtype.names, + index_buffer=index_buffer_object, + ) + vertex_array_object.render(self.primitive) + vertex_buffer_object.release() + vertex_array_object.release() + if index_buffer_object is not None: + index_buffer_object.release() + + +class Shader: + def __init__( + self, + context, + name=None, + source=None, + ): + global shader_program_cache + self.context = context + self.name = name + + # See if the program is cached. + if ( + self.name in shader_program_cache + and shader_program_cache[self.name].ctx == self.context + ): + self.shader_program = shader_program_cache[self.name] + elif source is not None: + # Generate the shader from inline code if it was passed. + self.shader_program = context.program(**source) + else: + # Search for a file containing the shader. + source_dict = {} + source_dict_key = { + "vert": "vertex_shader", + "frag": "fragment_shader", + "geom": "geometry_shader", + } + shader_folder = SHADER_FOLDER / name + for shader_file in shader_folder.iterdir(): + shader_file_path = shader_folder / shader_file + shader_source = get_shader_code_from_file(shader_file_path) + source_dict[source_dict_key[shader_file_path.stem]] = shader_source + self.shader_program = context.program(**source_dict) + + # Cache the shader. + if name is not None and name not in shader_program_cache: + shader_program_cache[self.name] = self.shader_program + + def set_uniform(self, name, value): + try: + self.shader_program[name] = value + except KeyError: + pass + + +class FullScreenQuad(Mesh): + def __init__( + self, + context, + fragment_shader_source=None, + fragment_shader_name=None, + ): + if fragment_shader_source is None and fragment_shader_name is None: + raise Exception("Must either pass shader name or shader source.") + + if fragment_shader_name is not None: + # Use the name. + shader_file_path = SHADER_FOLDER / f"{fragment_shader_name}.frag" + fragment_shader_source = get_shader_code_from_file(shader_file_path) + elif fragment_shader_source is not None: + fragment_shader_source = textwrap.dedent(fragment_shader_source.lstrip()) + + shader = Shader( + context, + source={ + "vertex_shader": """ + #version 330 + in vec4 in_vert; + uniform mat4 u_model_view_matrix; + uniform mat4 u_projection_matrix; + void main() {{ + vec4 camera_space_vertex = u_model_view_matrix * in_vert; + vec4 clip_space_vertex = u_projection_matrix * camera_space_vertex; + gl_Position = clip_space_vertex; + }} + """, + "fragment_shader": fragment_shader_source, + }, + ) + attributes = np.zeros(6, dtype=[("in_vert", np.float32, (4,))]) + attributes["in_vert"] = np.array( + [ + [-config["frame_x_radius"], -config["frame_y_radius"], 0, 1], + [-config["frame_x_radius"], config["frame_y_radius"], 0, 1], + [config["frame_x_radius"], config["frame_y_radius"], 0, 1], + [-config["frame_x_radius"], -config["frame_y_radius"], 0, 1], + [config["frame_x_radius"], -config["frame_y_radius"], 0, 1], + [config["frame_x_radius"], config["frame_y_radius"], 0, 1], + ], + ) + shader.set_uniform("u_model_view_matrix", opengl.view_matrix()) + shader.set_uniform( + "u_projection_matrix", + opengl.orthographic_projection_matrix(), + ) + super().__init__(shader, attributes) + + def render(self): + super().render() diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index c466f56a58..ad54e65856 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -5,14 +5,18 @@ import moderngl as gl import numpy as np +from PIL import Image from typing_extensions import override import manim.constants as const import manim.utils.color.manim_colors as color from manim._config import config, logger from manim.camera.camera import OpenGLCameraFrame +from manim.mobject.types.vectorized_mobject import VMobject from manim.renderer.opengl_shader_program import load_shader_program_by_folder -from manim.renderer.renderer import Renderer, RendererData +from manim.renderer.renderer import ImageType, Renderer, RendererData +from manim.renderer.shader_wrapper import ShaderWrapper +from manim.utils.iterables import listify, resize_array, resize_with_interpolation from manim.utils.space_ops import cross2d, earclip_triangulation, z_to_vector if TYPE_CHECKING: @@ -21,15 +25,31 @@ import manim.utils.color.core as c from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject +fill_dtype = [ + ("point", np.float32, (3,)), + # ("orientation", np.float32, (3,)), + ("unit_normal", np.float32, (3,)), + ("color", np.float32, (4,)), + ("vert_index", np.float32, (1,)), +] +stroke_dtype = [ + ("point", np.float32, (3,)), + ("prev_point", np.float32, (3,)), + ("next_point", np.float32, (3,)), + ("stroke_width", np.float32, (1,)), + ("color", np.float32, (4,)), +] + class GLRenderData(RendererData): def __init__(self) -> None: super().__init__() self.fill_rgbas = np.zeros((1, 4)) self.stroke_rgbas = np.zeros((1, 4)) + self.stroke_widths = np.zeros((1, 1)) self.normals = np.zeros((1, 4)) - self.orientation = None - self.mesh = np.zeros((0, 3)) + self.orientation = np.zeros((1, 1)) + self.vert_indices = np.zeros((0, 3)) self.bounding_box = np.zeros((3, 3)) def __repr__(self) -> str: @@ -43,7 +63,7 @@ def __repr__(self) -> str: orientation: {self.orientation} mesh: -{self.mesh} +{self.vert_indices} bounding_box: {self.bounding_box} """ @@ -165,22 +185,27 @@ def __init__( self.pixel_width = pixel_width self.pixel_height = pixel_height self.samples = samples - self.background_color = (color.BLACK,) + self.background_color = background_color.to_rgba() self.background_image = background_image self.rgb_max_val: float = np.iinfo(self.pixel_array_dtype).max # Initializing Context logger.debug("Initializing OpenGL context and framebuffers") - self.ctx = gl.create_context(standalone=True) + self.ctx = gl.create_context() self.target_fbo = self.ctx.simple_framebuffer( (self.pixel_width, self.pixel_height), samples=self.samples ) - self.output_fbo = self.ctx.framebuffer( - color_attachments=[ - self.ctx.renderbuffer((self.pixel_width, self.pixel_height)) - ] - ) + + fbo = self.ctx.detect_framebuffer() + if not fbo: + self.output_fbo = self.ctx.framebuffer( + color_attachments=[ + self.ctx.renderbuffer((self.pixel_width, self.pixel_height)) + ] + ) + else: + self.output_fbo = fbo # Preparing vmobject shader logger.debug("Initializing Shader Programs") @@ -191,8 +216,70 @@ def __init__( self.ctx, "quadratic_bezier_stroke" ) + def set_camera(self, camera: OpenGLCameraFrame) -> ImageType: + self.vmobject_fill_program["is_fixed_in_frame"] = 0.0 + self.vmobject_fill_program["frame_shape"] = camera.frame_shape + self.vmobject_fill_program["focal_distance"] = float( + camera.get_focal_distance() + ) + self.vmobject_fill_program["camera_center"] = tuple(camera.get_center()) + self.vmobject_fill_program["camera_rotation"] = tuple( + np.array(camera.get_inverse_camera_rotation_matrix()).T.flatten() + ) + self.vmobject_fill_program["light_source_position"] = (-10, 10, 10) + # TODO: convert to singular 4x4 matrix after getting *something* to render + # self.vmobject_fill_program['view'].value = camera.get_view()? + self.vmobject_stroke_program["is_fixed_in_frame"].value = 0.0 + self.vmobject_stroke_program["anti_alias_width"].value = 1.0 + self.vmobject_stroke_program["frame_shape"].value = np.asarray( + camera.frame_shape + ) + # self.vmobject_stroke_program['pixel_shape'].value = camera.frame_shape + self.vmobject_stroke_program["focal_distance"].value = np.asarray( + camera.get_focal_distance() + ) + self.vmobject_stroke_program["camera_center"].value = np.asarray( + camera.get_center() + ) + self.vmobject_stroke_program["camera_rotation"].value = np.array( + camera.get_inverse_camera_rotation_matrix() + ).T.flatten() + self.vmobject_stroke_program["light_source_position"].value = np.array( + [-10, 10, 10] + ) + + def get_stroke_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: + if not isinstance(mob.renderer_data, GLRenderData): + raise TypeError() + + points = mob.points + stroke_data = np.zeros(len(points), dtype=stroke_dtype) + + nppc = mob.n_points_per_curve + stroke_data["point"] = points + stroke_data["prev_point"][:nppc] = points[-nppc:] + stroke_data["prev_point"][nppc:] = points[:-nppc] + stroke_data["next_point"][:-nppc] = points[nppc:] + stroke_data["next_point"][-nppc:] = points[:nppc] + stroke_data["color"] = mob.renderer_data.stroke_rgbas + stroke_data["stroke_width"] = mob.renderer_data.stroke_widths + + return stroke_data + + def get_fill_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: + if not isinstance(mob.renderer_data, GLRenderData): + raise TypeError() + + fill_data = np.zeros(len(mob.points), dtype=fill_dtype) + fill_data["point"] = mob.points + fill_data["color"] = mob.renderer_data.fill_rgbas + # fill_data["orientation"] = mob.renderer_data.orientation + fill_data["unit_normal"] = mob.renderer_data.normals + fill_data["vert_index"] = np.reshape(range(len(mob.points)), (-1, 1)) + return fill_data + @override - def render_vmobject(self, mob: OpenGLVMobject, camera: OpenGLCameraFrame) -> None: + def render_vmobject(self, mob: OpenGLVMobject) -> None: # Setting camera uniforms if mob.renderer_data is None: @@ -201,20 +288,25 @@ def render_vmobject(self, mob: OpenGLVMobject, camera: OpenGLCameraFrame) -> Non logger.debug("Initializing GLRenderData") mob.renderer_data = GLRenderData() # Generate Mesh - mob.renderer_data.mesh, mob.renderer_data.orientation = get_triangulation( - mob - ) - mesh_length = len(mob.renderer_data.mesh) + ( + mob.renderer_data.vert_indices, + mob.renderer_data.orientation, + ) = get_triangulation(mob) + points_length = len(mob.points) # Generate Fill Color fill_color = np.array([c._internal_value for c in mob.fill_color]) stroke_color = np.array([c._internal_value for c in mob.stroke_color]) - mob.renderer_data.fill_rgbas = prepare_array(fill_color, mesh_length) - mob.renderer_data.stroke_rgbas = prepare_array(stroke_color, mesh_length) + mob.renderer_data.fill_rgbas = prepare_array(fill_color, points_length) + mob.renderer_data.stroke_rgbas = prepare_array(stroke_color, points_length) + mob.renderer_data.stroke_widths = prepare_array( + np.asarray(listify(mob.stroke_width)), points_length + ) mob.renderer_data.normals = np.repeat( - [mob.get_unit_normal()], mesh_length, axis=0 + [mob.get_unit_normal()], points_length, axis=0 ) mob.renderer_data.bounding_box = compute_bounding_box(mob) + print(mob.renderer_data) # print(mob.renderer_data.mesh) # print(mob.renderer_data.orientation) @@ -227,6 +319,46 @@ def render_vmobject(self, mob: OpenGLVMobject, camera: OpenGLCameraFrame) -> Non # if(mob.has_fill()): # mob.renderer_data.mesh = ... # Triangulation todo + # self.vmobject_fill_program['reflectiveness'].value = mob.reflectiveness + self.vmobject_fill_program["gloss"].value = mob.gloss + self.vmobject_fill_program["shadow"].value = mob.shadow + + # self.vmobject_stroke_program['reflectiveness'].value = mob.reflectiveness + self.vmobject_stroke_program["gloss"].value = mob.gloss + self.vmobject_stroke_program["shadow"].value = mob.shadow + self.vmobject_stroke_program["joint_type"].value = float( + mob.joint_type.value + ) # TODO: This maybe breaks + self.vmobject_stroke_program["flat_stroke"].value = mob.flat_stroke + + def render_shader(prog, mob, data): + vbo = self.ctx.buffer(data.tobytes()) + ibo = self.ctx.buffer(mob.renderer_data.vert_indices) + # print(prog,vbo,data) + vert_format = gl.detect_format(prog, data.dtype.names) + # print(vert_format) + vao = self.ctx.vertex_array( + program=prog, + content=[(vbo, vert_format, *data.dtype.names)], + index_buffer=ibo, + ) + self.target_fbo.use() + self.target_fbo.clear(*self.background_color) + vao.render(gl.TRIANGLES) + vbo.release() + ibo.release() + vao.release() + + # print(self.get_fill_shader_data(mob)) + self.ctx.enable(gl.BLEND) + self.ctx.enable(gl.DEPTH_TEST) + + render_shader(self.vmobject_fill_program, mob, self.get_fill_shader_data(mob)) + # render_shader(self.vmobject_stroke_program, mob, stroke_dtype, self.get_stroke_shader_data(mob)) + # print(self.target_fbo.read()) + self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo) + # Image.frombytes('RGBA', self.output_fbo.size, self.output_fbo.read(components=4), 'raw', 'RGBA', 0, -1).show() + # set shader # use vbo # render fill diff --git a/manim/renderer/opengl_shader_program.py b/manim/renderer/opengl_shader_program.py index 1aadcc25b4..d48311d44e 100644 --- a/manim/renderer/opengl_shader_program.py +++ b/manim/renderer/opengl_shader_program.py @@ -75,6 +75,9 @@ def load_shader_program_by_folder(ctx: gl.Context, folder_name: str): vertex_code = get_shader_code_from_file(Path(folder_name + "/vert.glsl")) geometry_code = get_shader_code_from_file(Path(folder_name + "/geom.glsl")) fragment_code = get_shader_code_from_file(Path(folder_name + "/frag.glsl")) + # print(folder_name) + # for i,l in enumerate(geometry_code.splitlines()): + # print(str(i) + ":" + l ) if vertex_code is None or fragment_code is None: logger.error( f"Invalid program definition for {folder_name} vertex or fragment shader not present" diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index 6c53f5f79e..f3198cd809 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -9,7 +9,7 @@ from manim.mobject.types.image_mobject import ImageMobject from manim.mobject.types.vectorized_mobject import VMobject -Image: TypeAlias = np.ndarray +ImageType: TypeAlias = np.ndarray class RendererData: @@ -21,13 +21,12 @@ def __init__(self): self.fbo = np.zeros((config.height, config.width)) self.capabilities = { VMobject: self.render_vmobject, - ImageMobject: self.render_imobject, + ImageMobject: self.render_image, } - def render(self, camera, renderables: [VMobject]) -> Image: # Image + def render(self, camera, renderables: [VMobject]) -> ImageType: # Image for mob in renderables: if type(mob) in self.capabilities: - mob.points self.capabilities[type(mob)](mob) else: print("WARNING: NOT SUPPORTED") diff --git a/manim/renderer/shaders/include/camera_uniform_declarations.glsl b/manim/renderer/shaders/include/camera_uniform_declarations.glsl index f7b5daa106..29418c8efb 100644 --- a/manim/renderer/shaders/include/camera_uniform_declarations.glsl +++ b/manim/renderer/shaders/include/camera_uniform_declarations.glsl @@ -1,6 +1,7 @@ uniform vec2 frame_shape; -uniform vec2 pixel_shape; -uniform vec3 camera_offset; +uniform vec3 camera_center; uniform mat3 camera_rotation; uniform float is_fixed_in_frame; +uniform float is_fixed_orientation; +uniform vec3 fixed_orientation_center; uniform float focal_distance; diff --git a/manim/renderer/shaders/include/finalize_color.glsl b/manim/renderer/shaders/include/finalize_color.glsl index 2e3f43c025..26b10376a2 100644 --- a/manim/renderer/shaders/include/finalize_color.glsl +++ b/manim/renderer/shaders/include/finalize_color.glsl @@ -1,53 +1,51 @@ -vec3 float_to_color(float value, float min_val, float max_val, vec3[9] colormap_data) -{ +vec3 float_to_color(float value, float min_val, float max_val, vec3[9] colormap_data){ float alpha = clamp((value - min_val) / (max_val - min_val), 0.0, 1.0); int disc_alpha = min(int(alpha * 8), 7); - return mix(colormap_data[disc_alpha], colormap_data[disc_alpha + 1], 8.0 * alpha - disc_alpha); + return mix( + colormap_data[disc_alpha], + colormap_data[disc_alpha + 1], + 8.0 * alpha - disc_alpha + ); } -vec4 add_light(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, vec3 cam_coords, float reflectiveness, - float gloss, float shadow) -{ - if (reflectiveness == 0.0 && gloss == 0.0 && shadow == 0.0) - return color; - vec4 result = color; - // Assume everything has already been rotated such that camera is in the z-direction - // cam_coords = vec3(0, 0, focal_distance); - vec3 to_camera = normalize(cam_coords - point); - vec3 to_light = normalize(light_coords - point); +vec4 add_light(vec4 color, + vec3 point, + vec3 unit_normal, + vec3 light_coords, + float gloss, + float shadow){ + if(gloss == 0.0 && shadow == 0.0) return color; - // Note, this effectively treats surfaces as two-sided - // if(dot(to_camera, unit_normal) < 0) unit_normal *= -1; + // TODO, do we actually want this? It effectively treats surfaces as two-sided + if(unit_normal.z < 0){ + unit_normal *= -1; + } - float light_to_normal = dot(to_light, unit_normal); - // When unit normal points towards light, brighten - float bright_factor = max(light_to_normal, 0) * reflectiveness; - // For glossy surface, add extra shine if light beam go towards camera + // TODO, read this in as a uniform? + float camera_distance = 6; + // Assume everything has already been rotated such that camera is in the z-direction + vec3 to_camera = vec3(0, 0, camera_distance) - point; + vec3 to_light = light_coords - point; vec3 light_reflection = -to_light + 2 * unit_normal * dot(to_light, unit_normal); - float light_to_cam = dot(light_reflection, to_camera); - float shine = gloss * exp(-3 * pow(1 - light_to_cam, 2)); - bright_factor += shine; - - result.rgb = mix(result.rgb, vec3(1.0), bright_factor); - if (light_to_normal < 0) - { - // Darken - result.rgb = mix(result.rgb, vec3(0.0), -light_to_normal * shadow); - } - // float darkening = mix(1, max(light_to_normal, 0), shadow); - // return vec4( - // darkening * mix(color.rgb, vec3(1.0), shine), - // color.a - // ); - return result; + float dot_prod = dot(normalize(light_reflection), normalize(to_camera)); + float shine = gloss * exp(-3 * pow(1 - dot_prod, 2)); + float dp2 = dot(normalize(to_light), unit_normal); + float darkening = mix(1, max(dp2, 0), shadow); + return vec4( + darkening * mix(color.rgb, vec3(1.0), shine), + color.a + ); } -vec4 finalize_color(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, vec3 cam_coords, float reflectiveness, - float gloss, float shadow) -{ +vec4 finalize_color(vec4 color, + vec3 point, + vec3 unit_normal, + vec3 light_coords, + float gloss, + float shadow){ ///// INSERT COLOR FUNCTION HERE ///// // The line above may be replaced by arbitrary code snippets, as per // the method Mobject.set_color_by_code - return add_light(color, point, unit_normal, light_coords, cam_coords, reflectiveness, gloss, shadow); + return add_light(color, point, unit_normal, light_coords, gloss, shadow); } diff --git a/manim/renderer/shaders/include/position_point_into_frame.glsl b/manim/renderer/shaders/include/position_point_into_frame.glsl index f8d5f3859c..67b5080f56 100644 --- a/manim/renderer/shaders/include/position_point_into_frame.glsl +++ b/manim/renderer/shaders/include/position_point_into_frame.glsl @@ -1,22 +1,25 @@ // Assumes the following uniforms exist in the surrounding context: // uniform float is_fixed_in_frame; -// uniform vec3 camera_offset; +// uniform float is_fixed_orientation; +// uniform vec3 fixed_orientation_center; +// uniform vec3 camera_center; // uniform mat3 camera_rotation; -vec3 rotate_point_into_frame(vec3 point) -{ - if (bool(is_fixed_in_frame)) - { +vec3 rotate_point_into_frame(vec3 point){ + if(bool(is_fixed_in_frame)){ return point; } return camera_rotation * point; } -vec3 position_point_into_frame(vec3 point) -{ - if (bool(is_fixed_in_frame)) - { + +vec3 position_point_into_frame(vec3 point){ + if(bool(is_fixed_in_frame)){ return point; } - return rotate_point_into_frame(point - camera_offset); + if(bool(is_fixed_orientation)){ + vec3 new_center = rotate_point_into_frame(fixed_orientation_center); + return point + (new_center - fixed_orientation_center); + } + return rotate_point_into_frame(point - camera_center); } diff --git a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl index dfc5cd4f6a..e7b06f9a14 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl @@ -1,9 +1,9 @@ #version 330 -#include "../include/camera_uniform_declarations.glsl" +#include ../include/camera_uniform_declarations.glsl in vec4 color; -in float fill_all; // Either 0 or 1 +in float fill_all; // Either 0 or 1e in float uv_anti_alias_width; in float orientation; @@ -14,10 +14,8 @@ out vec4 frag_color; #define ANTI_ALIASING -float sdf() -{ - if (bezier_degree < 2) - { +float sdf(){ + if(bezier_degree < 2){ return abs(uv_coords[1]); } vec2 p = uv_coords; @@ -31,13 +29,11 @@ float sdf() #endif } -void main() -{ - if (color.a == 0) - discard; + +void main() { + if (color.a == 0) discard; frag_color = color; - if (fill_all == 1.0) - return; + if (fill_all == 1.0) return; #ifdef ANTI_ALIASING frag_color.a *= 0.5 - sdf(); // Anti-aliasing #endif diff --git a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl index 34cdc1db5a..1af88004e6 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl @@ -1,24 +1,23 @@ #version 330 -layout(triangles) in; -layout(triangle_strip, max_vertices = 5) out; +layout (triangles) in; +layout (triangle_strip, max_vertices = 5) out; uniform float anti_alias_width; // Needed for get_gl_Position uniform vec2 frame_shape; -uniform vec2 pixel_shape; uniform float focal_distance; uniform float is_fixed_in_frame; +uniform float is_fixed_orientation; +uniform vec3 fixed_orientation_center; // Needed for finalize_color uniform vec3 light_source_position; -uniform vec3 camera_position; -uniform float reflectiveness; uniform float gloss; uniform float shadow; in vec3 bp[3]; -in float v_orientation[3]; +in vec3 v_global_unit_normal[3]; in vec4 v_color[3]; in float v_vert_index[3]; @@ -30,14 +29,10 @@ out vec2 uv_coords; out float bezier_degree; // Analog of import for manim only -// Comment to prevent formatting -#include "../include/quadratic_bezier_geometry_functions.glsl" -// -#include "../include/get_gl_Position.glsl" -// -#include "../include/get_unit_normal.glsl" -// -#include "../include/finalize_color.glsl" +#include ../include/quadratic_bezier_geometry_functions.glsl +#include ../include/get_gl_Position.glsl +#include ../include/get_unit_normal.glsl +#include ../include/finalize_color.glsl const vec2 uv_coords_arr[3] = vec2[3](vec2(0, 0), vec2(0.5, 0), vec2(1, 1)); @@ -51,31 +46,31 @@ void emit_vertex_wrapper(vec3 point, int index) void emit_simple_triangle() { - for (int i = 0; i < 3; i++) + for(int i = 0; i < 3; i++) { emit_vertex_wrapper(bp[i], i); } EndPrimitive(); } -void main() -{ +void main(){ // If vert indices are sequential, don't fill all - fill_all = float((v_vert_index[1] - v_vert_index[0]) != 1.0 || (v_vert_index[2] - v_vert_index[1]) != 1.0); + fill_all = float( + (v_vert_index[1] - v_vert_index[0]) != 1.0 || + (v_vert_index[2] - v_vert_index[1]) != 1.0 + ); - if (fill_all == 1.0) - { + if(fill_all == 1.0){ emit_simple_triangle(); return; } vec3 new_bp[3]; bezier_degree = get_reduced_control_points(vec3[3](bp[0], bp[1], bp[2]), new_bp); - unit_normal = get_unit_normal(new_bp); - orientation = v_orientation[0]; + vec3 local_unit_normal = get_unit_normal(new_bp); + orientation = sign(dot(v_global_unit_normal[0], local_unit_normal)); - if (bezier_degree >= 1) - { + if(bezier_degree >= 1){ emit_simple_triangle(); } // Don't emit any vertices for bezier_degree 0 diff --git a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl index dd1f317a98..a394b5ce87 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl @@ -1,24 +1,24 @@ #version 330 -#include "../include/camera_uniform_declarations.glsl" +#include ../include/camera_uniform_declarations.glsl in vec3 point; in float orientation; +in vec3 unit_normal; in vec4 color; in float vert_index; out vec3 bp; // Bezier control point -out float v_orientation; out vec4 v_color; out float v_vert_index; +out vec3 v_global_unit_normal; // Analog of import for manim only -#include "../include/position_point_into_frame.glsl" +#include ../include/position_point_into_frame.glsl -void main() -{ - bp = position_point_into_frame(point); - v_orientation = orientation; +void main(){ + bp = position_point_into_frame(point.xyz); + v_global_unit_normal = rotate_point_into_frame(unit_normal); v_color = color; v_vert_index = vert_index; } diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl index c37c7d70d0..8cf383a058 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl @@ -1,6 +1,6 @@ #version 330 -#include "../include/camera_uniform_declarations.glsl" +#include ../include/camera_uniform_declarations.glsl in vec2 uv_coords; in vec2 uv_b2; @@ -20,25 +20,25 @@ in float bezier_degree; out vec4 frag_color; -float cross2d(vec2 v, vec2 w) -{ + +float cross2d(vec2 v, vec2 w){ return v.x * w.y - w.x * v.y; } -float modify_distance_for_endpoints(vec2 p, float dist, float t) -{ + +float modify_distance_for_endpoints(vec2 p, float dist, float t){ float buff = 0.5 * uv_stroke_width - uv_anti_alias_width; // Check the beginning of the curve - if (t == 0) - { + if(t == 0){ // Clip the start - if (has_prev == 0) - return max(dist, -p.x + buff); + if(has_prev == 0) return max(dist, -p.x + buff); // Bevel start - if (bevel_start == 1) - { + if(bevel_start == 1){ float a = angle_from_prev; - mat2 rot = mat2(cos(a), sin(a), -sin(a), cos(a)); + mat2 rot = mat2( + cos(a), sin(a), + -sin(a), cos(a) + ); // Dist for intersection of two lines float bevel_d = max(abs(p.y), abs((rot * p).y)); // Dist for union of this intersection with the real curve @@ -47,29 +47,30 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t) return max(min(dist, bevel_d), dist / 2); } // Otherwise, start will be rounded off - } - else if (t == 1) - { + }else if(t == 1){ // Check the end of the curve // TODO, too much code repetition vec2 v21 = (bezier_degree == 2) ? vec2(1, 0) - uv_b2 : vec2(-1, 0); float len_v21 = length(v21); - if (len_v21 == 0) - { + if(len_v21 == 0){ v21 = -uv_b2; len_v21 = length(v21); } float perp_dist = dot(p - uv_b2, v21) / len_v21; - if (has_next == 0) - return max(dist, -perp_dist + buff); + if(has_next == 0) return max(dist, -perp_dist + buff); // Bevel end - if (bevel_end == 1) - { + if(bevel_end == 1){ float a = -angle_to_next; - mat2 rot = mat2(cos(a), sin(a), -sin(a), cos(a)); + mat2 rot = mat2( + cos(a), sin(a), + -sin(a), cos(a) + ); vec2 v21_unit = v21 / length(v21); - float bevel_d = max(abs(cross2d(p - uv_b2, v21_unit)), abs(cross2d((rot * (p - uv_b2)), v21_unit))); + float bevel_d = max( + abs(cross2d(p - uv_b2, v21_unit)), + abs(cross2d((rot * (p - uv_b2)), v21_unit)) + ); return max(min(dist, bevel_d), dist / 2); } // Otherwise, end will be rounded off @@ -77,12 +78,12 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t) return dist; } -#include "../include/quadratic_bezier_distance.glsl" -void main() -{ - if (uv_stroke_width == 0) - discard; +#include ../include/quadratic_bezier_distance.glsl + + +void main() { + if (uv_stroke_width == 0) discard; float dist_to_curve = min_dist_to_curve(uv_coords, uv_b2, bezier_degree); // An sdf for the region around the curve we wish to color. float signed_dist = abs(dist_to_curve) - 0.5 * uv_stroke_width; diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl index 7d34a5a303..2433142410 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl @@ -1,28 +1,28 @@ #version 330 -layout(triangles) in; -layout(triangle_strip, max_vertices = 5) out; +layout (triangles) in; +layout (triangle_strip, max_vertices = 5) out; // Needed for get_gl_Position uniform vec2 frame_shape; -uniform vec2 pixel_shape; uniform float focal_distance; uniform float is_fixed_in_frame; +uniform float is_fixed_orientation; +uniform vec3 fixed_orientation_center; uniform float anti_alias_width; uniform float flat_stroke; -// Needed for lighting +//Needed for lighting uniform vec3 light_source_position; -uniform vec3 camera_position; uniform float joint_type; -uniform float reflectiveness; uniform float gloss; uniform float shadow; in vec3 bp[3]; in vec3 prev_bp[3]; in vec3 next_bp[3]; +in vec3 v_global_unit_normal[3]; in vec4 v_color[3]; in float v_stroke_width[3]; @@ -43,8 +43,6 @@ out float bezier_degree; out vec2 uv_coords; out vec2 uv_b2; -vec3 unit_normal; - // Codes for joint types const float AUTO_JOINT = 0; const float ROUND_JOINT = 1; @@ -52,61 +50,55 @@ const float BEVEL_JOINT = 2; const float MITER_JOINT = 3; const float PI = 3.141592653; -#include "../include/finalize_color.glsl" -#include "../include/get_gl_Position.glsl" -#include "../include/get_unit_normal.glsl" -#include "../include/quadratic_bezier_geometry_functions.glsl" -void flatten_points(in vec3[3] points, out vec2[3] flat_points) -{ - for (int i = 0; i < 3; i++) - { +#include ../include/quadratic_bezier_geometry_functions.glsl +#include ../include/get_gl_Position.glsl +#include ../include/get_unit_normal.glsl +#include ../include/finalize_color.glsl + + +void flatten_points(in vec3[3] points, out vec2[3] flat_points){ + for(int i = 0; i < 3; i++){ float sf = perspective_scale_factor(points[i].z, focal_distance); flat_points[i] = sf * points[i].xy; } } -float angle_between_vectors(vec2 v1, vec2 v2) -{ + +float angle_between_vectors(vec2 v1, vec2 v2){ float v1_norm = length(v1); float v2_norm = length(v2); - if (v1_norm == 0 || v2_norm == 0) - return 0.0; + if(v1_norm == 0 || v2_norm == 0) return 0.0; float dp = dot(v1, v2) / (v1_norm * v2_norm); float angle = acos(clamp(dp, -1.0, 1.0)); float sn = sign(cross2d(v1, v2)); return sn * angle; } -bool find_intersection(vec2 p0, vec2 v0, vec2 p1, vec2 v1, out vec2 intersection) -{ + +bool find_intersection(vec2 p0, vec2 v0, vec2 p1, vec2 v1, out vec2 intersection){ // Find the intersection of a line passing through // p0 in the direction v0 and one passing through p1 in // the direction p1. // That is, find a solutoin to p0 + v0 * t = p1 + v1 * s float det = -v0.x * v1.y + v1.x * v0.y; - if (det == 0) - return false; + if(det == 0) return false; float t = cross2d(p0 - p1, v1) / det; intersection = p0 + v0 * t; return true; } -void create_joint(float angle, vec2 unit_tan, float buff, vec2 static_c0, out vec2 changing_c0, vec2 static_c1, - out vec2 changing_c1) -{ + +void create_joint(float angle, vec2 unit_tan, float buff, + vec2 static_c0, out vec2 changing_c0, + vec2 static_c1, out vec2 changing_c1){ float shift; - if (abs(angle) < 1e-3) - { + if(abs(angle) < 1e-3){ // No joint shift = 0; - } - else if (joint_type == MITER_JOINT) - { + }else if(joint_type == MITER_JOINT){ shift = buff * (-1.0 - cos(angle)) / sin(angle); - } - else - { + }else{ // For a Bevel joint shift = buff * (1.0 - cos(angle)) / sin(angle); } @@ -114,11 +106,11 @@ void create_joint(float angle, vec2 unit_tan, float buff, vec2 static_c0, out ve changing_c1 = static_c1 + shift * unit_tan; } + // This function is responsible for finding the corners of // a bounding region around the bezier curve, which can be // emitted as a triangle fan -int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 corners[5]) -{ +int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 corners[5]){ vec2 p0 = controls[0]; vec2 p1 = controls[1]; vec2 p2 = controls[2]; @@ -129,13 +121,13 @@ int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 c vec2 v01 = -v10; vec2 v21 = -v12; - vec2 p0_perp = vec2(-v01.y, v01.x); // Pointing to the left of the curve from p0 - vec2 p2_perp = vec2(-v12.y, v12.x); // Pointing to the left of the curve from p2 + vec2 p0_perp = vec2(-v01.y, v01.x); // Pointing to the left of the curve from p0 + vec2 p2_perp = vec2(-v12.y, v12.x); // Pointing to the left of the curve from p2 // aaw is the added width given around the polygon for antialiasing. // In case the normal is faced away from (0, 0, 1), the vector to the // camera, this is scaled up. - float aaw = anti_alias_width * frame_shape.y / pixel_shape.y; + float aaw = anti_alias_width; float buff0 = 0.5 * stroke_widths[0] + aaw; float buff2 = 0.5 * stroke_widths[2] + aaw; float aaw0 = (1 - has_prev) * aaw; @@ -147,92 +139,94 @@ int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 c vec2 c3 = p2 - buff2 * p2_perp + aaw2 * v12; // Account for previous and next control points - if (has_prev > 0) - create_joint(angle_from_prev, v01, buff0, c0, c0, c1, c1); - if (has_next > 0) - create_joint(angle_to_next, v21, buff2, c3, c3, c2, c2); + if(has_prev > 0) create_joint(angle_from_prev, v01, buff0, c0, c0, c1, c1); + if(has_next > 0) create_joint(angle_to_next, v21, buff2, c3, c3, c2, c2); // Linear case is the simplest - if (degree == 1) - { - // The order of corners should be for a triangle_strip. Last entry is a - // dummy + if(degree == 1){ + // The order of corners should be for a triangle_strip. Last entry is a dummy corners = vec2[5](c0, c1, c3, c2, vec2(0.0)); return 4; } // Otherwise, form a pentagon around the curve - float orientation = sign(cross2d(v01, v12)); // Positive for ccw curves - if (orientation > 0) - corners = vec2[5](c0, c1, p1, c2, c3); - else - corners = vec2[5](c1, c0, p1, c3, c2); + float orientation = sign(cross2d(v01, v12)); // Positive for ccw curves + if(orientation > 0) corners = vec2[5](c0, c1, p1, c2, c3); + else corners = vec2[5](c1, c0, p1, c3, c2); // Replace corner[2] with convex hull point accounting for stroke width find_intersection(corners[0], v01, corners[4], v21, corners[2]); return 5; } -void set_adjascent_info(vec2 c0, vec2 tangent, int degree, vec2 adj[3], out float bevel, out float angle) -{ + +void set_adjascent_info(vec2 c0, vec2 tangent, + int degree, + vec2 adj[3], + out float bevel, + out float angle + ){ bool linear_adj = (angle_between_vectors(adj[1] - adj[0], adj[2] - adj[1]) < 1e-3); angle = angle_between_vectors(c0 - adj[1], tangent); // Decide on joint type bool one_linear = (degree == 1 || linear_adj); - bool should_bevel = ((joint_type == AUTO_JOINT && one_linear) || joint_type == BEVEL_JOINT); + bool should_bevel = ( + (joint_type == AUTO_JOINT && one_linear) || + joint_type == BEVEL_JOINT + ); bevel = should_bevel ? 1.0 : 0.0; } -void find_joint_info(vec2 controls[3], vec2 prev[3], vec2 next[3], int degree) -{ + +void find_joint_info(vec2 controls[3], vec2 prev[3], vec2 next[3], int degree){ float tol = 1e-6; // Made as floats not bools so they can be passed to the frag shader has_prev = float(distance(prev[2], controls[0]) < tol); has_next = float(distance(next[0], controls[2]) < tol); - if (bool(has_prev)) - { + if(bool(has_prev)){ vec2 tangent = controls[1] - controls[0]; - set_adjascent_info(controls[0], tangent, degree, prev, bevel_start, angle_from_prev); + set_adjascent_info( + controls[0], tangent, degree, prev, + bevel_start, angle_from_prev + ); } - if (bool(has_next)) - { + if(bool(has_next)){ vec2 tangent = controls[1] - controls[2]; - set_adjascent_info(controls[2], tangent, degree, next, bevel_end, angle_to_next); + set_adjascent_info( + controls[2], tangent, degree, next, + bevel_end, angle_to_next + ); angle_to_next *= -1; } } -void main() -{ + +void main() { // Convert control points to a standard form if they are linear or null vec3 controls[3]; vec3 prev[3]; vec3 next[3]; - unit_normal = get_unit_normal(controls); bezier_degree = get_reduced_control_points(vec3[3](bp[0], bp[1], bp[2]), controls); - if (bezier_degree == 0.0) - return; // Null curve + if(bezier_degree == 0.0) return; // Null curve int degree = int(bezier_degree); get_reduced_control_points(vec3[3](prev_bp[0], prev_bp[1], prev_bp[2]), prev); get_reduced_control_points(vec3[3](next_bp[0], next_bp[1], next_bp[2]), next); + // Adjust stroke width based on distance from the camera float scaled_strokes[3]; - for (int i = 0; i < 3; i++) - { + for(int i = 0; i < 3; i++){ float sf = perspective_scale_factor(controls[i].z, focal_distance); - if (bool(flat_stroke)) - { + if(bool(flat_stroke)){ vec3 to_cam = normalize(vec3(0.0, 0.0, focal_distance) - controls[i]); - sf *= abs(dot(unit_normal, to_cam)); + sf *= abs(dot(v_global_unit_normal[i], to_cam)); } scaled_strokes[i] = v_stroke_width[i] * sf; } // Control points are projected to the xy plane before drawing, which in turn - // gets tranlated to a uv plane. The z-coordinate information will be - // remembered by what's sent out to gl_Position, and by how it affects the - // lighting and stroke width + // gets translated to a uv plane. The z-coordinate information will be remembered + // by what's sent out to gl_Position, and by how it affects the lighting and stroke width vec2 flat_controls[3]; vec2 flat_prev[3]; vec2 flat_next[3]; @@ -247,26 +241,33 @@ void main() int n_corners = get_corners(flat_controls, degree, scaled_strokes, corners); int index_map[5] = int[5](0, 0, 1, 2, 2); - if (n_corners == 4) - index_map[2] = 2; + if(n_corners == 4) index_map[2] = 2; // Find uv conversion matrix mat3 xy_to_uv = get_xy_to_uv(flat_controls[0], flat_controls[1]); float scale_factor = length(flat_controls[1] - flat_controls[0]); - uv_anti_alias_width = anti_alias_width * frame_shape.y / pixel_shape.y / scale_factor; + uv_anti_alias_width = anti_alias_width / scale_factor; uv_b2 = (xy_to_uv * vec3(flat_controls[2], 1.0)).xy; // Emit each corner - for (int i = 0; i < n_corners; i++) - { + for(int i = 0; i < n_corners; i++){ uv_coords = (xy_to_uv * vec3(corners[i], 1.0)).xy; uv_stroke_width = scaled_strokes[index_map[i]] / scale_factor; // Apply some lighting to the color before sending out. // vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z); vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z); - color = finalize_color(v_color[index_map[i]], xyz_coords, unit_normal, light_source_position, camera_position, - reflectiveness, gloss, shadow); - gl_Position = vec4(get_gl_Position(vec3(corners[i], 0.0)).xy, get_gl_Position(controls[index_map[i]]).zw); + color = finalize_color( + v_color[index_map[i]], + xyz_coords, + v_global_unit_normal[index_map[i]], + light_source_position, + gloss, + shadow + ); + gl_Position = vec4( + get_gl_Position(vec3(corners[i], 0.0)).xy, + get_gl_Position(controls[index_map[i]]).zw + ); EmitVertex(); } EndPrimitive(); diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl index f626c671ff..4ed9d0a7e2 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl @@ -1,10 +1,11 @@ #version 330 -#include "../include/camera_uniform_declarations.glsl" +#include ../include/camera_uniform_declarations.glsl in vec3 point; in vec3 prev_point; in vec3 next_point; +in vec3 unit_normal; in float stroke_width; in vec4 color; @@ -13,20 +14,21 @@ in vec4 color; out vec3 bp; out vec3 prev_bp; out vec3 next_bp; +out vec3 v_global_unit_normal; out float v_stroke_width; out vec4 v_color; const float STROKE_WIDTH_CONVERSION = 0.01; -#include "../include/position_point_into_frame.glsl" +#include ../include/position_point_into_frame.glsl -void main() -{ +void main(){ bp = position_point_into_frame(point); prev_bp = position_point_into_frame(prev_point); next_bp = position_point_into_frame(next_point); + v_global_unit_normal = rotate_point_into_frame(unit_normal); - v_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width * frame_shape[1] / 8.0; + v_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width; v_color = color; } From 7dea0446d0a04d465a7abddba7ea0e72259fdd02 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Sun, 10 Sep 2023 22:51:36 +0200 Subject: [PATCH 031/106] Fixed frame_width and height usage, fix ibo to be i4 Co-authored-by: Jason Villanueva --- example_scenes/test_new.py | 4 +-- manim/renderer/opengl_renderer.py | 57 +++++++++++++++++-------------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index b21a3bbc1a..16bb0adb74 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -16,13 +16,13 @@ win = Window(width=1920, height=1080) renderer = OpenGLRenderer(1920, 1080) # vm = OpenGLVMobject([col.RED, col.GREEN]) - vm = Circle(radius=100) + vm = Circle(radius=1) # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) # print(vm.color) # print(vm.fill_color) # print(vm.stroke_color) - camera = OpenGLCameraFrame((1920, 1080), center_point=OUT * 10) + camera = OpenGLCameraFrame() renderer.set_camera(camera) for _ in range(4): diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index ad54e65856..f6ff8958e4 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -69,35 +69,43 @@ def __repr__(self) -> str: """ -def get_triangulation(vmobject: OpenGLVMobject): +def get_triangulation(self, normal_vector=None): # Figure out how to triangulate the interior to know # how to send the points as to the vertex shader. # First triangles come directly from the points - points = vmobject.points + if normal_vector is None: + normal_vector = self.get_unit_normal() - if len(points) <= 1: - vmobject.triangulation = np.zeros(0, dtype="i4") - vmobject.needs_new_triangulation = False - return vmobject.triangulation + if not self.needs_new_triangulation: + return self.triangulation - normal_vector = vmobject.get_unit_normal() - indices = np.arange(len(points), dtype=int) + points = self.points + + if len(points) <= 1: + self.triangulation = np.zeros(0, dtype="i4") + self.needs_new_triangulation = False + return self.triangulation - # Rotate points such that unit normal vector is OUT if not np.isclose(normal_vector, const.OUT).all(): + # Rotate points such that unit normal vector is OUT points = np.dot(points, z_to_vector(normal_vector)) + indices = np.arange(len(points), dtype=int) - atol = vmobject.tolerance_for_point_equality - end_of_loop = np.zeros(len(points) // 3, dtype=bool) - end_of_loop[:-1] = (np.abs(points[2:-3:3] - points[3::3]) > atol).any(1) - end_of_loop[-1] = True + b0s = points[0::3] + b1s = points[1::3] + b2s = points[2::3] + v01s = b1s - b0s + v12s = b2s - b1s + + crosses = cross2d(v01s, v12s) + convexities = np.sign(crosses) - v01s = points[1::3] - points[0::3] - v12s = points[2::3] - points[1::3] - curve_orientations = np.sign(cross2d(v01s, v12s)) - orientation = np.transpose([curve_orientations.repeat(3)]) + atol = self.tolerance_for_point_equality + end_of_loop = np.zeros(len(b0s), dtype=bool) + end_of_loop[:-1] = (np.abs(b2s[:-1] - b0s[1:]) > atol).any(1) + end_of_loop[-1] = True - concave_parts = curve_orientations < 0 + concave_parts = convexities < 0 # These are the vertices to which we'll apply a polygon triangulation inner_vert_indices = np.hstack( @@ -105,7 +113,7 @@ def get_triangulation(vmobject: OpenGLVMobject): indices[0::3], indices[1::3][concave_parts], indices[2::3][end_of_loop], - ] + ], ) inner_vert_indices.sort() rings = np.arange(1, len(inner_vert_indices) + 1)[inner_vert_indices % 3 == 2] @@ -115,7 +123,9 @@ def get_triangulation(vmobject: OpenGLVMobject): inner_tri_indices = inner_vert_indices[earclip_triangulation(inner_verts, rings)] tri_indices = np.hstack([indices, inner_tri_indices]) - return tri_indices, orientation + self.triangulation = tri_indices + self.needs_new_triangulation = False + return tri_indices def prepare_array(values: np.ndarray, desired_length: int): @@ -288,10 +298,7 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: logger.debug("Initializing GLRenderData") mob.renderer_data = GLRenderData() # Generate Mesh - ( - mob.renderer_data.vert_indices, - mob.renderer_data.orientation, - ) = get_triangulation(mob) + mob.renderer_data.vert_indices = get_triangulation(mob) points_length = len(mob.points) # Generate Fill Color @@ -333,7 +340,7 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: def render_shader(prog, mob, data): vbo = self.ctx.buffer(data.tobytes()) - ibo = self.ctx.buffer(mob.renderer_data.vert_indices) + ibo = self.ctx.buffer(mob.renderer_data.vert_indices.astype("i4").tobytes()) # print(prog,vbo,data) vert_format = gl.detect_format(prog, data.dtype.names) # print(vert_format) From d418acc865fe7afef197b02d1cb809eb2ac6c9d7 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Sun, 10 Sep 2023 23:45:42 +0200 Subject: [PATCH 032/106] Basic Rendering Vmobject works! Co-authored-by: Jason Villanueva --- example_scenes/test_new.py | 2 +- manim/renderer/opengl_renderer.py | 62 +++++++++++++++++-------------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index 16bb0adb74..aae722bc8d 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -16,7 +16,7 @@ win = Window(width=1920, height=1080) renderer = OpenGLRenderer(1920, 1080) # vm = OpenGLVMobject([col.RED, col.GREEN]) - vm = Circle(radius=1) + vm = Circle(radius=1,stroke_color=col.YELLOW,fill_opacity=1, fill_color=col.RED) # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) # print(vm.color) # print(vm.fill_color) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index f6ff8958e4..f6515dd134 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -239,24 +239,16 @@ def set_camera(self, camera: OpenGLCameraFrame) -> ImageType: self.vmobject_fill_program["light_source_position"] = (-10, 10, 10) # TODO: convert to singular 4x4 matrix after getting *something* to render # self.vmobject_fill_program['view'].value = camera.get_view()? - self.vmobject_stroke_program["is_fixed_in_frame"].value = 0.0 - self.vmobject_stroke_program["anti_alias_width"].value = 1.0 - self.vmobject_stroke_program["frame_shape"].value = np.asarray( - camera.frame_shape - ) + self.vmobject_stroke_program["is_fixed_in_frame"] = 0.0 + self.vmobject_stroke_program["anti_alias_width"] = 0.01977 + self.vmobject_stroke_program["frame_shape"] = camera.frame_shape # self.vmobject_stroke_program['pixel_shape'].value = camera.frame_shape - self.vmobject_stroke_program["focal_distance"].value = np.asarray( - camera.get_focal_distance() - ) - self.vmobject_stroke_program["camera_center"].value = np.asarray( - camera.get_center() - ) - self.vmobject_stroke_program["camera_rotation"].value = np.array( - camera.get_inverse_camera_rotation_matrix() - ).T.flatten() - self.vmobject_stroke_program["light_source_position"].value = np.array( - [-10, 10, 10] - ) + self.vmobject_stroke_program["focal_distance"] = camera.get_focal_distance() + self.vmobject_stroke_program["camera_center"] = camera.get_center() + self.vmobject_stroke_program[ + "camera_rotation" + ] = camera.get_inverse_camera_rotation_matrix().T.flatten() + self.vmobject_stroke_program["light_source_position"] = [-10, 10, 10] def get_stroke_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: if not isinstance(mob.renderer_data, GLRenderData): @@ -272,7 +264,7 @@ def get_stroke_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: stroke_data["next_point"][:-nppc] = points[nppc:] stroke_data["next_point"][-nppc:] = points[:nppc] stroke_data["color"] = mob.renderer_data.stroke_rgbas - stroke_data["stroke_width"] = mob.renderer_data.stroke_widths + stroke_data["stroke_width"] = mob.renderer_data.stroke_widths.reshape((-1, 1)) return stroke_data @@ -294,7 +286,7 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: if mob.renderer_data is None: # Initialize - # TODO: Intialize all the data also for submobjects + # TODO: Initialize all the data also for submobjects logger.debug("Initializing GLRenderData") mob.renderer_data = GLRenderData() # Generate Mesh @@ -338,9 +330,13 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: ) # TODO: This maybe breaks self.vmobject_stroke_program["flat_stroke"].value = mob.flat_stroke - def render_shader(prog, mob, data): + def render_shader(prog, mob, data, use_ibo): vbo = self.ctx.buffer(data.tobytes()) - ibo = self.ctx.buffer(mob.renderer_data.vert_indices.astype("i4").tobytes()) + ibo = ( + self.ctx.buffer(mob.renderer_data.vert_indices.astype("i4").tobytes()) + if use_ibo + else None + ) # print(prog,vbo,data) vert_format = gl.detect_format(prog, data.dtype.names) # print(vert_format) @@ -349,19 +345,31 @@ def render_shader(prog, mob, data): content=[(vbo, vert_format, *data.dtype.names)], index_buffer=ibo, ) - self.target_fbo.use() - self.target_fbo.clear(*self.background_color) + vao.render(gl.TRIANGLES) vbo.release() - ibo.release() + if use_ibo: + ibo.release() vao.release() # print(self.get_fill_shader_data(mob)) self.ctx.enable(gl.BLEND) - self.ctx.enable(gl.DEPTH_TEST) + self.ctx.blend_func = ( + gl.SRC_ALPHA, + gl.ONE_MINUS_SRC_ALPHA, + gl.ONE, + gl.ONE, + ) + # self.ctx.enable(gl.DEPTH_TEST) - render_shader(self.vmobject_fill_program, mob, self.get_fill_shader_data(mob)) - # render_shader(self.vmobject_stroke_program, mob, stroke_dtype, self.get_stroke_shader_data(mob)) + self.target_fbo.use() + self.target_fbo.clear(*self.background_color) + render_shader( + self.vmobject_fill_program, mob, self.get_fill_shader_data(mob), True + ) + render_shader( + self.vmobject_stroke_program, mob, self.get_stroke_shader_data(mob), False + ) # print(self.target_fbo.read()) self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo) # Image.frombytes('RGBA', self.output_fbo.size, self.output_fbo.read(components=4), 'raw', 'RGBA', 0, -1).show() From 1a821d7013e844c62e3deda95fb53da6c7ecea0e Mon Sep 17 00:00:00 2001 From: MrDiver Date: Mon, 11 Sep 2023 01:17:49 +0200 Subject: [PATCH 033/106] nothing rendering again Co-authored-by: Jason Villanueva --- example_scenes/test_new.py | 16 +++- manim/mobject/opengl/opengl_mobject.py | 2 +- .../opengl/opengl_vectorized_mobject.py | 3 +- manim/renderer/opengl_renderer.py | 79 ++++++++++--------- manim/renderer/renderer.py | 27 ++++--- 5 files changed, 75 insertions(+), 52 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index aae722bc8d..92e3109002 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -1,13 +1,16 @@ import time +from PIL import Image from pyglet.gl import Config from pyglet.window import Window import manim.utils.color.manim_colors as col from manim._config import tempconfig from manim.camera.camera import OpenGLCamera, OpenGLCameraFrame -from manim.constants import OUT +from manim.constants import OUT, RIGHT from manim.mobject.geometry.arc import Circle +from manim.mobject.geometry.polygram import Square +from manim.mobject.logo import ManimBanner from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.renderer.opengl_renderer import OpenGLRenderer @@ -16,7 +19,11 @@ win = Window(width=1920, height=1080) renderer = OpenGLRenderer(1920, 1080) # vm = OpenGLVMobject([col.RED, col.GREEN]) - vm = Circle(radius=1,stroke_color=col.YELLOW,fill_opacity=1, fill_color=col.RED) + vm = Circle( + radius=1, stroke_color=col.YELLOW, fill_opacity=1, fill_color=col.RED + ).shift(RIGHT) + vm2 = Square(stroke_color=col.GREEN, fill_opacity=0, stroke_opacity=1) + # vm3 = ManimBanner() # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) # print(vm.color) # print(vm.fill_color) @@ -25,8 +32,11 @@ camera = OpenGLCameraFrame() renderer.set_camera(camera) + image = renderer.render(camera, [vm, vm2]) + # print(image.shape) + # Image.fromarray(image,"RGBA").show() for _ in range(4): - renderer.render_vmobject(vm) + image = renderer.render(camera, [vm, vm2]) win.dispatch_events() win.flip() time.sleep(1) diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index f212295704..005dbdc551 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -426,7 +426,7 @@ def apply_points_function( about_point=None, about_edge=ORIGIN, works_on_bounding_box=False, - ): + ) -> Self: if about_point is None and about_edge is not None: about_point = self.get_bounding_box_point(about_edge) diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 84354df619..cb016e00de 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -58,8 +58,9 @@ def triggers_refreshed_triangulation(func: Callable): @wraps(func) def wrapper(self, *args, **kwargs): - func(self, *args, **kwargs) + res = func(self, *args, **kwargs) self.refresh_triangulation() + return res return wrapper diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index f6515dd134..1aa30afc1b 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -5,7 +5,6 @@ import moderngl as gl import numpy as np -from PIL import Image from typing_extensions import override import manim.constants as const @@ -190,7 +189,9 @@ def __init__( background_color: c.ManimColor = color.BLACK, background_opacity: float = 1.0, background_image: str | None = None, + substitute_output_fbo: gl.Framebuffer | None = None, ) -> None: + super().__init__() logger.debug("Initializing OpenGLRenderer") self.pixel_width = pixel_width self.pixel_height = pixel_height @@ -204,18 +205,19 @@ def __init__( logger.debug("Initializing OpenGL context and framebuffers") self.ctx = gl.create_context() self.target_fbo = self.ctx.simple_framebuffer( - (self.pixel_width, self.pixel_height), samples=self.samples + (self.pixel_width, self.pixel_height), + samples=self.samples, + dtype="f4", + components=4, ) - fbo = self.ctx.detect_framebuffer() - if not fbo: - self.output_fbo = self.ctx.framebuffer( - color_attachments=[ - self.ctx.renderbuffer((self.pixel_width, self.pixel_height)) - ] - ) - else: - self.output_fbo = fbo + self.output_fbo = self.ctx.framebuffer( + color_attachments=[ + self.ctx.renderbuffer( + (self.pixel_width, self.pixel_height), dtype="f4", components=4 + ) + ] + ) # Preparing vmobject shader logger.debug("Initializing Shader Programs") @@ -226,6 +228,10 @@ def __init__( self.ctx, "quadratic_bezier_stroke" ) + def substitute_fbo(self): + self.output_fbo.release() + self.output_fbo = self.ctx.detect_framebuffer() + def set_camera(self, camera: OpenGLCameraFrame) -> ImageType: self.vmobject_fill_program["is_fixed_in_frame"] = 0.0 self.vmobject_fill_program["frame_shape"] = camera.frame_shape @@ -280,7 +286,18 @@ def get_fill_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: fill_data["vert_index"] = np.reshape(range(len(mob.points)), (-1, 1)) return fill_data - @override + def render(self, camera, renderables: list[OpenGLVMobject]) -> ImageType: + self.set_camera(camera=camera) + self.target_fbo.use() + self.target_fbo.clear(*self.background_color) + + super().render(camera, renderables) + + self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo) + # from PIL import Image + # Image.frombytes('RGB', self.output_fbo.size, self.output_fbo.read(), 'raw', 'RGB', 0, -1).show() + return self.get_pixels() + def render_vmobject(self, mob: OpenGLVMobject) -> None: # Setting camera uniforms @@ -307,10 +324,6 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: mob.renderer_data.bounding_box = compute_bounding_box(mob) print(mob.renderer_data) - # print(mob.renderer_data.mesh) - # print(mob.renderer_data.orientation) - # print(mob.points) - # if mob.colors_changed: # mob.renderer_data.fill_rgbas = np.resize(mob.fill_color, (len(mob.renderer_data.mesh),4)) @@ -352,36 +365,28 @@ def render_shader(prog, mob, data, use_ibo): ibo.release() vao.release() - # print(self.get_fill_shader_data(mob)) self.ctx.enable(gl.BLEND) - self.ctx.blend_func = ( - gl.SRC_ALPHA, - gl.ONE_MINUS_SRC_ALPHA, - gl.ONE, - gl.ONE, - ) + # self.ctx.blend_func = ( + # gl.SRC_ALPHA, + # gl.ONE_MINUS_SRC_ALPHA, + # gl.ONE, + # gl.ONE, + # ) # self.ctx.enable(gl.DEPTH_TEST) - - self.target_fbo.use() - self.target_fbo.clear(*self.background_color) + # TODO: Handle Submobjects render_shader( self.vmobject_fill_program, mob, self.get_fill_shader_data(mob), True ) render_shader( self.vmobject_stroke_program, mob, self.get_stroke_shader_data(mob), False ) - # print(self.target_fbo.read()) - self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo) - # Image.frombytes('RGBA', self.output_fbo.size, self.output_fbo.read(components=4), 'raw', 'RGBA', 0, -1).show() - # set shader - # use vbo - # render fill - - # set shader - # use vbo - # render stroke - # self.fbo ... + def get_pixels(self) -> ImageType: + raw = self.output_fbo.read(components=4, dtype="f4") # RGBA, floats + buf = np.frombuffer(raw, dtype="f4").reshape( + (self.pixel_height, self.pixel_width, 4) + ) + return buf # def init_frame(self, **config) -> None: diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index f3198cd809..0530bcd268 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -5,6 +5,7 @@ from typing_extensions import TypeAlias from manim import config +from manim._config import logger from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.mobject.types.image_mobject import ImageMobject from manim.mobject.types.vectorized_mobject import VMobject @@ -18,20 +19,23 @@ class RendererData: class Renderer(ABC): def __init__(self): - self.fbo = np.zeros((config.height, config.width)) - self.capabilities = { - VMobject: self.render_vmobject, - ImageMobject: self.render_image, - } + self.capabilities = [ + (OpenGLVMobject, self.render_vmobject), + (ImageMobject, self.render_image), + ] - def render(self, camera, renderables: [VMobject]) -> ImageType: # Image + def render(self, camera, renderables: list[OpenGLVMobject]) -> ImageType: # Image for mob in renderables: - if type(mob) in self.capabilities: - self.capabilities[type(mob)](mob) + for type, render_func in self.capabilities: + if isinstance(mob, type): + render_func(mob) + break else: - print("WARNING: NOT SUPPORTED") + logger.warn( + f"The type{type(mob)} is not supported in Renderer: {self.__class__}" + ) - return self.fbo.get_pixels() + return self.get_pixels() @abstractclassmethod def render_vmobject(self, mob: OpenGLVMobject) -> None: @@ -43,6 +47,9 @@ def render_mesh(self, mob) -> None: def render_image(self, mob) -> None: raise NotImplementedError + def get_pixels(self) -> ImageType: + raise NotImplementedError + # NOTE: The user should expect depth between renderers not to be handled discussed at 03.09.2023 Between jsonv and MrDiver # NOTE: Cairo_camera overlay_PIL_image for MultiRenderer From 9a94781cf1d545c07ddbb42954ce664e95964a3b Mon Sep 17 00:00:00 2001 From: MrDiver Date: Mon, 11 Sep 2023 01:29:00 +0200 Subject: [PATCH 034/106] change dtype to f1 float 1 byte --- manim/renderer/opengl_renderer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 1aa30afc1b..cd3c77c8ca 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -207,14 +207,14 @@ def __init__( self.target_fbo = self.ctx.simple_framebuffer( (self.pixel_width, self.pixel_height), samples=self.samples, - dtype="f4", + dtype="f1", components=4, ) self.output_fbo = self.ctx.framebuffer( color_attachments=[ self.ctx.renderbuffer( - (self.pixel_width, self.pixel_height), dtype="f4", components=4 + (self.pixel_width, self.pixel_height), dtype="f1", components=4 ) ] ) From 5a7da79631a2e2958ad15107048435ab7f2f01b8 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Mon, 11 Sep 2023 02:25:29 +0200 Subject: [PATCH 035/106] Working window rendering with events --- example_scenes/test_new.py | 41 ++++++++++++++++++++++++++++--- manim/renderer/opengl_renderer.py | 16 +++++------- manim/renderer/renderer.py | 9 ++++++- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index 92e3109002..e7d4cdee5c 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -1,8 +1,10 @@ import time from PIL import Image +import pyglet from pyglet.gl import Config from pyglet.window import Window +from pyglet import shapes import manim.utils.color.manim_colors as col from manim._config import tempconfig @@ -14,10 +16,12 @@ from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.renderer.opengl_renderer import OpenGLRenderer + if __name__ == "__main__": with tempconfig({"renderer": "opengl"}): win = Window(width=1920, height=1080) renderer = OpenGLRenderer(1920, 1080) + renderer.use_window_fbo() # vm = OpenGLVMobject([col.RED, col.GREEN]) vm = Circle( radius=1, stroke_color=col.YELLOW, fill_opacity=1, fill_color=col.RED @@ -30,13 +34,42 @@ # print(vm.stroke_color) camera = OpenGLCameraFrame() - renderer.set_camera(camera) + renderer.init_camera(camera) - image = renderer.render(camera, [vm, vm2]) + # image = renderer.render(camera, [vm, vm2]) # print(image.shape) # Image.fromarray(image,"RGBA").show() - for _ in range(4): + + label = pyglet.text.Label('Hello, world', + font_name='Times New Roman', + font_size=36, + x=0, y=0, + anchor_x='center', anchor_y='center') + + @win.event + def on_close(): + win.close() + pass + + @win.event + def on_mouse_motion(x, y, dx, dy): + vm.move_to((14.2222*(x/1920-0.5),8*(y/1080-0.5),0)) + vm.set_color(col.RED.interpolate(col.GREEN,x/1920)) + # print(x,y) + + @win.event + def on_draw(): image = renderer.render(camera, [vm, vm2]) + pass + + @win.event + def on_resize(width,height): + pass + + while True: + pyglet.clock.tick() + pyglet.app.platform_event_loop.step() + win.switch_to() + win.dispatch_event('on_draw') win.dispatch_events() win.flip() - time.sleep(1) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index cd3c77c8ca..540e3f55a7 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -228,11 +228,11 @@ def __init__( self.ctx, "quadratic_bezier_stroke" ) - def substitute_fbo(self): + def use_window_fbo(self): self.output_fbo.release() self.output_fbo = self.ctx.detect_framebuffer() - def set_camera(self, camera: OpenGLCameraFrame) -> ImageType: + def init_camera(self, camera: OpenGLCameraFrame) -> ImageType: self.vmobject_fill_program["is_fixed_in_frame"] = 0.0 self.vmobject_fill_program["frame_shape"] = camera.frame_shape self.vmobject_fill_program["focal_distance"] = float( @@ -286,17 +286,13 @@ def get_fill_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: fill_data["vert_index"] = np.reshape(range(len(mob.points)), (-1, 1)) return fill_data - def render(self, camera, renderables: list[OpenGLVMobject]) -> ImageType: - self.set_camera(camera=camera) + def pre_render(self, camera): + self.init_camera(camera=camera) self.target_fbo.use() self.target_fbo.clear(*self.background_color) - super().render(camera, renderables) - + def post_render(self): self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo) - # from PIL import Image - # Image.frombytes('RGB', self.output_fbo.size, self.output_fbo.read(), 'raw', 'RGB', 0, -1).show() - return self.get_pixels() def render_vmobject(self, mob: OpenGLVMobject) -> None: # Setting camera uniforms @@ -322,7 +318,7 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: [mob.get_unit_normal()], points_length, axis=0 ) mob.renderer_data.bounding_box = compute_bounding_box(mob) - print(mob.renderer_data) + # print(mob.renderer_data) # if mob.colors_changed: # mob.renderer_data.fill_rgbas = np.resize(mob.fill_color, (len(mob.renderer_data.mesh),4)) diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index 0530bcd268..1d1bf5595a 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -25,6 +25,7 @@ def __init__(self): ] def render(self, camera, renderables: list[OpenGLVMobject]) -> ImageType: # Image + self.pre_render(camera) for mob in renderables: for type, render_func in self.capabilities: if isinstance(mob, type): @@ -34,9 +35,15 @@ def render(self, camera, renderables: list[OpenGLVMobject]) -> ImageType: # Ima logger.warn( f"The type{type(mob)} is not supported in Renderer: {self.__class__}" ) - + self.post_render() return self.get_pixels() + def pre_render(self, camera): + raise NotImplementedError + + def post_render(self): + raise NotImplementedError + @abstractclassmethod def render_vmobject(self, mob: OpenGLVMobject) -> None: raise NotImplementedError From b7fe84d6c89bc8cddf0310714366fc779dc4e14d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 00:26:08 +0000 Subject: [PATCH 036/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- example_scenes/test_new.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index e7d4cdee5c..02fa3428ba 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -1,10 +1,10 @@ import time -from PIL import Image import pyglet +from PIL import Image +from pyglet import shapes from pyglet.gl import Config from pyglet.window import Window -from pyglet import shapes import manim.utils.color.manim_colors as col from manim._config import tempconfig @@ -16,7 +16,6 @@ from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.renderer.opengl_renderer import OpenGLRenderer - if __name__ == "__main__": with tempconfig({"renderer": "opengl"}): win = Window(width=1920, height=1080) @@ -40,11 +39,15 @@ # print(image.shape) # Image.fromarray(image,"RGBA").show() - label = pyglet.text.Label('Hello, world', - font_name='Times New Roman', - font_size=36, - x=0, y=0, - anchor_x='center', anchor_y='center') + label = pyglet.text.Label( + "Hello, world", + font_name="Times New Roman", + font_size=36, + x=0, + y=0, + anchor_x="center", + anchor_y="center", + ) @win.event def on_close(): @@ -53,8 +56,8 @@ def on_close(): @win.event def on_mouse_motion(x, y, dx, dy): - vm.move_to((14.2222*(x/1920-0.5),8*(y/1080-0.5),0)) - vm.set_color(col.RED.interpolate(col.GREEN,x/1920)) + vm.move_to((14.2222 * (x / 1920 - 0.5), 8 * (y / 1080 - 0.5), 0)) + vm.set_color(col.RED.interpolate(col.GREEN, x / 1920)) # print(x,y) @win.event @@ -63,13 +66,13 @@ def on_draw(): pass @win.event - def on_resize(width,height): + def on_resize(width, height): pass while True: pyglet.clock.tick() pyglet.app.platform_event_loop.step() win.switch_to() - win.dispatch_event('on_draw') + win.dispatch_event("on_draw") win.dispatch_events() win.flip() From f73b35d86cc64e4a8132481dbc054cc1c633b835 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Mon, 11 Sep 2023 03:41:32 +0200 Subject: [PATCH 037/106] Working render to numpy array --- example_scenes/test_new.py | 21 ++++++++------------- manim/renderer/opengl_renderer.py | 18 ++++++++---------- manim/renderer/renderer.py | 3 +-- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index e7d4cdee5c..d4fbd1b5e9 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -19,9 +19,7 @@ if __name__ == "__main__": with tempconfig({"renderer": "opengl"}): - win = Window(width=1920, height=1080) renderer = OpenGLRenderer(1920, 1080) - renderer.use_window_fbo() # vm = OpenGLVMobject([col.RED, col.GREEN]) vm = Circle( radius=1, stroke_color=col.YELLOW, fill_opacity=1, fill_color=col.RED @@ -36,16 +34,13 @@ camera = OpenGLCameraFrame() renderer.init_camera(camera) - # image = renderer.render(camera, [vm, vm2]) - # print(image.shape) - # Image.fromarray(image,"RGBA").show() - - label = pyglet.text.Label('Hello, world', - font_name='Times New Roman', - font_size=36, - x=0, y=0, - anchor_x='center', anchor_y='center') - + renderer.render(camera, [vm, vm2]) + image = renderer.get_pixels() + print(image.shape) + Image.fromarray(image,'RGBA').show() + exit(0) + win = Window(width=1920, height=1080,vsync=True, config= Config(double_buffer=True,samples=4)) + renderer.use_window_fbo() @win.event def on_close(): win.close() @@ -54,7 +49,7 @@ def on_close(): @win.event def on_mouse_motion(x, y, dx, dy): vm.move_to((14.2222*(x/1920-0.5),8*(y/1080-0.5),0)) - vm.set_color(col.RED.interpolate(col.GREEN,x/1920)) + # vm.set_color(col.RED.interpolate(col.GREEN,x/1920)) # print(x,y) @win.event diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 540e3f55a7..2a2c0f7b9a 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -362,12 +362,12 @@ def render_shader(prog, mob, data, use_ibo): vao.release() self.ctx.enable(gl.BLEND) - # self.ctx.blend_func = ( - # gl.SRC_ALPHA, - # gl.ONE_MINUS_SRC_ALPHA, - # gl.ONE, - # gl.ONE, - # ) + self.ctx.blend_func = ( + gl.SRC_ALPHA, + gl.ONE_MINUS_SRC_ALPHA, + gl.ONE, + gl.ONE, + ) # self.ctx.enable(gl.DEPTH_TEST) # TODO: Handle Submobjects render_shader( @@ -378,10 +378,8 @@ def render_shader(prog, mob, data, use_ibo): ) def get_pixels(self) -> ImageType: - raw = self.output_fbo.read(components=4, dtype="f4") # RGBA, floats - buf = np.frombuffer(raw, dtype="f4").reshape( - (self.pixel_height, self.pixel_width, 4) - ) + raw = self.output_fbo.read(components=4, dtype='f1',clamp=True) # RGBA, floats + buf = np.frombuffer(raw, dtype=np.uint8).reshape((1080,1920,-1)) return buf diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index 1d1bf5595a..0373ab14f4 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -24,7 +24,7 @@ def __init__(self): (ImageMobject, self.render_image), ] - def render(self, camera, renderables: list[OpenGLVMobject]) -> ImageType: # Image + def render(self, camera, renderables: list[OpenGLVMobject])->None : # Image self.pre_render(camera) for mob in renderables: for type, render_func in self.capabilities: @@ -36,7 +36,6 @@ def render(self, camera, renderables: list[OpenGLVMobject]) -> ImageType: # Ima f"The type{type(mob)} is not supported in Renderer: {self.__class__}" ) self.post_render() - return self.get_pixels() def pre_render(self, camera): raise NotImplementedError From d9dd887cb18c01d4a1fb3e37c134aec5444fd460 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 01:44:01 +0000 Subject: [PATCH 038/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- example_scenes/test_new.py | 12 +++++++++--- manim/renderer/opengl_renderer.py | 4 ++-- manim/renderer/renderer.py | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index e28da4a250..00c674c66a 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -36,10 +36,16 @@ renderer.render(camera, [vm, vm2]) image = renderer.get_pixels() print(image.shape) - Image.fromarray(image,'RGBA').show() + Image.fromarray(image, "RGBA").show() exit(0) - win = Window(width=1920, height=1080,vsync=True, config= Config(double_buffer=True,samples=4)) + win = Window( + width=1920, + height=1080, + vsync=True, + config=Config(double_buffer=True, samples=4), + ) renderer.use_window_fbo() + @win.event def on_close(): win.close() @@ -47,7 +53,7 @@ def on_close(): @win.event def on_mouse_motion(x, y, dx, dy): - vm.move_to((14.2222*(x/1920-0.5),8*(y/1080-0.5),0)) + vm.move_to((14.2222 * (x / 1920 - 0.5), 8 * (y / 1080 - 0.5), 0)) # vm.set_color(col.RED.interpolate(col.GREEN,x/1920)) # print(x,y) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 2a2c0f7b9a..71bd03420c 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -378,8 +378,8 @@ def render_shader(prog, mob, data, use_ibo): ) def get_pixels(self) -> ImageType: - raw = self.output_fbo.read(components=4, dtype='f1',clamp=True) # RGBA, floats - buf = np.frombuffer(raw, dtype=np.uint8).reshape((1080,1920,-1)) + raw = self.output_fbo.read(components=4, dtype="f1", clamp=True) # RGBA, floats + buf = np.frombuffer(raw, dtype=np.uint8).reshape((1080, 1920, -1)) return buf diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index 0373ab14f4..87ba0a9cae 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -24,7 +24,7 @@ def __init__(self): (ImageMobject, self.render_image), ] - def render(self, camera, renderables: list[OpenGLVMobject])->None : # Image + def render(self, camera, renderables: list[OpenGLVMobject]) -> None: # Image self.pre_render(camera) for mob in renderables: for type, render_func in self.capabilities: From 388604b3f73a876138830616902076c5d584ace6 Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Tue, 12 Sep 2023 05:08:11 +0200 Subject: [PATCH 039/106] Submobject rendering and further abstraction - WIP for stroke early drop --- example_scenes/test_new.py | 45 +++- manim/mobject/opengl/opengl_mobject.py | 17 +- .../opengl/opengl_vectorized_mobject.py | 4 +- manim/renderer/opengl_renderer.py | 253 ++++++++++-------- manim/renderer/renderer.py | 3 + .../shaders/include/finalize_color.glsl | 3 +- .../shaders/include/get_gl_Position.glsl | 6 +- .../shaders/quadratic_bezier_fill/frag.glsl | 4 + .../shaders/quadratic_bezier_fill/geom.glsl | 1 + .../shaders/quadratic_bezier_stroke/frag.glsl | 17 +- .../shaders/quadratic_bezier_stroke/geom.glsl | 12 +- 11 files changed, 225 insertions(+), 140 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index 00c674c66a..6ec81e5a76 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -5,61 +5,78 @@ from pyglet import shapes from pyglet.gl import Config from pyglet.window import Window - +import numpy as np import manim.utils.color.manim_colors as col from manim._config import tempconfig from manim.camera.camera import OpenGLCamera, OpenGLCameraFrame -from manim.constants import OUT, RIGHT +from manim.constants import OUT, RIGHT, UP from manim.mobject.geometry.arc import Circle from manim.mobject.geometry.polygram import Square from manim.mobject.logo import ManimBanner from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.renderer.opengl_renderer import OpenGLRenderer +from manim._config import config if __name__ == "__main__": with tempconfig({"renderer": "opengl"}): - renderer = OpenGLRenderer(1920, 1080) + renderer = OpenGLRenderer(1920, 1080, background_color=col.GRAY) # vm = OpenGLVMobject([col.RED, col.GREEN]) vm = Circle( radius=1, stroke_color=col.YELLOW, fill_opacity=1, fill_color=col.RED ).shift(RIGHT) - vm2 = Square(stroke_color=col.GREEN, fill_opacity=0, stroke_opacity=1) - # vm3 = ManimBanner() + vm2 = Square(stroke_color=col.GREEN, fill_opacity=0, stroke_opacity=1).move_to((0,0,-0.5)) + vm3 = ManimBanner() # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) # print(vm.color) # print(vm.fill_color) # print(vm.stroke_color) camera = OpenGLCameraFrame() + camera.save_state() renderer.init_camera(camera) - renderer.render(camera, [vm, vm2]) - image = renderer.get_pixels() - print(image.shape) - Image.fromarray(image, "RGBA").show() - exit(0) + # renderer.render(camera, [vm, vm2]) + # image = renderer.get_pixels() + # print(image.shape) + # Image.fromarray(image, "RGBA").show() + # exit(0) win = Window( width=1920, height=1080, vsync=True, config=Config(double_buffer=True, samples=4), ) - renderer.use_window_fbo() + renderer.use_window() + + vm.apply_depth_test() + vm2.apply_depth_test() + vm3.apply_depth_test() + clock = pyglet.clock.get_default() + def update_circle(dt): + vm.move_to((np.sin(dt), np.cos(dt), -1)) + clock.schedule(update_circle) + + def p2m(x,y,z): + from manim._config import config + return (config.frame_width*(x/config.pixel_width-0.5), config.frame_height*(y/config.pixel_height-0.5),z) + @win.event def on_close(): win.close() - pass @win.event def on_mouse_motion(x, y, dx, dy): - vm.move_to((14.2222 * (x / 1920 - 0.5), 8 * (y / 1080 - 0.5), 0)) + # vm.move_to((14.2222 * (x / 1920 - 0.5), 8 * (y / 1080 - 0.5), 0)) + #camera.move_to(p2m(x,y,camera.get_center()[2])) + from scipy.spatial.transform import Rotation + camera.set_orientation(Rotation.from_rotvec((-UP*(x/1920-0.5)+RIGHT*(y/1080-0.5))*2*3.1415)) # vm.set_color(col.RED.interpolate(col.GREEN,x/1920)) # print(x,y) @win.event def on_draw(): - image = renderer.render(camera, [vm, vm2]) + renderer.render(camera, [vm, vm2, vm3]) pass @win.event diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index 005dbdc551..9ef0f1f2bd 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -1,6 +1,7 @@ from __future__ import annotations import copy +from dataclasses import dataclass import itertools as it import numbers import os @@ -51,8 +52,8 @@ from typing_extensions import Self, TypeAlias - TimeBasedUpdater: TypeAlias = Callable[[OpenGLMobject, float], OpenGLMobject | None] - NonTimeUpdater: TypeAlias = Callable[[OpenGLMobject], OpenGLMobject | None] + TimeBasedUpdater: TypeAlias = Callable[["OpenGLMobject", float], "OpenGLMobject" | None] + NonTimeUpdater: TypeAlias = Callable[["OpenGLMobject"], "OpenGLMobject" | None] Updater: TypeAlias = Union[TimeBasedUpdater, NonTimeUpdater] PointUpdateFunction: TypeAlias = Callable[[np.ndarray], np.ndarray] from manim.renderer.renderer import RendererData @@ -90,6 +91,13 @@ def wrapper(self): return wrapper +@dataclass +class MobjectStatus: + color_changed: bool = False + position_changed: bool = False + rotation_changed: bool = False + scale_changed: bool = False + points_changed: bool = False class OpenGLMobject: """Mathematical Object: base class for objects that can be displayed on screen. @@ -123,6 +131,7 @@ def __init__( gloss: float = 0.0, texture_paths: dict[str, str] | None = None, is_fixed_in_frame: bool = False, + is_fixed_orientation: bool = False, depth_test: bool = False, name: str | None = None, **kwargs, @@ -134,6 +143,7 @@ def __init__( self.gloss = gloss self.texture_paths = texture_paths self.is_fixed_in_frame = is_fixed_in_frame + self.is_fixed_orientation = is_fixed_orientation self.depth_test = depth_test self.name = self.__class__.__name__ if name is None else name @@ -151,8 +161,7 @@ def __init__( self.uniforms: dict[str, float | np.ndarray] = {} self.renderer_data: T | None = None - self.colors_changed: bool = False - self.points_changed: bool = False + self.status = MobjectStatus() self.init_data() self.init_uniforms() diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index cb016e00de..32e5a8194d 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -456,10 +456,10 @@ def get_color(self) -> str: def has_stroke(self) -> bool: # TODO: This currently doesn't make sense needs fixing - return any(self.data["stroke_width"]) and any(self.data["stroke_rgba"][:, 3]) + return self.stroke_width>0 and any(self.get_stroke_opacities()) def has_fill(self) -> bool: - return any(self.data["fill_rgba"][:, 3]) + return any(self.get_fill_opacities()) def get_opacity(self) -> float: if self.has_fill(): diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 71bd03420c..4d47adcea8 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -26,7 +26,6 @@ fill_dtype = [ ("point", np.float32, (3,)), - # ("orientation", np.float32, (3,)), ("unit_normal", np.float32, (3,)), ("color", np.float32, (4,)), ("vert_index", np.float32, (1,)), @@ -178,6 +177,24 @@ def compute_bounding_box(mob): return np.array([mins, mids, maxs]) +class ProgramManager: + @staticmethod + def get_available_uniforms(prog): + names = [] + for name in prog: + member = prog[name] + if isinstance(member, gl.Uniform): + names.append(name) + + @staticmethod + def write_uniforms(prog, uniforms): + for name in prog: + member = prog[name] + if isinstance(member, gl.Uniform): + if name in uniforms: + member.value = uniforms[name] + + class OpenGLRenderer(Renderer): pixel_array_dtype = np.uint8 @@ -198,24 +215,23 @@ def __init__( self.samples = samples self.background_color = background_color.to_rgba() self.background_image = background_image - self.rgb_max_val: float = np.iinfo(self.pixel_array_dtype).max # Initializing Context logger.debug("Initializing OpenGL context and framebuffers") self.ctx = gl.create_context() - self.target_fbo = self.ctx.simple_framebuffer( - (self.pixel_width, self.pixel_height), - samples=self.samples, - dtype="f1", - components=4, + + self.stencil_texture = self.ctx.texture((self.pixel_width, self.pixel_height), components=4,dtype='f1') + self.target_fbo = self.ctx.framebuffer( + color_attachments=[self.ctx.renderbuffer((self.pixel_width, self.pixel_height), components=4,samples=4,dtype='f1')] + ,depth_attachment=self.ctx.depth_texture((self.pixel_width, self.pixel_height), samples=4) ) self.output_fbo = self.ctx.framebuffer( color_attachments=[ self.ctx.renderbuffer( (self.pixel_width, self.pixel_height), dtype="f1", components=4 - ) + ), ] ) @@ -228,33 +244,25 @@ def __init__( self.ctx, "quadratic_bezier_stroke" ) - def use_window_fbo(self): + def use_window(self): self.output_fbo.release() self.output_fbo = self.ctx.detect_framebuffer() - def init_camera(self, camera: OpenGLCameraFrame) -> ImageType: - self.vmobject_fill_program["is_fixed_in_frame"] = 0.0 - self.vmobject_fill_program["frame_shape"] = camera.frame_shape - self.vmobject_fill_program["focal_distance"] = float( - camera.get_focal_distance() - ) - self.vmobject_fill_program["camera_center"] = tuple(camera.get_center()) - self.vmobject_fill_program["camera_rotation"] = tuple( + def init_camera(self, camera: OpenGLCameraFrame): + uniforms = dict() + uniforms["frame_shape"] = camera.frame_shape + uniforms['pixel_shape'] = (self.pixel_width,self.pixel_height) + uniforms["focal_distance"] = camera.get_focal_distance() + uniforms["camera_center"] = tuple(camera.get_center()) + uniforms["camera_rotation"] = tuple( np.array(camera.get_inverse_camera_rotation_matrix()).T.flatten() ) - self.vmobject_fill_program["light_source_position"] = (-10, 10, 10) + uniforms["light_source_position"] = (-10, 10, 10) + uniforms["anti_alias_width"] = 0.01977 # TODO: convert to singular 4x4 matrix after getting *something* to render # self.vmobject_fill_program['view'].value = camera.get_view()? - self.vmobject_stroke_program["is_fixed_in_frame"] = 0.0 - self.vmobject_stroke_program["anti_alias_width"] = 0.01977 - self.vmobject_stroke_program["frame_shape"] = camera.frame_shape - # self.vmobject_stroke_program['pixel_shape'].value = camera.frame_shape - self.vmobject_stroke_program["focal_distance"] = camera.get_focal_distance() - self.vmobject_stroke_program["camera_center"] = camera.get_center() - self.vmobject_stroke_program[ - "camera_rotation" - ] = camera.get_inverse_camera_rotation_matrix().T.flatten() - self.vmobject_stroke_program["light_source_position"] = [-10, 10, 10] + ProgramManager.write_uniforms(self.vmobject_fill_program, uniforms) + ProgramManager.write_uniforms(self.vmobject_stroke_program, uniforms) def get_stroke_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: if not isinstance(mob.renderer_data, GLRenderData): @@ -286,96 +294,88 @@ def get_fill_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: fill_data["vert_index"] = np.reshape(range(len(mob.points)), (-1, 1)) return fill_data + def copy_frame_to_stencil(self): + self.stencil_texture = self.target_fbo.depth_attachment + def pre_render(self, camera): self.init_camera(camera=camera) self.target_fbo.use() self.target_fbo.clear(*self.background_color) + self.copy_frame_to_stencil() def post_render(self): self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo) - def render_vmobject(self, mob: OpenGLVMobject) -> None: + def render_program(self, prog, data, indices = None): + vbo = self.ctx.buffer(data.tobytes()) + ibo = self.ctx.buffer(np.asarray(indices).astype("i4").tobytes()) if indices is not None else None + # print(prog,vbo,data) + vert_format = gl.detect_format(prog, data.dtype.names) + # print(vert_format) + vao = self.ctx.vertex_array( + program=prog, + content=[(vbo, vert_format, *data.dtype.names)], + index_buffer=ibo, + ) + + vao.render(gl.TRIANGLES) + vbo.release() + if ibo is not None: + ibo.release() + vao.release() + + def render_vmobject(self, mob: OpenGLVMobject) -> None: #type: ignore # Setting camera uniforms + counter = 0 + num_mobs = len(mob.family_members_with_points()) + for sub in mob.family_members_with_points(): + if sub.renderer_data is None: + # Initialize + GLVMobjectManager.init_render_data(sub) + + if not isinstance(sub.renderer_data, GLRenderData): + return + + # if mob.colors_changed: + + # mob.renderer_data.fill_rgbas = np.resize(mob.fill_color, (len(mob.renderer_data.mesh),4)) + + # if mob.points_changed:3357 + # if(mob.has_fill()): + # mob.renderer_data.mesh = ... # Triangulation todo + + # self.ctx.enable(gl.CULL_FACE) + self.ctx.enable(gl.BLEND) #type: ignore + # TODO: Because the Triangulation is messing up the normals this won't work + # self.ctx.blend_func = ( #type: ignore + # gl.SRC_ALPHA, + # gl.ONE_MINUS_SRC_ALPHA, + # gl.ONE, + # gl.ONE, + # ) + if sub.depth_test: + self.ctx.enable(gl.DEPTH_TEST) #type: ignore + else: + self.ctx.disable(gl.DEPTH_TEST) #type: ignore + uniforms = GLVMobjectManager.read_uniforms(sub) + uniforms['z_shift'] = counter/9 + if sub.has_fill(): + ProgramManager.write_uniforms(self.vmobject_fill_program, uniforms) + self.render_program( + self.vmobject_fill_program, self.get_fill_shader_data(sub), sub.renderer_data.vert_indices + ) + uniforms["z_shift"] -= 1/20 + + self.copy_frame_to_stencil() + self.stencil_texture.use(1) + self.vmobject_stroke_program['stencil_texture'] = 1 + if sub.has_stroke(): + ProgramManager.write_uniforms(self.vmobject_stroke_program, uniforms) + self.render_program( + self.vmobject_stroke_program, self.get_stroke_shader_data(sub), np.array(range(len(sub.points)))[::-1] + ) - if mob.renderer_data is None: - # Initialize - # TODO: Initialize all the data also for submobjects - logger.debug("Initializing GLRenderData") - mob.renderer_data = GLRenderData() - # Generate Mesh - mob.renderer_data.vert_indices = get_triangulation(mob) - points_length = len(mob.points) - - # Generate Fill Color - fill_color = np.array([c._internal_value for c in mob.fill_color]) - stroke_color = np.array([c._internal_value for c in mob.stroke_color]) - mob.renderer_data.fill_rgbas = prepare_array(fill_color, points_length) - mob.renderer_data.stroke_rgbas = prepare_array(stroke_color, points_length) - mob.renderer_data.stroke_widths = prepare_array( - np.asarray(listify(mob.stroke_width)), points_length - ) - mob.renderer_data.normals = np.repeat( - [mob.get_unit_normal()], points_length, axis=0 - ) - mob.renderer_data.bounding_box = compute_bounding_box(mob) - # print(mob.renderer_data) - - # if mob.colors_changed: - # mob.renderer_data.fill_rgbas = np.resize(mob.fill_color, (len(mob.renderer_data.mesh),4)) - - # if mob.points_changed:3357 - # if(mob.has_fill()): - # mob.renderer_data.mesh = ... # Triangulation todo - - # self.vmobject_fill_program['reflectiveness'].value = mob.reflectiveness - self.vmobject_fill_program["gloss"].value = mob.gloss - self.vmobject_fill_program["shadow"].value = mob.shadow - - # self.vmobject_stroke_program['reflectiveness'].value = mob.reflectiveness - self.vmobject_stroke_program["gloss"].value = mob.gloss - self.vmobject_stroke_program["shadow"].value = mob.shadow - self.vmobject_stroke_program["joint_type"].value = float( - mob.joint_type.value - ) # TODO: This maybe breaks - self.vmobject_stroke_program["flat_stroke"].value = mob.flat_stroke - - def render_shader(prog, mob, data, use_ibo): - vbo = self.ctx.buffer(data.tobytes()) - ibo = ( - self.ctx.buffer(mob.renderer_data.vert_indices.astype("i4").tobytes()) - if use_ibo - else None - ) - # print(prog,vbo,data) - vert_format = gl.detect_format(prog, data.dtype.names) - # print(vert_format) - vao = self.ctx.vertex_array( - program=prog, - content=[(vbo, vert_format, *data.dtype.names)], - index_buffer=ibo, - ) - - vao.render(gl.TRIANGLES) - vbo.release() - if use_ibo: - ibo.release() - vao.release() - - self.ctx.enable(gl.BLEND) - self.ctx.blend_func = ( - gl.SRC_ALPHA, - gl.ONE_MINUS_SRC_ALPHA, - gl.ONE, - gl.ONE, - ) - # self.ctx.enable(gl.DEPTH_TEST) - # TODO: Handle Submobjects - render_shader( - self.vmobject_fill_program, mob, self.get_fill_shader_data(mob), True - ) - render_shader( - self.vmobject_stroke_program, mob, self.get_stroke_shader_data(mob), False - ) + counter += 1 def get_pixels(self) -> ImageType: raw = self.output_fbo.read(components=4, dtype="f1", clamp=True) # RGBA, floats @@ -383,6 +383,43 @@ def get_pixels(self) -> ImageType: return buf +class GLVMobjectManager: + @staticmethod + def init_render_data(mob:OpenGLVMobject): + logger.debug("Initializing GLRenderData") + mob.renderer_data = GLRenderData() + + # Generate Mesh + mob.renderer_data.vert_indices = get_triangulation(mob) + points_length = len(mob.points) + + # Generate Fill Color + fill_color = np.array([c._internal_value for c in mob.fill_color]) + stroke_color = np.array([c._internal_value for c in mob.stroke_color]) + mob.renderer_data.fill_rgbas = prepare_array(fill_color, points_length) + mob.renderer_data.stroke_rgbas = prepare_array(stroke_color, points_length) + mob.renderer_data.stroke_widths = prepare_array( + np.asarray(listify(mob.stroke_width)), points_length + ) + mob.renderer_data.normals = np.repeat( + [mob.get_unit_normal()], points_length, axis=0 + ) + mob.renderer_data.bounding_box = compute_bounding_box(mob) + # print(mob.renderer_data) + + @staticmethod + def read_uniforms(mob: OpenGLVMobject): + uniforms = {} + uniforms['reflectiveness'] = mob.reflectiveness + uniforms["is_fixed_in_frame"] = float(mob.is_fixed_in_frame) + uniforms["is_fixed_orientation"] = float(mob.is_fixed_orientation) + uniforms["gloss"] = mob.gloss + uniforms["shadow"] = mob.shadow + uniforms["flat_stroke"] = float(mob.flat_stroke) + uniforms["joint_type"] = float(mob.joint_type.value) + return uniforms + + # def init_frame(self, **config) -> None: # self.frame = OpenGLCameraFrame(**config) diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index 87ba0a9cae..21842f9091 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -43,6 +43,9 @@ def pre_render(self, camera): def post_render(self): raise NotImplementedError + def use_window(self): + raise NotImplementedError + @abstractclassmethod def render_vmobject(self, mob: OpenGLVMobject) -> None: raise NotImplementedError diff --git a/manim/renderer/shaders/include/finalize_color.glsl b/manim/renderer/shaders/include/finalize_color.glsl index 26b10376a2..a913f785a2 100644 --- a/manim/renderer/shaders/include/finalize_color.glsl +++ b/manim/renderer/shaders/include/finalize_color.glsl @@ -15,7 +15,8 @@ vec4 add_light(vec4 color, vec3 light_coords, float gloss, float shadow){ - if(gloss == 0.0 && shadow == 0.0) return color; + if (gloss == 0.0 && shadow == 0.0 && reflectiveness == 0.0) + return color; // TODO, do we actually want this? It effectively treats surfaces as two-sided if(unit_normal.z < 0){ diff --git a/manim/renderer/shaders/include/get_gl_Position.glsl b/manim/renderer/shaders/include/get_gl_Position.glsl index 081ffb12f0..be9a3b5879 100644 --- a/manim/renderer/shaders/include/get_gl_Position.glsl +++ b/manim/renderer/shaders/include/get_gl_Position.glsl @@ -2,7 +2,7 @@ // uniform vec2 frame_shape; // uniform float focal_distance; // uniform float is_fixed_in_frame; - +uniform float z_shift; const vec2 DEFAULT_FRAME_SHAPE = vec2(8.0 * 16.0 / 9.0, 8.0); float perspective_scale_factor(float z, float focal_distance) @@ -23,7 +23,9 @@ vec4 get_gl_Position(vec3 point) result.xy *= psf; // TODO, what's the better way to do this? // This is to keep vertices too far out of frame from getting cut. - result.z *= 0.01; + // TODO This will be done by the clipping plane in the future with the transformation matrix + result.z -= z_shift; + result.z *= (1.0 / 100.0); } } else diff --git a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl index e7b06f9a14..94a4c84bfe 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl @@ -40,4 +40,8 @@ void main() { #ifndef ANTI_ALIASING frag_color.a *= float(sdf() > 0); // No anti-aliasing #endif + if (frag_color.a <= 0.0) + { + discard; + } } diff --git a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl index 1af88004e6..82cf2f55a1 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl @@ -15,6 +15,7 @@ uniform vec3 fixed_orientation_center; uniform vec3 light_source_position; uniform float gloss; uniform float shadow; +uniform float reflectiveness; in vec3 bp[3]; in vec3 v_global_unit_normal[3]; diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl index 8cf383a058..b072826ccd 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl @@ -1,6 +1,7 @@ #version 330 #include ../include/camera_uniform_declarations.glsl +uniform vec2 pixel_shape; in vec2 uv_coords; in vec2 uv_b2; @@ -16,6 +17,8 @@ in float bevel_end; in float angle_from_prev; in float angle_to_next; +uniform sampler2D stencil_texture; + in float bezier_degree; out vec4 frag_color; @@ -83,11 +86,21 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t){ void main() { - if (uv_stroke_width == 0) discard; + if (uv_stroke_width == 0) + discard; float dist_to_curve = min_dist_to_curve(uv_coords, uv_b2, bezier_degree); // An sdf for the region around the curve we wish to color. float signed_dist = abs(dist_to_curve) - 0.5 * uv_stroke_width; - frag_color = color; + frag_color = + // TODO: The incoming texture should be the depth buffer, discard the pixel on any value this needs to be + // rewritten + vec4(texture2D(stencil_texture, vec2(gl_FragCoord.x / pixel_shape.x, gl_FragCoord.y / pixel_shape.y)).a, 0, 0, + 1) + + color / 1000; frag_color.a *= smoothstep(0.5, -0.5, signed_dist / uv_anti_alias_width); + if (frag_color.a <= 0.0) + { + discard; + } } diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl index 2433142410..210396e898 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl @@ -6,8 +6,6 @@ layout (triangle_strip, max_vertices = 5) out; // Needed for get_gl_Position uniform vec2 frame_shape; uniform float focal_distance; -uniform float is_fixed_in_frame; -uniform float is_fixed_orientation; uniform vec3 fixed_orientation_center; uniform float anti_alias_width; @@ -15,9 +13,12 @@ uniform float flat_stroke; //Needed for lighting uniform vec3 light_source_position; -uniform float joint_type; uniform float gloss; uniform float shadow; +uniform float joint_type; +uniform float reflectiveness; +uniform float is_fixed_in_frame; +uniform float is_fixed_orientation; in vec3 bp[3]; in vec3 prev_bp[3]; @@ -264,10 +265,7 @@ void main() { gloss, shadow ); - gl_Position = vec4( - get_gl_Position(vec3(corners[i], 0.0)).xy, - get_gl_Position(controls[index_map[i]]).zw - ); + gl_Position = vec4(get_gl_Position(vec3(corners[i], 0.0)).xy, get_gl_Position(controls[index_map[i]]).zw); EmitVertex(); } EndPrimitive(); From 603e7128efdb8b1123f6feb9ae2aba5c2a334d45 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 13:27:42 +0000 Subject: [PATCH 040/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- example_scenes/test_new.py | 29 +++++++--- manim/mobject/opengl/opengl_mobject.py | 8 ++- .../opengl/opengl_vectorized_mobject.py | 2 +- manim/renderer/opengl_renderer.py | 53 +++++++++++++------ 4 files changed, 64 insertions(+), 28 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index 6ec81e5a76..7226b97199 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -1,13 +1,14 @@ import time +import numpy as np import pyglet from PIL import Image from pyglet import shapes from pyglet.gl import Config from pyglet.window import Window -import numpy as np + import manim.utils.color.manim_colors as col -from manim._config import tempconfig +from manim._config import config, tempconfig from manim.camera.camera import OpenGLCamera, OpenGLCameraFrame from manim.constants import OUT, RIGHT, UP from manim.mobject.geometry.arc import Circle @@ -15,7 +16,6 @@ from manim.mobject.logo import ManimBanner from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.renderer.opengl_renderer import OpenGLRenderer -from manim._config import config if __name__ == "__main__": with tempconfig({"renderer": "opengl"}): @@ -24,7 +24,9 @@ vm = Circle( radius=1, stroke_color=col.YELLOW, fill_opacity=1, fill_color=col.RED ).shift(RIGHT) - vm2 = Square(stroke_color=col.GREEN, fill_opacity=0, stroke_opacity=1).move_to((0,0,-0.5)) + vm2 = Square(stroke_color=col.GREEN, fill_opacity=0, stroke_opacity=1).move_to( + (0, 0, -0.5) + ) vm3 = ManimBanner() # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) # print(vm.color) @@ -52,14 +54,20 @@ vm2.apply_depth_test() vm3.apply_depth_test() clock = pyglet.clock.get_default() + def update_circle(dt): vm.move_to((np.sin(dt), np.cos(dt), -1)) + clock.schedule(update_circle) - def p2m(x,y,z): + def p2m(x, y, z): from manim._config import config - return (config.frame_width*(x/config.pixel_width-0.5), config.frame_height*(y/config.pixel_height-0.5),z) + return ( + config.frame_width * (x / config.pixel_width - 0.5), + config.frame_height * (y / config.pixel_height - 0.5), + z, + ) @win.event def on_close(): @@ -68,9 +76,14 @@ def on_close(): @win.event def on_mouse_motion(x, y, dx, dy): # vm.move_to((14.2222 * (x / 1920 - 0.5), 8 * (y / 1080 - 0.5), 0)) - #camera.move_to(p2m(x,y,camera.get_center()[2])) + # camera.move_to(p2m(x,y,camera.get_center()[2])) from scipy.spatial.transform import Rotation - camera.set_orientation(Rotation.from_rotvec((-UP*(x/1920-0.5)+RIGHT*(y/1080-0.5))*2*3.1415)) + + camera.set_orientation( + Rotation.from_rotvec( + (-UP * (x / 1920 - 0.5) + RIGHT * (y / 1080 - 0.5)) * 2 * 3.1415 + ) + ) # vm.set_color(col.RED.interpolate(col.GREEN,x/1920)) # print(x,y) diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index 9ef0f1f2bd..cdf7c1a4b6 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -1,13 +1,13 @@ from __future__ import annotations import copy -from dataclasses import dataclass import itertools as it import numbers import os import pickle import random import sys +from dataclasses import dataclass from functools import partialmethod, wraps from math import ceil from typing import TYPE_CHECKING @@ -52,7 +52,9 @@ from typing_extensions import Self, TypeAlias - TimeBasedUpdater: TypeAlias = Callable[["OpenGLMobject", float], "OpenGLMobject" | None] + TimeBasedUpdater: TypeAlias = Callable[ + ["OpenGLMobject", float], "OpenGLMobject" | None + ] NonTimeUpdater: TypeAlias = Callable[["OpenGLMobject"], "OpenGLMobject" | None] Updater: TypeAlias = Union[TimeBasedUpdater, NonTimeUpdater] PointUpdateFunction: TypeAlias = Callable[[np.ndarray], np.ndarray] @@ -91,6 +93,7 @@ def wrapper(self): return wrapper + @dataclass class MobjectStatus: color_changed: bool = False @@ -99,6 +102,7 @@ class MobjectStatus: scale_changed: bool = False points_changed: bool = False + class OpenGLMobject: """Mathematical Object: base class for objects that can be displayed on screen. diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 32e5a8194d..5aa6dbd868 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -456,7 +456,7 @@ def get_color(self) -> str: def has_stroke(self) -> bool: # TODO: This currently doesn't make sense needs fixing - return self.stroke_width>0 and any(self.get_stroke_opacities()) + return self.stroke_width > 0 and any(self.get_stroke_opacities()) def has_fill(self) -> bool: return any(self.get_fill_opacities()) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 4d47adcea8..33e1c9d3e5 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -221,10 +221,21 @@ def __init__( logger.debug("Initializing OpenGL context and framebuffers") self.ctx = gl.create_context() - self.stencil_texture = self.ctx.texture((self.pixel_width, self.pixel_height), components=4,dtype='f1') + self.stencil_texture = self.ctx.texture( + (self.pixel_width, self.pixel_height), components=4, dtype="f1" + ) self.target_fbo = self.ctx.framebuffer( - color_attachments=[self.ctx.renderbuffer((self.pixel_width, self.pixel_height), components=4,samples=4,dtype='f1')] - ,depth_attachment=self.ctx.depth_texture((self.pixel_width, self.pixel_height), samples=4) + color_attachments=[ + self.ctx.renderbuffer( + (self.pixel_width, self.pixel_height), + components=4, + samples=4, + dtype="f1", + ) + ], + depth_attachment=self.ctx.depth_texture( + (self.pixel_width, self.pixel_height), samples=4 + ), ) self.output_fbo = self.ctx.framebuffer( @@ -251,7 +262,7 @@ def use_window(self): def init_camera(self, camera: OpenGLCameraFrame): uniforms = dict() uniforms["frame_shape"] = camera.frame_shape - uniforms['pixel_shape'] = (self.pixel_width,self.pixel_height) + uniforms["pixel_shape"] = (self.pixel_width, self.pixel_height) uniforms["focal_distance"] = camera.get_focal_distance() uniforms["camera_center"] = tuple(camera.get_center()) uniforms["camera_rotation"] = tuple( @@ -306,9 +317,13 @@ def pre_render(self, camera): def post_render(self): self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo) - def render_program(self, prog, data, indices = None): + def render_program(self, prog, data, indices=None): vbo = self.ctx.buffer(data.tobytes()) - ibo = self.ctx.buffer(np.asarray(indices).astype("i4").tobytes()) if indices is not None else None + ibo = ( + self.ctx.buffer(np.asarray(indices).astype("i4").tobytes()) + if indices is not None + else None + ) # print(prog,vbo,data) vert_format = gl.detect_format(prog, data.dtype.names) # print(vert_format) @@ -324,7 +339,7 @@ def render_program(self, prog, data, indices = None): ibo.release() vao.release() - def render_vmobject(self, mob: OpenGLVMobject) -> None: #type: ignore + def render_vmobject(self, mob: OpenGLVMobject) -> None: # type: ignore # Setting camera uniforms counter = 0 num_mobs = len(mob.family_members_with_points()) @@ -345,7 +360,7 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: #type: ignore # mob.renderer_data.mesh = ... # Triangulation todo # self.ctx.enable(gl.CULL_FACE) - self.ctx.enable(gl.BLEND) #type: ignore + self.ctx.enable(gl.BLEND) # type: ignore # TODO: Because the Triangulation is messing up the normals this won't work # self.ctx.blend_func = ( #type: ignore # gl.SRC_ALPHA, @@ -354,25 +369,29 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: #type: ignore # gl.ONE, # ) if sub.depth_test: - self.ctx.enable(gl.DEPTH_TEST) #type: ignore + self.ctx.enable(gl.DEPTH_TEST) # type: ignore else: - self.ctx.disable(gl.DEPTH_TEST) #type: ignore + self.ctx.disable(gl.DEPTH_TEST) # type: ignore uniforms = GLVMobjectManager.read_uniforms(sub) - uniforms['z_shift'] = counter/9 + uniforms["z_shift"] = counter / 9 if sub.has_fill(): ProgramManager.write_uniforms(self.vmobject_fill_program, uniforms) self.render_program( - self.vmobject_fill_program, self.get_fill_shader_data(sub), sub.renderer_data.vert_indices + self.vmobject_fill_program, + self.get_fill_shader_data(sub), + sub.renderer_data.vert_indices, ) - uniforms["z_shift"] -= 1/20 + uniforms["z_shift"] -= 1 / 20 self.copy_frame_to_stencil() self.stencil_texture.use(1) - self.vmobject_stroke_program['stencil_texture'] = 1 + self.vmobject_stroke_program["stencil_texture"] = 1 if sub.has_stroke(): ProgramManager.write_uniforms(self.vmobject_stroke_program, uniforms) self.render_program( - self.vmobject_stroke_program, self.get_stroke_shader_data(sub), np.array(range(len(sub.points)))[::-1] + self.vmobject_stroke_program, + self.get_stroke_shader_data(sub), + np.array(range(len(sub.points)))[::-1], ) counter += 1 @@ -385,7 +404,7 @@ def get_pixels(self) -> ImageType: class GLVMobjectManager: @staticmethod - def init_render_data(mob:OpenGLVMobject): + def init_render_data(mob: OpenGLVMobject): logger.debug("Initializing GLRenderData") mob.renderer_data = GLRenderData() @@ -410,7 +429,7 @@ def init_render_data(mob:OpenGLVMobject): @staticmethod def read_uniforms(mob: OpenGLVMobject): uniforms = {} - uniforms['reflectiveness'] = mob.reflectiveness + uniforms["reflectiveness"] = mob.reflectiveness uniforms["is_fixed_in_frame"] = float(mob.is_fixed_in_frame) uniforms["is_fixed_orientation"] = float(mob.is_fixed_orientation) uniforms["gloss"] = mob.gloss From 389c1a15872e3d8b416d38774f06c1900bec26bb Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Tue, 12 Sep 2023 18:21:24 +0200 Subject: [PATCH 041/106] Working Shading in 3D many many tries --- manim/renderer/opengl_renderer.py | 66 ++++++++++++++----- .../shaders/include/get_gl_Position.glsl | 2 +- .../shaders/quadratic_bezier_fill/frag.glsl | 23 ++++++- .../shaders/quadratic_bezier_stroke/frag.glsl | 35 +++++++--- 4 files changed, 98 insertions(+), 28 deletions(-) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 4d47adcea8..278394aa5e 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -67,6 +67,7 @@ def __repr__(self) -> str: """ +# TODO: Move into GLVMobjectManager def get_triangulation(self, normal_vector=None): # Figure out how to triangulate the interior to know # how to send the points as to the vertex shader. @@ -160,6 +161,7 @@ def prepare_array(values: np.ndarray, desired_length: int): return np.array(rgbas) +# TODO: Move into GLVMobjectManager def compute_bounding_box(mob): all_points = np.vstack( [ @@ -221,12 +223,25 @@ def __init__( logger.debug("Initializing OpenGL context and framebuffers") self.ctx = gl.create_context() - self.stencil_texture = self.ctx.texture((self.pixel_width, self.pixel_height), components=4,dtype='f1') - self.target_fbo = self.ctx.framebuffer( - color_attachments=[self.ctx.renderbuffer((self.pixel_width, self.pixel_height), components=4,samples=4,dtype='f1')] - ,depth_attachment=self.ctx.depth_texture((self.pixel_width, self.pixel_height), samples=4) + # Those are the actual buffers that are used for rendering + self.stencil_texture = self.ctx.texture((self.pixel_width, self.pixel_height), components=1, samples=0, dtype='f1') + self.stencil_buffer = self.ctx.renderbuffer((self.pixel_width, self.pixel_height), components=1, samples=0, dtype='f1') + self.color_buffer = self.ctx.renderbuffer((self.pixel_width, self.pixel_height), components=4,samples=0,dtype='f1') + + # Here we create different fbos that can be reused which are basically just targets to use for rendering and copy + # render_target_fbo is used for rendering it can write to color and stencil + self.render_target_fbo = self.ctx.framebuffer( + color_attachments=[ self.color_buffer,self.stencil_buffer] + ,depth_attachment=self.ctx.depth_renderbuffer((self.pixel_width, self.pixel_height), samples=0) ) + # this is used as source for stencil copy + self.stencil_buffer_fbo = self.ctx.framebuffer(color_attachments=[self.stencil_buffer]) + # this is used as destination for stencil copy + self.stencil_texture_fbo = self.ctx.framebuffer(color_attachments=[self.stencil_texture]) + # this is used as source for copying color to the output + self.color_buffer_fbo = self.ctx.framebuffer(color_attachments=[self.color_buffer]) + self.output_fbo = self.ctx.framebuffer( color_attachments=[ self.ctx.renderbuffer( @@ -264,6 +279,7 @@ def init_camera(self, camera: OpenGLCameraFrame): ProgramManager.write_uniforms(self.vmobject_fill_program, uniforms) ProgramManager.write_uniforms(self.vmobject_stroke_program, uniforms) + # TODO: Move into GLVMobjectManager def get_stroke_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: if not isinstance(mob.renderer_data, GLRenderData): raise TypeError() @@ -282,6 +298,7 @@ def get_stroke_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: return stroke_data + # TODO: Move into GLVMobjectManager def get_fill_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: if not isinstance(mob.renderer_data, GLRenderData): raise TypeError() @@ -294,17 +311,13 @@ def get_fill_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: fill_data["vert_index"] = np.reshape(range(len(mob.points)), (-1, 1)) return fill_data - def copy_frame_to_stencil(self): - self.stencil_texture = self.target_fbo.depth_attachment - def pre_render(self, camera): self.init_camera(camera=camera) - self.target_fbo.use() - self.target_fbo.clear(*self.background_color) - self.copy_frame_to_stencil() + self.render_target_fbo.use() + self.render_target_fbo.clear(*self.background_color) def post_render(self): - self.ctx.copy_framebuffer(self.output_fbo, self.target_fbo) + self.ctx.copy_framebuffer(self.output_fbo, self.color_buffer_fbo) def render_program(self, prog, data, indices = None): vbo = self.ctx.buffer(data.tobytes()) @@ -325,9 +338,11 @@ def render_program(self, prog, data, indices = None): vao.release() def render_vmobject(self, mob: OpenGLVMobject) -> None: #type: ignore + self.stencil_buffer_fbo.use() + self.stencil_buffer_fbo.clear() + self.render_target_fbo.use() # Setting camera uniforms - counter = 0 - num_mobs = len(mob.family_members_with_points()) + for sub in mob.family_members_with_points(): if sub.renderer_data is None: # Initialize @@ -357,18 +372,33 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: #type: ignore self.ctx.enable(gl.DEPTH_TEST) #type: ignore else: self.ctx.disable(gl.DEPTH_TEST) #type: ignore + + + num_mobs = len(mob.family_members_with_points()) + for counter,sub in enumerate(mob.family_members_with_points()): + if not isinstance(sub.renderer_data, GLRenderData): + return uniforms = GLVMobjectManager.read_uniforms(sub) - uniforms['z_shift'] = counter/9 + # uniforms['z_shift'] = counter/9 + uniforms['index'] = (counter + 1)/num_mobs + self.ctx.copy_framebuffer(self.stencil_texture_fbo,self.stencil_buffer_fbo) + self.stencil_texture.use(0) + self.vmobject_fill_program['stencil_texture'] = 0 if sub.has_fill(): ProgramManager.write_uniforms(self.vmobject_fill_program, uniforms) self.render_program( self.vmobject_fill_program, self.get_fill_shader_data(sub), sub.renderer_data.vert_indices ) - uniforms["z_shift"] -= 1/20 - self.copy_frame_to_stencil() - self.stencil_texture.use(1) - self.vmobject_stroke_program['stencil_texture'] = 1 + for counter,sub in enumerate(mob.family_members_with_points()): + if not isinstance(sub.renderer_data, GLRenderData): + return + uniforms = GLVMobjectManager.read_uniforms(sub) + uniforms['index'] = (counter + 1)/num_mobs + # uniforms['z_shift'] = counter/9 + 1/20 + self.ctx.copy_framebuffer(self.stencil_texture_fbo,self.stencil_buffer_fbo) + self.stencil_texture.use(0) + self.vmobject_stroke_program['stencil_texture'] = 0 if sub.has_stroke(): ProgramManager.write_uniforms(self.vmobject_stroke_program, uniforms) self.render_program( diff --git a/manim/renderer/shaders/include/get_gl_Position.glsl b/manim/renderer/shaders/include/get_gl_Position.glsl index be9a3b5879..11ffe2c038 100644 --- a/manim/renderer/shaders/include/get_gl_Position.glsl +++ b/manim/renderer/shaders/include/get_gl_Position.glsl @@ -24,7 +24,7 @@ vec4 get_gl_Position(vec3 point) // TODO, what's the better way to do this? // This is to keep vertices too far out of frame from getting cut. // TODO This will be done by the clipping plane in the future with the transformation matrix - result.z -= z_shift; + result.z += z_shift; result.z *= (1.0 / 100.0); } } diff --git a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl index 94a4c84bfe..bafae1a401 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl @@ -1,6 +1,8 @@ #version 330 #include ../include/camera_uniform_declarations.glsl +uniform vec2 pixel_shape; +uniform float index; in vec4 color; in float fill_all; // Either 0 or 1e @@ -10,7 +12,10 @@ in float orientation; in vec2 uv_coords; in float bezier_degree; -out vec4 frag_color; +uniform sampler2D stencil_texture; + +layout(location = 0) out vec4 frag_color; +layout(location = 1) out float stencil_value; #define ANTI_ALIASING @@ -31,7 +36,23 @@ float sdf(){ void main() { + gl_FragDepth = gl_FragCoord.z; if (color.a == 0) discard; + stencil_value = index; + float previous_index = + texture2D(stencil_texture, vec2(gl_FragCoord.x / pixel_shape.x, gl_FragCoord.y / pixel_shape.y)).r; + + // Check if we are behind another fill and if yes discard the current fragment + if (previous_index > index) + { + discard; + } + // If we are on top of a previously drawn fill we need to shift ourselves forward by the index amount to compensate + // for different shifting and avoid z_fighting + if (previous_index < index && previous_index != 0) + { + gl_FragDepth = gl_FragCoord.z - index / 1000.0; + } frag_color = color; if (fill_all == 1.0) return; #ifdef ANTI_ALIASING diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl index b072826ccd..1316c7cdec 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl @@ -2,6 +2,7 @@ #include ../include/camera_uniform_declarations.glsl uniform vec2 pixel_shape; +uniform float index; in vec2 uv_coords; in vec2 uv_b2; @@ -21,8 +22,8 @@ uniform sampler2D stencil_texture; in float bezier_degree; -out vec4 frag_color; - +layout(location = 0) out vec4 frag_color; +layout(location = 1) out float stencil_value; float cross2d(vec2 v, vec2 w){ return v.x * w.y - w.x * v.y; @@ -86,21 +87,39 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t){ void main() { + // Use the default value as standard output + gl_FragDepth = gl_FragCoord.z; + // Get the previous index that was written to this fragment + float previous_index = + texture2D(stencil_texture, vec2(gl_FragCoord.x / pixel_shape.x, gl_FragCoord.y / pixel_shape.y)).r; + // If the index is the same that means we are overlapping with the fill and crossing through so we push the stroke + // forward a tiny bit + if (previous_index < index && previous_index != 0) + { + gl_FragDepth = gl_FragCoord.z - 1.7 * index / 1000.0; + } + if (previous_index == index) + { + gl_FragDepth = gl_FragCoord.z - index / 1000.0; + } + // If the stroke is overlapping with a shape that is of higher index that means it is behind another mobject on the + // same plane so we discard the fragment + if (previous_index > index) + { + discard; + } + stencil_value = index; if (uv_stroke_width == 0) discard; float dist_to_curve = min_dist_to_curve(uv_coords, uv_b2, bezier_degree); // An sdf for the region around the curve we wish to color. float signed_dist = abs(dist_to_curve) - 0.5 * uv_stroke_width; - frag_color = - // TODO: The incoming texture should be the depth buffer, discard the pixel on any value this needs to be - // rewritten - vec4(texture2D(stencil_texture, vec2(gl_FragCoord.x / pixel_shape.x, gl_FragCoord.y / pixel_shape.y)).a, 0, 0, - 1) + - color / 1000; + frag_color = color; frag_color.a *= smoothstep(0.5, -0.5, signed_dist / uv_anti_alias_width); if (frag_color.a <= 0.0) { discard; } + // stencil_value = 1; } From 46ba43cc97a2004a018d11f57d225dfff5d6370b Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Tue, 12 Sep 2023 22:36:32 +0200 Subject: [PATCH 042/106] Almost working blending, stroke broken --- example_scenes/test_new.py | 15 +++-- manim/renderer/opengl_renderer.py | 60 +++++++++++-------- .../shaders/include/get_gl_Position.glsl | 4 +- .../shaders/quadratic_bezier_fill/frag.glsl | 7 ++- .../shaders/quadratic_bezier_stroke/frag.glsl | 8 +-- 5 files changed, 55 insertions(+), 39 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index 7226b97199..41dd27cba1 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -21,13 +21,18 @@ with tempconfig({"renderer": "opengl"}): renderer = OpenGLRenderer(1920, 1080, background_color=col.GRAY) # vm = OpenGLVMobject([col.RED, col.GREEN]) - vm = Circle( - radius=1, stroke_color=col.YELLOW, fill_opacity=1, fill_color=col.RED - ).shift(RIGHT) + vm = ( + Circle( + radius=1, + stroke_color=col.YELLOW, + ) + .shift(RIGHT) + .set_opacity(0.5) + ) vm2 = Square(stroke_color=col.GREEN, fill_opacity=0, stroke_opacity=1).move_to( (0, 0, -0.5) ) - vm3 = ManimBanner() + vm3 = ManimBanner().set_opacity(0.5) # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) # print(vm.color) # print(vm.fill_color) @@ -46,7 +51,7 @@ width=1920, height=1080, vsync=True, - config=Config(double_buffer=True, samples=4), + config=Config(double_buffer=True, samples=0), ) renderer.use_window() diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 88b377bfc9..da8b328698 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -68,16 +68,13 @@ def __repr__(self) -> str: # TODO: Move into GLVMobjectManager -def get_triangulation(self, normal_vector=None): +def get_triangulation(self: OpenGLVMobject, normal_vector=None): # Figure out how to triangulate the interior to know # how to send the points as to the vertex shader. # First triangles come directly from the points if normal_vector is None: normal_vector = self.get_unit_normal() - if not self.needs_new_triangulation: - return self.triangulation - points = self.points if len(points) <= 1: @@ -204,7 +201,7 @@ def __init__( self, pixel_width: int = config.pixel_width, pixel_height: int = config.pixel_height, - samples=4, + samples=0, background_color: c.ManimColor = color.BLACK, background_opacity: float = 1.0, background_image: str | None = None, @@ -228,19 +225,26 @@ def __init__( (self.pixel_width, self.pixel_height), components=1, samples=0, dtype="f1" ) self.stencil_buffer = self.ctx.renderbuffer( - (self.pixel_width, self.pixel_height), components=1, samples=0, dtype="f1" + (self.pixel_width, self.pixel_height), + components=1, + samples=samples, + dtype="f1", ) self.color_buffer = self.ctx.renderbuffer( - (self.pixel_width, self.pixel_height), components=4, samples=0, dtype="f1" + (self.pixel_width, self.pixel_height), + components=4, + samples=samples, + dtype="f1", + ) + self.depth_buffer = self.ctx.depth_renderbuffer( + (self.pixel_width, self.pixel_height), samples=samples ) # Here we create different fbos that can be reused which are basically just targets to use for rendering and copy # render_target_fbo is used for rendering it can write to color and stencil self.render_target_fbo = self.ctx.framebuffer( color_attachments=[self.color_buffer, self.stencil_buffer], - depth_attachment=self.ctx.depth_renderbuffer( - (self.pixel_width, self.pixel_height), samples=0 - ), + depth_attachment=self.depth_buffer, ) # this is used as source for stencil copy @@ -361,6 +365,21 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: # type: ignore self.render_target_fbo.use() # Setting camera uniforms + self.ctx.enable(gl.BLEND) # type: ignore + # TODO: Because the Triangulation is messing up the normals this won't work + self.ctx.blend_func = ( # type: ignore + gl.SRC_ALPHA, + gl.ONE_MINUS_SRC_ALPHA, + gl.ONE, + gl.ONE, + ) + + def enable_depth(mob): + if sub.depth_test: + self.ctx.enable(gl.DEPTH_TEST) # type: ignore + else: + self.ctx.disable(gl.DEPTH_TEST) # type: ignore + for sub in mob.family_members_with_points(): if sub.renderer_data is None: # Initialize @@ -377,24 +396,12 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: # type: ignore # if(mob.has_fill()): # mob.renderer_data.mesh = ... # Triangulation todo - # self.ctx.enable(gl.CULL_FACE) - self.ctx.enable(gl.BLEND) # type: ignore - # TODO: Because the Triangulation is messing up the normals this won't work - # self.ctx.blend_func = ( #type: ignore - # gl.SRC_ALPHA, - # gl.ONE_MINUS_SRC_ALPHA, - # gl.ONE, - # gl.ONE, - # ) - if sub.depth_test: - self.ctx.enable(gl.DEPTH_TEST) # type: ignore - else: - self.ctx.disable(gl.DEPTH_TEST) # type: ignore - num_mobs = len(mob.family_members_with_points()) for counter, sub in enumerate(mob.family_members_with_points()): if not isinstance(sub.renderer_data, GLRenderData): return + enable_depth(sub) + self.ctx.enable(gl.DEPTH_TEST) uniforms = GLVMobjectManager.read_uniforms(sub) # uniforms['z_shift'] = counter/9 uniforms["index"] = (counter + 1) / num_mobs @@ -412,6 +419,8 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: # type: ignore for counter, sub in enumerate(mob.family_members_with_points()): if not isinstance(sub.renderer_data, GLRenderData): return + enable_depth(sub) + self.ctx.enable(gl.DEPTH_TEST) uniforms = GLVMobjectManager.read_uniforms(sub) uniforms["index"] = (counter + 1) / num_mobs # uniforms['z_shift'] = counter/9 + 1/20 @@ -423,7 +432,7 @@ def render_vmobject(self, mob: OpenGLVMobject) -> None: # type: ignore self.render_program( self.vmobject_stroke_program, self.get_stroke_shader_data(sub), - np.array(range(len(sub.points)))[::-1], + np.array(range(len(sub.points))), ) counter += 1 @@ -468,6 +477,7 @@ def read_uniforms(mob: OpenGLVMobject): uniforms["shadow"] = mob.shadow uniforms["flat_stroke"] = float(mob.flat_stroke) uniforms["joint_type"] = float(mob.joint_type.value) + uniforms["flat_stroke"] = float(mob.flat_stroke) return uniforms diff --git a/manim/renderer/shaders/include/get_gl_Position.glsl b/manim/renderer/shaders/include/get_gl_Position.glsl index 11ffe2c038..cd71b4c5a4 100644 --- a/manim/renderer/shaders/include/get_gl_Position.glsl +++ b/manim/renderer/shaders/include/get_gl_Position.glsl @@ -2,7 +2,7 @@ // uniform vec2 frame_shape; // uniform float focal_distance; // uniform float is_fixed_in_frame; -uniform float z_shift; +// uniform float z_shift; const vec2 DEFAULT_FRAME_SHAPE = vec2(8.0 * 16.0 / 9.0, 8.0); float perspective_scale_factor(float z, float focal_distance) @@ -24,7 +24,7 @@ vec4 get_gl_Position(vec3 point) // TODO, what's the better way to do this? // This is to keep vertices too far out of frame from getting cut. // TODO This will be done by the clipping plane in the future with the transformation matrix - result.z += z_shift; + // result.z += z_shift; result.z *= (1.0 / 100.0); } } diff --git a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl index bafae1a401..8c9cc16a0d 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl @@ -15,7 +15,7 @@ in float bezier_degree; uniform sampler2D stencil_texture; layout(location = 0) out vec4 frag_color; -layout(location = 1) out float stencil_value; +layout(location = 1) out vec4 stencil_value; #define ANTI_ALIASING @@ -38,7 +38,8 @@ float sdf(){ void main() { gl_FragDepth = gl_FragCoord.z; if (color.a == 0) discard; - stencil_value = index; + stencil_value.xyz = vec3(index); + stencil_value.a = 1.0; float previous_index = texture2D(stencil_texture, vec2(gl_FragCoord.x / pixel_shape.x, gl_FragCoord.y / pixel_shape.y)).r; @@ -61,7 +62,7 @@ void main() { #ifndef ANTI_ALIASING frag_color.a *= float(sdf() > 0); // No anti-aliasing #endif - if (frag_color.a <= 0.0) + if (frag_color.a < 0.0) { discard; } diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl index 1316c7cdec..d5cfa84015 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl @@ -23,7 +23,7 @@ uniform sampler2D stencil_texture; in float bezier_degree; layout(location = 0) out vec4 frag_color; -layout(location = 1) out float stencil_value; +layout(location = 1) out vec4 stencil_value; float cross2d(vec2 v, vec2 w){ return v.x * w.y - w.x * v.y; @@ -88,6 +88,8 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t){ void main() { // Use the default value as standard output + stencil_value.xyz = vec3(index); + stencil_value.a = 1.0; gl_FragDepth = gl_FragCoord.z; // Get the previous index that was written to this fragment float previous_index = @@ -108,7 +110,6 @@ void main() { { discard; } - stencil_value = index; if (uv_stroke_width == 0) discard; float dist_to_curve = min_dist_to_curve(uv_coords, uv_b2, bezier_degree); @@ -117,9 +118,8 @@ void main() { frag_color = color; frag_color.a *= smoothstep(0.5, -0.5, signed_dist / uv_anti_alias_width); - if (frag_color.a <= 0.0) + if (frag_color.a < 0.0) { discard; } - // stencil_value = 1; } From 7a7ed422fcd19d6f5974e713943c1c88fda0d35c Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Tue, 12 Sep 2023 23:18:38 +0200 Subject: [PATCH 043/106] Working Blending and Transparency in one direction --- manim/renderer/opengl_renderer.py | 2 -- manim/renderer/shaders/quadratic_bezier_fill/frag.glsl | 10 ++++++---- .../renderer/shaders/quadratic_bezier_stroke/frag.glsl | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index da8b328698..9a0637f994 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -401,7 +401,6 @@ def enable_depth(mob): if not isinstance(sub.renderer_data, GLRenderData): return enable_depth(sub) - self.ctx.enable(gl.DEPTH_TEST) uniforms = GLVMobjectManager.read_uniforms(sub) # uniforms['z_shift'] = counter/9 uniforms["index"] = (counter + 1) / num_mobs @@ -420,7 +419,6 @@ def enable_depth(mob): if not isinstance(sub.renderer_data, GLRenderData): return enable_depth(sub) - self.ctx.enable(gl.DEPTH_TEST) uniforms = GLVMobjectManager.read_uniforms(sub) uniforms["index"] = (counter + 1) / num_mobs # uniforms['z_shift'] = counter/9 + 1/20 diff --git a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl index 8c9cc16a0d..8dfd8fab00 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl @@ -38,8 +38,7 @@ float sdf(){ void main() { gl_FragDepth = gl_FragCoord.z; if (color.a == 0) discard; - stencil_value.xyz = vec3(index); - stencil_value.a = 1.0; + float previous_index = texture2D(stencil_texture, vec2(gl_FragCoord.x / pixel_shape.x, gl_FragCoord.y / pixel_shape.y)).r; @@ -54,15 +53,18 @@ void main() { { gl_FragDepth = gl_FragCoord.z - index / 1000.0; } + stencil_value.r = index; + stencil_value.a = 1.0; frag_color = color; if (fill_all == 1.0) return; #ifdef ANTI_ALIASING - frag_color.a *= 0.5 - sdf(); // Anti-aliasing + float fac = max(0.0, min(1.0, 0.5 - sdf())); + frag_color.a *= fac; // Anti-aliasing #endif #ifndef ANTI_ALIASING frag_color.a *= float(sdf() > 0); // No anti-aliasing #endif - if (frag_color.a < 0.0) + if (frag_color.a <= 0.0) { discard; } diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl index d5cfa84015..923be46921 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl @@ -118,7 +118,7 @@ void main() { frag_color = color; frag_color.a *= smoothstep(0.5, -0.5, signed_dist / uv_anti_alias_width); - if (frag_color.a < 0.0) + if (frag_color.a <= 0.0) { discard; } From 115bcf968fc99a6e434a51a6bd4f7d554cc4076a Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Tue, 12 Sep 2023 23:35:03 +0200 Subject: [PATCH 044/106] Fixed affecting colors bug returns copy instead --- manim/mobject/opengl/opengl_vectorized_mobject.py | 6 ++---- manim/utils/color/core.py | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 5aa6dbd868..96aa36d36f 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -269,8 +269,7 @@ def construct(self): if color is not None: mob.fill_color = listify(ManimColor.parse(color)) if opacity is not None: - for c in mob.fill_color: - c.set_opacity(opacity) + mob.fill_color = [c.set_opacity(opacity) for c in mob.fill_color] return self def set_stroke( @@ -285,8 +284,7 @@ def set_stroke( if color is not None: mob.stroke_color = listify(ManimColor.parse(color)) if opacity is not None: - for c in mob.stroke_color: - c.set_opacity(opacity) + mob.stroke_color = [c.set_opacity(opacity) for c in mob.stroke_color] if width is not None: mob.stroke_width = listify(width) diff --git a/manim/utils/color/core.py b/manim/utils/color/core.py index dc06825db7..f1f6c98b13 100644 --- a/manim/utils/color/core.py +++ b/manim/utils/color/core.py @@ -529,8 +529,7 @@ def set_opacity(self, opacity: float) -> ManimColor: """ if opacity < 0 or opacity > 1: raise ValueError(f"Alpha value is not in range 0-1 it is {opacity}") - self._internal_value[3] = opacity - return self + return ManimColor(self._internal_value[:3], opacity) @classmethod def from_rgb( From d8f261d414cc179525cd9bce6a73bbb4e40761fe Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Tue, 12 Sep 2023 23:43:14 +0200 Subject: [PATCH 045/106] Make depth_testing default --- example_scenes/test_new.py | 6 ++---- manim/mobject/opengl/opengl_mobject.py | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index 41dd27cba1..af812b96cc 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -33,6 +33,7 @@ (0, 0, -0.5) ) vm3 = ManimBanner().set_opacity(0.5) + vm4 = Circle(0.5,col.GREEN).set_opacity(0.6).shift(OUT).set_fill(col.BLUE, opacity=0.2) # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) # print(vm.color) # print(vm.fill_color) @@ -55,9 +56,6 @@ ) renderer.use_window() - vm.apply_depth_test() - vm2.apply_depth_test() - vm3.apply_depth_test() clock = pyglet.clock.get_default() def update_circle(dt): @@ -94,7 +92,7 @@ def on_mouse_motion(x, y, dx, dy): @win.event def on_draw(): - renderer.render(camera, [vm, vm2, vm3]) + renderer.render(camera, [vm, vm2, vm3, vm4]) pass @win.event diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index cdf7c1a4b6..e990e57484 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -136,7 +136,7 @@ def __init__( texture_paths: dict[str, str] | None = None, is_fixed_in_frame: bool = False, is_fixed_orientation: bool = False, - depth_test: bool = False, + depth_test: bool = True, name: str | None = None, **kwargs, ): From 95f97b7dc6a03fee58bfc384de88de1840cd734a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 21:44:37 +0000 Subject: [PATCH 046/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- example_scenes/test_new.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index af812b96cc..bdccb2919b 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -33,7 +33,12 @@ (0, 0, -0.5) ) vm3 = ManimBanner().set_opacity(0.5) - vm4 = Circle(0.5,col.GREEN).set_opacity(0.6).shift(OUT).set_fill(col.BLUE, opacity=0.2) + vm4 = ( + Circle(0.5, col.GREEN) + .set_opacity(0.6) + .shift(OUT) + .set_fill(col.BLUE, opacity=0.2) + ) # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) # print(vm.color) # print(vm.fill_color) From df97462ca4119511adb98a711e226c30879a0024 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Fri, 15 Sep 2023 00:25:41 +0200 Subject: [PATCH 047/106] Fix logo .set deprecated usage --- manim/mobject/logo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manim/mobject/logo.py b/manim/mobject/logo.py index 6242a4c645..fcb7adef9e 100644 --- a/manim/mobject/logo.py +++ b/manim/mobject/logo.py @@ -149,7 +149,7 @@ def __init__(self, dark_theme: bool = True): self.scale_factor = 1 self.M = VMobjectFromSVGPath(MANIM_SVG_PATHS[0]).flip(cst.RIGHT).center() - self.M.set(stroke_width=0).scale( + self.M.set_stroke(width=0).scale( 7 * cst.DEFAULT_FONT_SIZE * cst.SCALE_FACTOR_PER_FONT_POINT ) self.M.set_fill(color=self.font_color, opacity=1).shift( @@ -166,7 +166,7 @@ def __init__(self, dark_theme: bool = True): anim = VGroup() for ind, path in enumerate(MANIM_SVG_PATHS[1:]): tex = VMobjectFromSVGPath(path).flip(cst.RIGHT).center() - tex.set(stroke_width=0).scale( + tex.set_stroke(width=0).scale( cst.DEFAULT_FONT_SIZE * cst.SCALE_FACTOR_PER_FONT_POINT ) if ind > 0: From 17f020493431343fe087116a500c159869b1a96c Mon Sep 17 00:00:00 2001 From: MrDiver Date: Fri, 15 Sep 2023 00:26:42 +0200 Subject: [PATCH 048/106] Initializing Window before gl context --- example_scenes/test_new.py | 49 ++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index bdccb2919b..145a7f329c 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -6,6 +6,8 @@ from pyglet import shapes from pyglet.gl import Config from pyglet.window import Window +from manim.mobject.text.numbers import DecimalNumber +from manim.mobject.text.text_mobject import Text import manim.utils.color.manim_colors as col from manim._config import config, tempconfig @@ -19,6 +21,12 @@ if __name__ == "__main__": with tempconfig({"renderer": "opengl"}): + win = Window( + width=1920, + height=1080, + vsync=True, + config=Config(double_buffer=True, samples=0), + ) renderer = OpenGLRenderer(1920, 1080, background_color=col.GRAY) # vm = OpenGLVMobject([col.RED, col.GREEN]) vm = ( @@ -32,7 +40,7 @@ vm2 = Square(stroke_color=col.GREEN, fill_opacity=0, stroke_opacity=1).move_to( (0, 0, -0.5) ) - vm3 = ManimBanner().set_opacity(0.5) + vm3 = ManimBanner().set_opacity(1.0) vm4 = ( Circle(0.5, col.GREEN) .set_opacity(0.6) @@ -53,20 +61,12 @@ # print(image.shape) # Image.fromarray(image, "RGBA").show() # exit(0) - win = Window( - width=1920, - height=1080, - vsync=True, - config=Config(double_buffer=True, samples=0), - ) renderer.use_window() clock = pyglet.clock.get_default() def update_circle(dt): - vm.move_to((np.sin(dt), np.cos(dt), -1)) - - clock.schedule(update_circle) + vm.move_to((np.sin(dt)*4, np.cos(dt)*4, -1)) def p2m(x, y, z): from manim._config import config @@ -97,17 +97,24 @@ def on_mouse_motion(x, y, dx, dy): @win.event def on_draw(): - renderer.render(camera, [vm, vm2, vm3, vm4]) - pass + dt = clock.update_time() + fps: OpenGLVMobject = DecimalNumber(dt) + fps.fix_in_frame() + renderer.render(camera, [vm, vm2, vm3, vm4, fps]) + # update_circle(counter) + @win.event def on_resize(width, height): - pass - - while True: - pyglet.clock.tick() - pyglet.app.platform_event_loop.step() - win.switch_to() - win.dispatch_event("on_draw") - win.dispatch_events() - win.flip() + super(Window, win).on_resize(width, height) + + pyglet.app.run() + # while True: + # pyglet.clock.tick() + # pyglet.app.platform_event_loop.step() + # win.switch_to() + # counter += 0.01 + # update_circle(counter) + # win.dispatch_event("on_draw") + # win.dispatch_events() + # win.flip() From 8537fd6eaa6a8a96fd4b8b0614f6eee6c56efd16 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Fri, 15 Sep 2023 00:32:12 +0200 Subject: [PATCH 049/106] Fixing svg mobject constructor --- .../opengl/opengl_vectorized_mobject.py | 44 ++++++------------- manim/mobject/svg/svg_mobject.py | 19 +++----- 2 files changed, 19 insertions(+), 44 deletions(-) diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 96aa36d36f..47789ab757 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -113,8 +113,9 @@ def __init__( self.set_fill(opacity=fill_opacity) self.stroke_color = listify(ManimColor.parse(stroke_color)) self.set_stroke(opacity=stroke_opacity) - - self.stroke_width = stroke_width + if stroke_width is None: + stroke_width = DEFAULT_STROKE_WIDTH + self.stroke_width = listify(stroke_width) self.draw_stroke_behind_fill = draw_stroke_behind_fill self.background_image_file = background_image_file self.long_lines = long_lines @@ -310,10 +311,10 @@ def align_stroke_width_data_to_points(self, recurse: bool = True) -> None: def set_style( self, - fill_color: Color | Iterable[Color] | None = None, + fill_color: ParsableManimColor | Iterable[ParsableManimColor] | None = None, fill_opacity: float | Iterable[float] | None = None, fill_rgba: np.ndarray | None = None, - stroke_color: Color | Iterable[Color] | None = None, + stroke_color: ParsableManimColor | Iterable[ParsableManimColor] | None = None, stroke_opacity: float | Iterable[float] | None = None, stroke_rgba: np.ndarray | None = None, stroke_width: float | Iterable[float] | None = None, @@ -324,31 +325,14 @@ def set_style( recurse: bool = True, ) -> Self: for mob in self.get_family(recurse): - if fill_rgba is not None: - mob.data["fill_rgba"] = resize_with_interpolation( - fill_rgba, len(fill_rgba) - ) - else: - mob.set_fill(color=fill_color, opacity=fill_opacity, recurse=False) - - if stroke_rgba is not None: - mob.data["stroke_rgba"] = resize_with_interpolation( - stroke_rgba, len(stroke_rgba) - ) - mob.set_stroke( - width=stroke_width, - background=stroke_background, - recurse=False, - ) - else: - mob.set_stroke( - color=stroke_color, - width=stroke_width, - opacity=stroke_opacity, - recurse=False, - background=stroke_background, - ) - + mob.set_fill(color=fill_color, opacity=fill_opacity, recurse=False) + mob.set_stroke( + color=stroke_color, + width=stroke_width, + opacity=stroke_opacity, + recurse=False, + background=stroke_background, + ) if reflectiveness is not None: mob.set_reflectiveness(reflectiveness, recurse=False) if gloss is not None: @@ -454,7 +438,7 @@ def get_color(self) -> str: def has_stroke(self) -> bool: # TODO: This currently doesn't make sense needs fixing - return self.stroke_width > 0 and any(self.get_stroke_opacities()) + return len(self.stroke_width) > 0 and any(self.get_stroke_opacities()) def has_fill(self) -> bool: return any(self.get_fill_opacities()) diff --git a/manim/mobject/svg/svg_mobject.py b/manim/mobject/svg/svg_mobject.py index 18d0a54aa9..82d349d525 100644 --- a/manim/mobject/svg/svg_mobject.py +++ b/manim/mobject/svg/svg_mobject.py @@ -110,21 +110,14 @@ def __init__( use_svg_cache: bool = True, **kwargs, ): - super().__init__(color=None, stroke_color=None, fill_color=None, **kwargs) + super().__init__(color=color, stroke_color=stroke_color,stroke_opacity=stroke_opacity, stroke_width=stroke_width, fill_opacity=fill_opacity, fill_color=fill_color, **kwargs) # process keyword arguments self.file_name = Path(file_name) if file_name is not None else None - self.should_center = should_center self.svg_height = height self.svg_width = width - self.color = color self.opacity = opacity - self.fill_color = fill_color - self.fill_opacity = fill_opacity - self.stroke_color = stroke_color - self.stroke_opacity = stroke_opacity - self.stroke_width = stroke_width if svg_default is None: svg_default = { @@ -132,7 +125,7 @@ def __init__( "opacity": None, "fill_color": None, "fill_opacity": None, - "stroke_width": 0, + "stroke_width": [0], "stroke_color": None, "stroke_opacity": None, } @@ -145,11 +138,9 @@ def __init__( self.init_svg_mobject(use_svg_cache=use_svg_cache) self.set_style( - fill_color=fill_color, - fill_opacity=fill_opacity, - stroke_color=stroke_color, - stroke_opacity=stroke_opacity, - stroke_width=stroke_width, + fill_color=self.fill_color, + stroke_color=self.stroke_color, + stroke_width=self.stroke_width, ) self.move_into_position() From 7e97df490d2983446b0e35b3f33be6d49a1728af Mon Sep 17 00:00:00 2001 From: MrDiver Date: Fri, 15 Sep 2023 00:34:31 +0200 Subject: [PATCH 050/106] experimental transparent stroke shadnig --- manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl index 923be46921..59b34de583 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl @@ -17,10 +17,10 @@ in float bevel_start; in float bevel_end; in float angle_from_prev; in float angle_to_next; +in float bezier_degree; uniform sampler2D stencil_texture; -in float bezier_degree; layout(location = 0) out vec4 frag_color; layout(location = 1) out vec4 stencil_value; @@ -88,7 +88,7 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t){ void main() { // Use the default value as standard output - stencil_value.xyz = vec3(index); + stencil_value.rgb = vec3(index); stencil_value.a = 1.0; gl_FragDepth = gl_FragCoord.z; // Get the previous index that was written to this fragment @@ -108,7 +108,10 @@ void main() { // same plane so we discard the fragment if (previous_index > index) { + if (color.a == 1.0) discard; + else + gl_FragDepth = gl_FragCoord.z - 3*index / 1000.0; } if (uv_stroke_width == 0) discard; From 7f4b287ac54fbd5c111a9be76f3928c6025f0014 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Fri, 15 Sep 2023 00:38:39 +0200 Subject: [PATCH 051/106] some formatting and removing unused variables --- manim/renderer/opengl_renderer.py | 5 ++--- manim/renderer/shaders/quadratic_bezier_fill/frag.glsl | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 9a0637f994..ba6eafbecb 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -201,7 +201,7 @@ def __init__( self, pixel_width: int = config.pixel_width, pixel_height: int = config.pixel_height, - samples=0, + samples=4, background_color: c.ManimColor = color.BLACK, background_opacity: float = 1.0, background_image: str | None = None, @@ -268,6 +268,7 @@ def __init__( ] ) + # Preparing vmobject shader logger.debug("Initializing Shader Programs") self.vmobject_fill_program = load_shader_program_by_folder( @@ -433,8 +434,6 @@ def enable_depth(mob): np.array(range(len(sub.points))), ) - counter += 1 - def get_pixels(self) -> ImageType: raw = self.output_fbo.read(components=4, dtype="f1", clamp=True) # RGBA, floats buf = np.frombuffer(raw, dtype=np.uint8).reshape((1080, 1920, -1)) diff --git a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl index 8dfd8fab00..e6defdef1a 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl @@ -53,7 +53,7 @@ void main() { { gl_FragDepth = gl_FragCoord.z - index / 1000.0; } - stencil_value.r = index; + stencil_value.rgb = vec3(index); stencil_value.a = 1.0; frag_color = color; if (fill_all == 1.0) return; From bffbc2279446cca6a2f0a8acf1671810fb15492a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 22:39:24 +0000 Subject: [PATCH 052/106] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- example_scenes/test_new.py | 7 +++---- manim/mobject/svg/svg_mobject.py | 10 +++++++++- manim/renderer/opengl_renderer.py | 1 - 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/example_scenes/test_new.py b/example_scenes/test_new.py index 145a7f329c..df573bd271 100644 --- a/example_scenes/test_new.py +++ b/example_scenes/test_new.py @@ -6,8 +6,6 @@ from pyglet import shapes from pyglet.gl import Config from pyglet.window import Window -from manim.mobject.text.numbers import DecimalNumber -from manim.mobject.text.text_mobject import Text import manim.utils.color.manim_colors as col from manim._config import config, tempconfig @@ -17,6 +15,8 @@ from manim.mobject.geometry.polygram import Square from manim.mobject.logo import ManimBanner from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject +from manim.mobject.text.numbers import DecimalNumber +from manim.mobject.text.text_mobject import Text from manim.renderer.opengl_renderer import OpenGLRenderer if __name__ == "__main__": @@ -66,7 +66,7 @@ clock = pyglet.clock.get_default() def update_circle(dt): - vm.move_to((np.sin(dt)*4, np.cos(dt)*4, -1)) + vm.move_to((np.sin(dt) * 4, np.cos(dt) * 4, -1)) def p2m(x, y, z): from manim._config import config @@ -103,7 +103,6 @@ def on_draw(): renderer.render(camera, [vm, vm2, vm3, vm4, fps]) # update_circle(counter) - @win.event def on_resize(width, height): super(Window, win).on_resize(width, height) diff --git a/manim/mobject/svg/svg_mobject.py b/manim/mobject/svg/svg_mobject.py index 82d349d525..fa74cc9f79 100644 --- a/manim/mobject/svg/svg_mobject.py +++ b/manim/mobject/svg/svg_mobject.py @@ -110,7 +110,15 @@ def __init__( use_svg_cache: bool = True, **kwargs, ): - super().__init__(color=color, stroke_color=stroke_color,stroke_opacity=stroke_opacity, stroke_width=stroke_width, fill_opacity=fill_opacity, fill_color=fill_color, **kwargs) + super().__init__( + color=color, + stroke_color=stroke_color, + stroke_opacity=stroke_opacity, + stroke_width=stroke_width, + fill_opacity=fill_opacity, + fill_color=fill_color, + **kwargs, + ) # process keyword arguments self.file_name = Path(file_name) if file_name is not None else None diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index ba6eafbecb..fa4e6673af 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -268,7 +268,6 @@ def __init__( ] ) - # Preparing vmobject shader logger.debug("Initializing Shader Programs") self.vmobject_fill_program = load_shader_program_by_folder( From e50b82fea7b8bfa2b08385a8eb5436fb13c78484 Mon Sep 17 00:00:00 2001 From: MrDiver Date: Fri, 15 Sep 2023 00:43:38 +0200 Subject: [PATCH 053/106] add comment --- manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl index 59b34de583..879c275963 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl @@ -108,10 +108,12 @@ void main() { // same plane so we discard the fragment if (previous_index > index) { + // But for stroke transparency we shouldn't discard but move the stroke in front so it is not discarded by the depth test + // TODO: This is highly experimental and should later be rethought and if no good solution is found it should just be a discard; if (color.a == 1.0) - discard; + discard; else - gl_FragDepth = gl_FragCoord.z - 3*index / 1000.0; + gl_FragDepth = gl_FragCoord.z - 3*index / 1000.0; } if (uv_stroke_width == 0) discard; From d98ba1cf5194ca806165244b899a6d06bb4907e0 Mon Sep 17 00:00:00 2001 From: "Jason G. Villanueva" Date: Tue, 3 Oct 2023 12:58:38 -0700 Subject: [PATCH 054/106] Progress thus far on uniform block/buffer/layouts --- manim/camera/camera.py | 22 ++ manim/renderer/buffers/__init__.py | 0 manim/renderer/buffers/buffer.py | 292 ++++++++++++++++++ manim/renderer/buffers/ubo.py | 25 ++ manim/renderer/opengl_renderer.py | 22 +- .../include/camera_uniform_declarations.glsl | 24 +- .../shaders/quadratic_bezier_fill/geom.glsl | 4 +- 7 files changed, 370 insertions(+), 19 deletions(-) create mode 100644 manim/renderer/buffers/__init__.py create mode 100644 manim/renderer/buffers/buffer.py create mode 100644 manim/renderer/buffers/ubo.py diff --git a/manim/camera/camera.py b/manim/camera/camera.py index 413ce60c89..b6fb16bc70 100644 --- a/manim/camera/camera.py +++ b/manim/camera/camera.py @@ -24,6 +24,7 @@ from manim.mobject.opengl.opengl_mobject import OpenGLMobject, OpenGLPoint from manim.utils.color import BLACK, color_to_rgba +from ..renderer.buffers.ubo import UniformBufferObject from ..constants import * from ..utils.config_ops import _Data from ..utils.simple_functions import fdiv @@ -44,6 +45,27 @@ def __init__( self.focal_dist_to_height = focal_dist_to_height self.orientation = Rotation.identity().as_quat() super().__init__(**kwargs) + self.ubo = UniformBufferObject( + name="ubo_camera", + fields=[ + "vec2 frame_shape", + "vec3 camera_center", + "mat3 camera_rotation", + "float is_fixed_in_frame", + "float is_fixed_orientation", + "vec3 fixed_orientation_center", + "float focal_distance", + ], + data={ + "frame_shape": frame_shape, + "camera_center": tuple(self.get_center()), + "camera_rotation": tuple(np.array(self.get_inverse_camera_rotation_matrix()).T.flatten()), + "is_fixed_in_frame": 0.0, + "is_fixed_orientation": 0.0, + "fixed_orientation_center": (0, 0, 0), + "focal_distance": self.get_focal_distance(), + } + ) def init_uniforms(self): super().init_uniforms() diff --git a/manim/renderer/buffers/__init__.py b/manim/renderer/buffers/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/manim/renderer/buffers/buffer.py b/manim/renderer/buffers/buffer.py new file mode 100644 index 0000000000..89cc1d6552 --- /dev/null +++ b/manim/renderer/buffers/buffer.py @@ -0,0 +1,292 @@ +import moderngl +import numpy as np +import re + +from enum import Enum + + +class BufferLayout(Enum): + PACKED = 0 + STD140 = 1 + +class BufferFormat: + + def __init__( + self, + *, + name: str, + shape: tuple[int, ...] + ) -> None: + super().__init__() + self._name_ = name + self._shape_ = shape + + @staticmethod + def _name_() -> str: + return "" + + @staticmethod + def _shape_() -> tuple[int, ...]: + return () + + @staticmethod + def _itemsize_() -> int: + # Implemented in subclasses. + return 0 + + @staticmethod + def _size_( + shape: tuple[int, ...] + ) -> int: + return int(np.prod(shape, dtype=np.int32)) + + @staticmethod + def _nbytes_( + itemsize: int, + size: int + ) -> int: + return itemsize * size + + @staticmethod + def _is_empty_( + size: int + ) -> bool: + return not size + + @staticmethod + def _dtype_() -> np.dtype: + # Implemented in subclasses. + return np.dtype("f4") + + @staticmethod + def _pointers_() -> tuple[tuple[tuple[str, ...], int], ...]: + # Implemented in subclasses. + return () + + def _get_np_buffer_and_pointers(self) -> tuple[np.ndarray, dict[str, tuple[np.ndarray, int]]]: + + def get_np_buffer_pointer( + np_buffer: np.ndarray, + name_chain: list[str] + ) -> np.ndarray: + if not name_chain: + return np_buffer["_"] + name = name_chain.pop(0) + return get_np_buffer_pointer(np_buffer[name], name_chain) + + np_buffer = np.zeros(self._shape_, dtype=self._dtype_) + np_buffer_pointers = { + ".".join(name_chain): (get_np_buffer_pointer(np_buffer, list(name_chain)), base_ndim) + for name_chain, base_ndim in self._pointers_ + } + return np_buffer, np_buffer_pointers + + def _write( + self, + data_dict: dict[str, np.ndarray] + ) -> bytes: + np_buffer, np_buffer_pointers = self._get_np_buffer_and_pointers() + for key, (np_buffer_pointer, base_ndim) in np_buffer_pointers.items(): + data = data_dict[key] + if not np_buffer_pointer.size: + assert not data.size + continue + data_expanded = np.expand_dims(data, axis=tuple(range(-2, -base_ndim))) + assert np_buffer_pointer.shape == data_expanded.shape + np_buffer_pointer[...] = data_expanded + return np_buffer.tobytes() + + def _read( + self, + data_bytes: bytes + ) -> dict[str, np.ndarray]: + data_dict: dict[str, np.ndarray] = {} + np_buffer, np_buffer_pointers = self._get_np_buffer_and_pointers() + np_buffer[...] = np.frombuffer(data_bytes, dtype=np_buffer.dtype).reshape(np_buffer.shape) + for key, (np_buffer_pointer, base_ndim) in np_buffer_pointers.items(): + data_expanded = np_buffer_pointer[...] + data = np.squeeze(data_expanded, axis=tuple(range(-2, -base_ndim))) + data_dict[key] = data + return data_dict + +class StructuredBufferFormat(BufferFormat): + + def __init__( + self, + *, + name: str, + shape: tuple[int, ...], + children: list[BufferFormat], + layout: BufferLayout + ) -> None: + structured_base_alignment = 16 + offsets: list[int] = [] + offset: int = 0 + for child in children: + if layout == BufferLayout.STD140: + if isinstance(child, StructuredBufferFormat): + base_alignment = structured_base_alignment + else: + raise TypeError + offset += (-offset) % base_alignment + offsets.append(offset) + offset += child._nbytes_ + if layout == BufferLayout.STD140: + offset += (-offset) % structured_base_alignment + + super().__init__( + name=name, + shape=shape + ) + self._children_ = tuple(children) + self._offsets_ = tuple(offsets) + self._itemsize_ = offset + + @staticmethod + def _children_() -> tuple[BufferFormat, ...]: + return () + + @staticmethod + def _offsets_() -> tuple[int, ...]: + return () + + @staticmethod + def _dtype_( + children__name: tuple[str, ...], + children__dtype: tuple[np.dtype, ...], + children__shape: tuple[tuple[int, ...], ...], + offsets: tuple[int, ...], + itemsize: int + ) -> np.dtype: + return np.dtype({ + "names": children__name, + "formats": list(zip(children__dtype, children__shape, strict=True)), + "offsets": list(offsets), + "itemsize": itemsize + }) + + @staticmethod + def _pointers_( + children__name: tuple[str, ...], + children__pointers: tuple[tuple[tuple[tuple[str, ...], int], ...], ...] + ) -> tuple[tuple[tuple[str, ...], int], ...]: + return tuple( + ((child_name,) + name_chain, base_ndim) + for child_name, child_pointers in zip(children__name, children__pointers, strict=True) + for name_chain, base_ndim in child_pointers + ) + +class Buffer: + + def __init__( + self, + field: str, + child_structs: dict[str, list[str]] | None, + array_lens: dict[str, int] | None + ) -> None: + super().__init__() + self._field_ = field + if child_structs is not None: + self._child_struct_items_ = tuple( + (name, tuple(child_struct_fields)) + for name, child_struct_fields in child_structs.items() + ) + if array_lens is not None: + self._array_len_items_ = tuple(array_lens.items()) + + @staticmethod + def _field_() -> str: + return "" + + @staticmethod + def _child_struct_items_() -> tuple[tuple[str, tuple[str, ...]], ...]: + return () + + @staticmethod + def _array_len_items_() -> tuple[tuple[str, int], ...]: + return () + + @staticmethod + def _layout_() -> BufferLayout: + return BufferLayout.PACKED + + @staticmethod + def _buffer_format_( + field: str, + child_struct_items: tuple[tuple[str, tuple[str, ...]], ...], + array_len_items: tuple[tuple[str, int], ...], + layout: BufferLayout + ) -> BufferFormat: + + def parse_field_str( + field_str: str, + array_lens_dict: dict[str, int] + ) -> tuple[str, str, tuple[int, ...]]: + pattern = re.compile(r""" + (?P\w+?) + \s + (?P\w+?) + (?P(\[\w+?\])*) + """, flags=re.VERBOSE) + match_obj = pattern.fullmatch(field_str) + assert match_obj is not None + dtype_str = match_obj.group("dtype_str") + name = match_obj.group("name") + shape = tuple( + int(s) if re.match(r"^\d+$", s := index_match.group(1)) is not None else array_lens_dict[s] + for index_match in re.finditer(r"\[(\w+?)\]", match_obj.group("shape")) + ) + return (dtype_str, name, shape) + + def get_buffer_format( + field: str, + child_structs_dict: dict[str, tuple[str, ...]], + array_lens_dict: dict[str, int] + ) -> BufferFormat: + dtype_str, name, shape = parse_field_str(field, array_lens_dict) + child_struct_fields = child_structs_dict.get(dtype_str) + return StructuredBufferFormat( + + name=name, + shape=shape, + children=[ + get_buffer_format( + child_struct_field, + child_structs_dict, + array_lens_dict + ) + for child_struct_field in child_struct_fields + ], + layout=layout + ) + + return get_buffer_format( + field, + dict(child_struct_items), + dict(array_len_items) + ) + + @staticmethod + def _buffer_pointer_keys_( + buffer_format__pointers: tuple[tuple[tuple[str, ...], int], ...] + ) -> tuple[str, ...]: + return tuple(".".join(name_chain) for name_chain, _ in buffer_format__pointers) + + + @staticmethod + def _data_dict_() -> dict[str, np.ndarray]: + return {} + + @staticmethod + def _buffer_( + ctx: moderngl.Context, + data_dict: dict[str, np.ndarray], + buffer_format: BufferFormat + ) -> moderngl.Buffer: + return ctx.buffer(data=buffer_format._write(data_dict)) + + def write( + self, + data_dict: dict[str, np.ndarray] + ) -> None: + self._data_dict_ = data_dict \ No newline at end of file diff --git a/manim/renderer/buffers/ubo.py b/manim/renderer/buffers/ubo.py new file mode 100644 index 0000000000..0b033a1bad --- /dev/null +++ b/manim/renderer/buffers/ubo.py @@ -0,0 +1,25 @@ +import numpy as np + +from .buffer import Buffer + +class UniformBufferObject(Buffer): + def __init__( + self, + *, + name: str, + fields: list[str], + child_structs: dict[str, list[str]] | None = None, + array_lens: dict[str, int] | None = None, + data: dict[str, np.ndarray] + ) -> None: + if child_structs is None: + child_structs = {} + super().__init__( + field=f"__UniformBlockStruct__ {name}", + child_structs={ + "__UniformBlockStruct__": fields, + **child_structs + }, + array_lens=array_lens + ) + self.write(data) \ No newline at end of file diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index fa4e6673af..68f32aec3a 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -208,7 +208,6 @@ def __init__( substitute_output_fbo: gl.Framebuffer | None = None, ) -> None: super().__init__() - logger.debug("Initializing OpenGLRenderer") self.pixel_width = pixel_width self.pixel_height = pixel_height self.samples = samples @@ -282,16 +281,19 @@ def use_window(self): self.output_fbo = self.ctx.detect_framebuffer() def init_camera(self, camera: OpenGLCameraFrame): - uniforms = dict() - uniforms["frame_shape"] = camera.frame_shape + # uniforms = dict() + # uniforms["frame_shape"] = camera.frame_shape + # uniforms["focal_distance"] = camera.get_focal_distance() + # uniforms["camera_center"] = tuple(camera.get_center()) + # uniforms["camera_rotation"] = tuple( + # np.array(camera.get_inverse_camera_rotation_matrix()).T.flatten() + # ) + # uniforms["light_source_position"] = (-10, 10, 10) + # uniforms["anti_alias_width"] = 0.01977 + uniforms = camera.ubo._data_dict_ + print("UNIS",uniforms) uniforms["pixel_shape"] = (self.pixel_width, self.pixel_height) - uniforms["focal_distance"] = camera.get_focal_distance() - uniforms["camera_center"] = tuple(camera.get_center()) - uniforms["camera_rotation"] = tuple( - np.array(camera.get_inverse_camera_rotation_matrix()).T.flatten() - ) - uniforms["light_source_position"] = (-10, 10, 10) - uniforms["anti_alias_width"] = 0.01977 + # TODO: convert to singular 4x4 matrix after getting *something* to render # self.vmobject_fill_program['view'].value = camera.get_view()? ProgramManager.write_uniforms(self.vmobject_fill_program, uniforms) diff --git a/manim/renderer/shaders/include/camera_uniform_declarations.glsl b/manim/renderer/shaders/include/camera_uniform_declarations.glsl index 29418c8efb..a69a534ea7 100644 --- a/manim/renderer/shaders/include/camera_uniform_declarations.glsl +++ b/manim/renderer/shaders/include/camera_uniform_declarations.glsl @@ -1,7 +1,17 @@ -uniform vec2 frame_shape; -uniform vec3 camera_center; -uniform mat3 camera_rotation; -uniform float is_fixed_in_frame; -uniform float is_fixed_orientation; -uniform vec3 fixed_orientation_center; -uniform float focal_distance; +layout (std140) uniform ubo_camera { + vec2 frame_shape; + vec3 camera_center; + mat3 camera_rotation; + float is_fixed_in_frame; + float is_fixed_orientation; + vec3 fixed_orientation_center; + float focal_distance; +}; +// uniform vec2 frame_shape; +// uniform vec3 camera_center; +// uniform mat3 camera_rotation; +// uniform float is_fixed_in_frame; +// uniform float is_fixed_orientation; +// uniform vec3 fixed_orientation_center; +// uniform float focal_distance; + diff --git a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl index 82cf2f55a1..f9c85d8720 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl @@ -9,8 +9,8 @@ uniform float anti_alias_width; uniform vec2 frame_shape; uniform float focal_distance; uniform float is_fixed_in_frame; -uniform float is_fixed_orientation; -uniform vec3 fixed_orientation_center; +// uniform float is_fixed_orientation; +// uniform vec3 fixed_orientation_center; // Needed for finalize_color uniform vec3 light_source_position; uniform float gloss; From feff6ba8bce71067526a7f087b8180f0bcbbd7e5 Mon Sep 17 00:00:00 2001 From: "Jason G. Villanueva" Date: Tue, 3 Oct 2023 13:14:34 -0700 Subject: [PATCH 055/106] Added YishiMichael's suggestion on missed declaration --- .../renderer/shaders/quadratic_bezier_fill/geom.glsl | 7 ++++--- .../shaders/quadratic_bezier_stroke/geom.glsl | 12 +++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl index f9c85d8720..0f3bc27dcb 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl @@ -6,9 +6,9 @@ layout (triangle_strip, max_vertices = 5) out; uniform float anti_alias_width; // Needed for get_gl_Position -uniform vec2 frame_shape; -uniform float focal_distance; -uniform float is_fixed_in_frame; +// uniform vec2 frame_shape; +// uniform float focal_distance; +// uniform float is_fixed_in_frame; // uniform float is_fixed_orientation; // uniform vec3 fixed_orientation_center; // Needed for finalize_color @@ -30,6 +30,7 @@ out vec2 uv_coords; out float bezier_degree; // Analog of import for manim only +#include ../include/camera_uniform_declarations.glsl #include ../include/quadratic_bezier_geometry_functions.glsl #include ../include/get_gl_Position.glsl #include ../include/get_unit_normal.glsl diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl index 210396e898..164e479db3 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl @@ -4,9 +4,9 @@ layout (triangles) in; layout (triangle_strip, max_vertices = 5) out; // Needed for get_gl_Position -uniform vec2 frame_shape; -uniform float focal_distance; -uniform vec3 fixed_orientation_center; +// uniform vec2 frame_shape; +// uniform float focal_distance; +// uniform vec3 fixed_orientation_center; uniform float anti_alias_width; uniform float flat_stroke; @@ -17,8 +17,8 @@ uniform float gloss; uniform float shadow; uniform float joint_type; uniform float reflectiveness; -uniform float is_fixed_in_frame; -uniform float is_fixed_orientation; +// uniform float is_fixed_in_frame; +// uniform float is_fixed_orientation; in vec3 bp[3]; in vec3 prev_bp[3]; @@ -52,6 +52,8 @@ const float MITER_JOINT = 3; const float PI = 3.141592653; + +#include ../include/camera_uniform_declarations.glsl #include ../include/quadratic_bezier_geometry_functions.glsl #include ../include/get_gl_Position.glsl #include ../include/get_unit_normal.glsl From 985141f5ea9e91f202b4e3f4ee873424f3830d58 Mon Sep 17 00:00:00 2001 From: "Jason G. Villanueva" Date: Tue, 24 Oct 2023 04:41:19 -0700 Subject: [PATCH 056/106] Implemented a rudimentary UniformBufferObject compatible with the STD140 memory layout --- manim/camera/camera.py | 22 -- manim/renderer/buffers/buffer.py | 360 ++++-------------- manim/renderer/buffers/ubo.py | 25 -- manim/renderer/opengl_renderer.py | 47 ++- .../include/camera_uniform_declarations.glsl | 13 +- 5 files changed, 112 insertions(+), 355 deletions(-) delete mode 100644 manim/renderer/buffers/ubo.py diff --git a/manim/camera/camera.py b/manim/camera/camera.py index b6fb16bc70..413ce60c89 100644 --- a/manim/camera/camera.py +++ b/manim/camera/camera.py @@ -24,7 +24,6 @@ from manim.mobject.opengl.opengl_mobject import OpenGLMobject, OpenGLPoint from manim.utils.color import BLACK, color_to_rgba -from ..renderer.buffers.ubo import UniformBufferObject from ..constants import * from ..utils.config_ops import _Data from ..utils.simple_functions import fdiv @@ -45,27 +44,6 @@ def __init__( self.focal_dist_to_height = focal_dist_to_height self.orientation = Rotation.identity().as_quat() super().__init__(**kwargs) - self.ubo = UniformBufferObject( - name="ubo_camera", - fields=[ - "vec2 frame_shape", - "vec3 camera_center", - "mat3 camera_rotation", - "float is_fixed_in_frame", - "float is_fixed_orientation", - "vec3 fixed_orientation_center", - "float focal_distance", - ], - data={ - "frame_shape": frame_shape, - "camera_center": tuple(self.get_center()), - "camera_rotation": tuple(np.array(self.get_inverse_camera_rotation_matrix()).T.flatten()), - "is_fixed_in_frame": 0.0, - "is_fixed_orientation": 0.0, - "fixed_orientation_center": (0, 0, 0), - "focal_distance": self.get_focal_distance(), - } - ) def init_uniforms(self): super().init_uniforms() diff --git a/manim/renderer/buffers/buffer.py b/manim/renderer/buffers/buffer.py index 89cc1d6552..b1b1a76b44 100644 --- a/manim/renderer/buffers/buffer.py +++ b/manim/renderer/buffers/buffer.py @@ -1,292 +1,80 @@ -import moderngl import numpy as np -import re - -from enum import Enum - - -class BufferLayout(Enum): - PACKED = 0 - STD140 = 1 - -class BufferFormat: - - def __init__( - self, - *, - name: str, - shape: tuple[int, ...] - ) -> None: - super().__init__() - self._name_ = name - self._shape_ = shape - - @staticmethod - def _name_() -> str: - return "" - - @staticmethod - def _shape_() -> tuple[int, ...]: - return () - - @staticmethod - def _itemsize_() -> int: - # Implemented in subclasses. - return 0 - - @staticmethod - def _size_( - shape: tuple[int, ...] - ) -> int: - return int(np.prod(shape, dtype=np.int32)) - - @staticmethod - def _nbytes_( - itemsize: int, - size: int - ) -> int: - return itemsize * size - - @staticmethod - def _is_empty_( - size: int - ) -> bool: - return not size - - @staticmethod - def _dtype_() -> np.dtype: - # Implemented in subclasses. - return np.dtype("f4") - - @staticmethod - def _pointers_() -> tuple[tuple[tuple[str, ...], int], ...]: - # Implemented in subclasses. - return () - - def _get_np_buffer_and_pointers(self) -> tuple[np.ndarray, dict[str, tuple[np.ndarray, int]]]: - - def get_np_buffer_pointer( - np_buffer: np.ndarray, - name_chain: list[str] - ) -> np.ndarray: - if not name_chain: - return np_buffer["_"] - name = name_chain.pop(0) - return get_np_buffer_pointer(np_buffer[name], name_chain) - - np_buffer = np.zeros(self._shape_, dtype=self._dtype_) - np_buffer_pointers = { - ".".join(name_chain): (get_np_buffer_pointer(np_buffer, list(name_chain)), base_ndim) - for name_chain, base_ndim in self._pointers_ - } - return np_buffer, np_buffer_pointers - - def _write( - self, - data_dict: dict[str, np.ndarray] - ) -> bytes: - np_buffer, np_buffer_pointers = self._get_np_buffer_and_pointers() - for key, (np_buffer_pointer, base_ndim) in np_buffer_pointers.items(): - data = data_dict[key] - if not np_buffer_pointer.size: - assert not data.size - continue - data_expanded = np.expand_dims(data, axis=tuple(range(-2, -base_ndim))) - assert np_buffer_pointer.shape == data_expanded.shape - np_buffer_pointer[...] = data_expanded - return np_buffer.tobytes() - - def _read( - self, - data_bytes: bytes - ) -> dict[str, np.ndarray]: - data_dict: dict[str, np.ndarray] = {} - np_buffer, np_buffer_pointers = self._get_np_buffer_and_pointers() - np_buffer[...] = np.frombuffer(data_bytes, dtype=np_buffer.dtype).reshape(np_buffer.shape) - for key, (np_buffer_pointer, base_ndim) in np_buffer_pointers.items(): - data_expanded = np_buffer_pointer[...] - data = np.squeeze(data_expanded, axis=tuple(range(-2, -base_ndim))) - data_dict[key] = data - return data_dict - -class StructuredBufferFormat(BufferFormat): +import math + + +class STD140BufferFormat: + _GL_DTYPES: dict[str, tuple[str, int, tuple[int, ...]]] = { + "int": ("i", np.float32, (1,)), + "ivec2": ("i", np.float32, (2,)), + "ivec3": ("i", np.float32, (3,)), + "ivec4": ("i", np.float32, (4,)), + "uint": ("u", np.float32, (1,)), + "uvec2": ("u", np.float32, (2,)), + "uvec3": ("u", np.float32, (3,)), + "uvec4": ("u", np.float32, (4,)), + "float": ("f", np.float32, (1,)), + "vec2": ("f", np.float32, (2, 1)), + "vec3": ("f", np.float32, (3, 1)), + "vec4": ("f", np.float32, (4, 1)), + "mat2": ("f", np.float32, (2, 2)), + "mat2x3": ("f", np.float32, (2, 3)), # TODO: check order + "mat2x4": ("f", np.float32, (2, 4)), + "mat3x2": ("f", np.float32, (3, 2)), + "mat3": ("f", np.float32, (3, 3)), + "mat3x4": ("f", np.float32, (3, 4)), + "mat4x2": ("f", np.float32, (4, 2)), + "mat4x3": ("f", np.float32, (4, 3)), + "mat4": ("f", np.float32, (4, 4)), + "double": ("f", np.float64, (1,)), + "dvec2": ("f", np.float64, (2,)), + "dvec3": ("f", np.float64, (3,)), + "dvec4": ("f", np.float64, (4,)), + "dmat2": ("f", np.float64, (2, 2)), + "dmat2x3": ("f", np.float64, (2, 3)), + "dmat2x4": ("f", np.float64, (2, 4)), + "dmat3x2": ("f", np.float64, (3, 2)), + "dmat3": ("f", np.float64, (3, 3)), + "dmat3x4": ("f", np.float64, (3, 4)), + "dmat4x2": ("f", np.float64, (4, 2)), + "dmat4x3": ("f", np.float64, (4, 3)), + "dmat4": ("f", np.float64, (4, 4)), + } def __init__( self, - *, name: str, - shape: tuple[int, ...], - children: list[BufferFormat], - layout: BufferLayout - ) -> None: - structured_base_alignment = 16 - offsets: list[int] = [] - offset: int = 0 - for child in children: - if layout == BufferLayout.STD140: - if isinstance(child, StructuredBufferFormat): - base_alignment = structured_base_alignment - else: - raise TypeError - offset += (-offset) % base_alignment - offsets.append(offset) - offset += child._nbytes_ - if layout == BufferLayout.STD140: - offset += (-offset) % structured_base_alignment - - super().__init__( - name=name, - shape=shape - ) - self._children_ = tuple(children) - self._offsets_ = tuple(offsets) - self._itemsize_ = offset - - @staticmethod - def _children_() -> tuple[BufferFormat, ...]: - return () - - @staticmethod - def _offsets_() -> tuple[int, ...]: - return () - - @staticmethod - def _dtype_( - children__name: tuple[str, ...], - children__dtype: tuple[np.dtype, ...], - children__shape: tuple[tuple[int, ...], ...], - offsets: tuple[int, ...], - itemsize: int - ) -> np.dtype: - return np.dtype({ - "names": children__name, - "formats": list(zip(children__dtype, children__shape, strict=True)), - "offsets": list(offsets), - "itemsize": itemsize - }) - - @staticmethod - def _pointers_( - children__name: tuple[str, ...], - children__pointers: tuple[tuple[tuple[tuple[str, ...], int], ...], ...] - ) -> tuple[tuple[tuple[str, ...], int], ...]: - return tuple( - ((child_name,) + name_chain, base_ndim) - for child_name, child_pointers in zip(children__name, children__pointers, strict=True) - for name_chain, base_ndim in child_pointers - ) - -class Buffer: - - def __init__( - self, - field: str, - child_structs: dict[str, list[str]] | None, - array_lens: dict[str, int] | None - ) -> None: - super().__init__() - self._field_ = field - if child_structs is not None: - self._child_struct_items_ = tuple( - (name, tuple(child_struct_fields)) - for name, child_struct_fields in child_structs.items() - ) - if array_lens is not None: - self._array_len_items_ = tuple(array_lens.items()) - - @staticmethod - def _field_() -> str: - return "" - - @staticmethod - def _child_struct_items_() -> tuple[tuple[str, tuple[str, ...]], ...]: - return () - - @staticmethod - def _array_len_items_() -> tuple[tuple[str, int], ...]: - return () - - @staticmethod - def _layout_() -> BufferLayout: - return BufferLayout.PACKED - - @staticmethod - def _buffer_format_( - field: str, - child_struct_items: tuple[tuple[str, tuple[str, ...]], ...], - array_len_items: tuple[tuple[str, int], ...], - layout: BufferLayout - ) -> BufferFormat: - - def parse_field_str( - field_str: str, - array_lens_dict: dict[str, int] - ) -> tuple[str, str, tuple[int, ...]]: - pattern = re.compile(r""" - (?P\w+?) - \s - (?P\w+?) - (?P(\[\w+?\])*) - """, flags=re.VERBOSE) - match_obj = pattern.fullmatch(field_str) - assert match_obj is not None - dtype_str = match_obj.group("dtype_str") - name = match_obj.group("name") - shape = tuple( - int(s) if re.match(r"^\d+$", s := index_match.group(1)) is not None else array_lens_dict[s] - for index_match in re.finditer(r"\[(\w+?)\]", match_obj.group("shape")) - ) - return (dtype_str, name, shape) - - def get_buffer_format( - field: str, - child_structs_dict: dict[str, tuple[str, ...]], - array_lens_dict: dict[str, int] - ) -> BufferFormat: - dtype_str, name, shape = parse_field_str(field, array_lens_dict) - child_struct_fields = child_structs_dict.get(dtype_str) - return StructuredBufferFormat( - - name=name, - shape=shape, - children=[ - get_buffer_format( - child_struct_field, - child_structs_dict, - array_lens_dict - ) - for child_struct_field in child_struct_fields - ], - layout=layout - ) - - return get_buffer_format( - field, - dict(child_struct_items), - dict(array_len_items) - ) - - @staticmethod - def _buffer_pointer_keys_( - buffer_format__pointers: tuple[tuple[tuple[str, ...], int], ...] - ) -> tuple[str, ...]: - return tuple(".".join(name_chain) for name_chain, _ in buffer_format__pointers) - - - @staticmethod - def _data_dict_() -> dict[str, np.ndarray]: - return {} - - @staticmethod - def _buffer_( - ctx: moderngl.Context, - data_dict: dict[str, np.ndarray], - buffer_format: BufferFormat - ) -> moderngl.Buffer: - return ctx.buffer(data=buffer_format._write(data_dict)) - - def write( - self, - data_dict: dict[str, np.ndarray] + struct: tuple[(str, str), ...], ) -> None: - self._data_dict_ = data_dict \ No newline at end of file + self.dtype = [] + self._offsets = dict() + byte_offset = 0 + for data_type, var_name in struct: + base_char, base_bytesize, shape = self._GL_DTYPES[data_type] + shape = dict(enumerate(shape)) + col_len, row_len = shape.get(0, 1), shape.get(1, 1) + col_padding = 0 if row_len == 1 and col_len == 1 else 4 - col_len + self._offsets[var_name] = col_padding + shape = (col_len + col_padding,) + if row_len > 1: + shape = (row_len,) + shape + final_shape = shape + if byte_offset % 16 != 0 and col_len != 1: + padding_for_alignment = (((16 - byte_offset) % 16) // 4,) + self.dtype.append( + (f"padding-{byte_offset}", base_bytesize, padding_for_alignment) + ) + self.dtype.append((var_name, base_bytesize, final_shape)) + byte_offset += math.prod(final_shape + (base_bytesize(0).nbytes,)) + self.data = np.zeros(1, dtype=self.dtype) + + + def _write_padded(self, data, var: str) -> np.ndarray: + """Automatically adds padding to data if necessary. Used by write""" + try: + return np.pad(data, ((0, 0), (0, self._offsets[var])), mode="constant") + except: + return np.pad(data, ((0, self._offsets[var])), mode="constant") + + def write(self, data: dict) -> None: + for key, val in data.items(): + self.data[key] = self._write_padded(val, key) diff --git a/manim/renderer/buffers/ubo.py b/manim/renderer/buffers/ubo.py deleted file mode 100644 index 0b033a1bad..0000000000 --- a/manim/renderer/buffers/ubo.py +++ /dev/null @@ -1,25 +0,0 @@ -import numpy as np - -from .buffer import Buffer - -class UniformBufferObject(Buffer): - def __init__( - self, - *, - name: str, - fields: list[str], - child_structs: dict[str, list[str]] | None = None, - array_lens: dict[str, int] | None = None, - data: dict[str, np.ndarray] - ) -> None: - if child_structs is None: - child_structs = {} - super().__init__( - field=f"__UniformBlockStruct__ {name}", - child_structs={ - "__UniformBlockStruct__": fields, - **child_structs - }, - array_lens=array_lens - ) - self.write(data) \ No newline at end of file diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 68f32aec3a..1e267d9b10 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -9,6 +9,7 @@ import manim.constants as const import manim.utils.color.manim_colors as color +from manim.renderer.buffers.buffer import STD140BufferFormat from manim._config import config, logger from manim.camera.camera import OpenGLCameraFrame from manim.mobject.types.vectorized_mobject import VMobject @@ -24,6 +25,19 @@ import manim.utils.color.core as c from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject +ubo_camera = STD140BufferFormat( + "ubo_camera", + ( + ("vec2", "frame_shape"), + ("vec3", "camera_center"), + ("mat3", "camera_rotation"), + ("float", "focal_distance"), + ("float", "is_fixed_in_frame"), + ("float", "is_fixed_orientation"), + ("vec3", "fixed_orientation_center"), + ) +) + fill_dtype = [ ("point", np.float32, (3,)), ("unit_normal", np.float32, (3,)), @@ -193,6 +207,10 @@ def write_uniforms(prog, uniforms): if name in uniforms: member.value = uniforms[name] + @staticmethod + def bind_to_uniform_block(uniform_buffer_object: gl.Buffer, idx: int = 0): + uniform_buffer_object.bind_to_uniform_block(idx) + class OpenGLRenderer(Renderer): pixel_array_dtype = np.uint8 @@ -217,7 +235,7 @@ def __init__( # Initializing Context logger.debug("Initializing OpenGL context and framebuffers") - self.ctx = gl.create_context() + self.ctx: gl.Context = gl.create_context() # Those are the actual buffers that are used for rendering self.stencil_texture = self.ctx.texture( @@ -281,21 +299,26 @@ def use_window(self): self.output_fbo = self.ctx.detect_framebuffer() def init_camera(self, camera: OpenGLCameraFrame): - # uniforms = dict() - # uniforms["frame_shape"] = camera.frame_shape - # uniforms["focal_distance"] = camera.get_focal_distance() - # uniforms["camera_center"] = tuple(camera.get_center()) - # uniforms["camera_rotation"] = tuple( - # np.array(camera.get_inverse_camera_rotation_matrix()).T.flatten() - # ) - # uniforms["light_source_position"] = (-10, 10, 10) - # uniforms["anti_alias_width"] = 0.01977 - uniforms = camera.ubo._data_dict_ - print("UNIS",uniforms) + camera_data = { + "frame_shape": (14.2222222221, 8.0), + "camera_center": camera.get_center(), + "camera_rotation": camera.get_inverse_camera_rotation_matrix().T, + "focal_distance": camera.get_focal_distance(), + "is_fixed_in_frame": 0.0, + "is_fixed_orientation": 0.0, + "fixed_orientation_center": np.array([0.0, 0.0, 0.0]) + } + ubo_camera.write(camera_data) + + uniforms = dict() + uniforms["anti_alias_width"] = 0.01977 + uniforms["light_source_position"] = (-10, 10, 10) uniforms["pixel_shape"] = (self.pixel_width, self.pixel_height) + buffer = self.ctx.buffer(ubo_camera.data) # TODO: convert to singular 4x4 matrix after getting *something* to render # self.vmobject_fill_program['view'].value = camera.get_view()? + ProgramManager.bind_to_uniform_block(buffer) ProgramManager.write_uniforms(self.vmobject_fill_program, uniforms) ProgramManager.write_uniforms(self.vmobject_stroke_program, uniforms) diff --git a/manim/renderer/shaders/include/camera_uniform_declarations.glsl b/manim/renderer/shaders/include/camera_uniform_declarations.glsl index a69a534ea7..ae914a19a2 100644 --- a/manim/renderer/shaders/include/camera_uniform_declarations.glsl +++ b/manim/renderer/shaders/include/camera_uniform_declarations.glsl @@ -1,17 +1,10 @@ layout (std140) uniform ubo_camera { + // mat4 u_projection_view_matrix; # TODO: convert to mat4 instead of the following... vec2 frame_shape; vec3 camera_center; mat3 camera_rotation; + float focal_distance; float is_fixed_in_frame; float is_fixed_orientation; vec3 fixed_orientation_center; - float focal_distance; -}; -// uniform vec2 frame_shape; -// uniform vec3 camera_center; -// uniform mat3 camera_rotation; -// uniform float is_fixed_in_frame; -// uniform float is_fixed_orientation; -// uniform vec3 fixed_orientation_center; -// uniform float focal_distance; - +}; \ No newline at end of file From 393c2a15d4371f92838cff6fc779f17c06c2d61b Mon Sep 17 00:00:00 2001 From: "Jason G. Villanueva" Date: Tue, 24 Oct 2023 05:16:03 -0700 Subject: [PATCH 057/106] Small byte_offset bugfix for vec2 --- manim/renderer/buffers/buffer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/manim/renderer/buffers/buffer.py b/manim/renderer/buffers/buffer.py index b1b1a76b44..4e61ed8cbc 100644 --- a/manim/renderer/buffers/buffer.py +++ b/manim/renderer/buffers/buffer.py @@ -52,7 +52,7 @@ def __init__( base_char, base_bytesize, shape = self._GL_DTYPES[data_type] shape = dict(enumerate(shape)) col_len, row_len = shape.get(0, 1), shape.get(1, 1) - col_padding = 0 if row_len == 1 and col_len == 1 else 4 - col_len + col_padding = 0 if row_len == 1 and (col_len == 1 or col_len == 2) else 4 - col_len self._offsets[var_name] = col_padding shape = (col_len + col_padding,) if row_len > 1: @@ -63,6 +63,7 @@ def __init__( self.dtype.append( (f"padding-{byte_offset}", base_bytesize, padding_for_alignment) ) + byte_offset += padding_for_alignment[0]*4 self.dtype.append((var_name, base_bytesize, final_shape)) byte_offset += math.prod(final_shape + (base_bytesize(0).nbytes,)) self.data = np.zeros(1, dtype=self.dtype) @@ -77,4 +78,6 @@ def _write_padded(self, data, var: str) -> np.ndarray: def write(self, data: dict) -> None: for key, val in data.items(): + + # print("WRITING", key,val) self.data[key] = self._write_padded(val, key) From eb1ff92ccd34cf5417a328e5ae8b46af103e79c5 Mon Sep 17 00:00:00 2001 From: "Jason G. Villanueva" Date: Tue, 24 Oct 2023 21:06:01 -0700 Subject: [PATCH 058/106] Add some comments to the code, run black for formatting --- manim/renderer/buffers/buffer.py | 52 +++++++++++++++++++++++-------- manim/renderer/opengl_renderer.py | 12 +++---- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/manim/renderer/buffers/buffer.py b/manim/renderer/buffers/buffer.py index 4e61ed8cbc..70a4dbbc2c 100644 --- a/manim/renderer/buffers/buffer.py +++ b/manim/renderer/buffers/buffer.py @@ -46,38 +46,64 @@ def __init__( struct: tuple[(str, str), ...], ) -> None: self.dtype = [] - self._offsets = dict() - byte_offset = 0 + self._paddings = dict() # LUT for future writes + byte_offset = 0 # Track the offset so we can calculate padding for alignment -- NOTE: use RenderDoc to debug for data_type, var_name in struct: base_char, base_bytesize, shape = self._GL_DTYPES[data_type] shape = dict(enumerate(shape)) col_len, row_len = shape.get(0, 1), shape.get(1, 1) - col_padding = 0 if row_len == 1 and (col_len == 1 or col_len == 2) else 4 - col_len - self._offsets[var_name] = col_padding + # Calculate padding for NON (float/vec2) items + col_padding = ( + 0 if row_len == 1 and (col_len == 1 or col_len == 2) else 4 - col_len + ) + # Store padding in LUT + self._paddings[var_name] = col_padding shape = (col_len + col_padding,) if row_len > 1: shape = (row_len,) + shape final_shape = shape - if byte_offset % 16 != 0 and col_len != 1: + if ( + byte_offset % 16 != 0 and col_len != 1 + ): # Ensure NON (float/vec2) items are aligned to the next 16 bytes alignment padding_for_alignment = (((16 - byte_offset) % 16) // 4,) self.dtype.append( (f"padding-{byte_offset}", base_bytesize, padding_for_alignment) ) - byte_offset += padding_for_alignment[0]*4 + byte_offset += padding_for_alignment[0] * 4 # padding adds to offset self.dtype.append((var_name, base_bytesize, final_shape)) - byte_offset += math.prod(final_shape + (base_bytesize(0).nbytes,)) + byte_offset += math.prod( + final_shape + (base_bytesize(0).nbytes,) + ) # data adds to offset self.data = np.zeros(1, dtype=self.dtype) + def _write_padded(self, data: tuple | np.ndarray, var: str) -> np.ndarray: + """Automatically adds padding to data if necessary. Used internally by write - def _write_padded(self, data, var: str) -> np.ndarray: - """Automatically adds padding to data if necessary. Used by write""" + Parameters + ---------- + data : tuple | np.ndarray + tuple or numpy array containing int/float values + var : str + the variable name used to reference the data. used in LUT to determine required padding + + Returns + ------- + np.ndarray + the same data with 0 or 1 columns of 0s appended + """ try: - return np.pad(data, ((0, 0), (0, self._offsets[var])), mode="constant") + # This fails for 1D data (python or np.array) + return np.pad(data, ((0, 0), (0, self._paddings[var])), mode="constant") except: - return np.pad(data, ((0, self._offsets[var])), mode="constant") + return np.pad(data, ((0, self._paddings[var])), mode="constant") def write(self, data: dict) -> None: - for key, val in data.items(): + """Write a dictionary of key value pairs to the STD140BufferFormat's data attribute - # print("WRITING", key,val) + Parameters + ---------- + data : dict + keys/values in the dictionary must match the variable names/data shapes in the constructor + """ + for key, val in data.items(): self.data[key] = self._write_padded(val, key) diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 1e267d9b10..ef2f9fb482 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -9,7 +9,7 @@ import manim.constants as const import manim.utils.color.manim_colors as color -from manim.renderer.buffers.buffer import STD140BufferFormat +from manim.renderer.buffers.buffer import STD140BufferFormat from manim._config import config, logger from manim.camera.camera import OpenGLCameraFrame from manim.mobject.types.vectorized_mobject import VMobject @@ -28,14 +28,14 @@ ubo_camera = STD140BufferFormat( "ubo_camera", ( - ("vec2", "frame_shape"), - ("vec3", "camera_center"), - ("mat3", "camera_rotation"), + ("vec2", "frame_shape"), + ("vec3", "camera_center"), + ("mat3", "camera_rotation"), ("float", "focal_distance"), ("float", "is_fixed_in_frame"), ("float", "is_fixed_orientation"), ("vec3", "fixed_orientation_center"), - ) + ), ) fill_dtype = [ @@ -306,7 +306,7 @@ def init_camera(self, camera: OpenGLCameraFrame): "focal_distance": camera.get_focal_distance(), "is_fixed_in_frame": 0.0, "is_fixed_orientation": 0.0, - "fixed_orientation_center": np.array([0.0, 0.0, 0.0]) + "fixed_orientation_center": np.array([0.0, 0.0, 0.0]), } ubo_camera.write(camera_data) From 9b98fe5af25fae4688faa438d27e6e554653cc50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Manr=C3=ADquez=20Novoa?= <49853152+chopan050@users.noreply.github.com> Date: Mon, 27 Nov 2023 01:10:52 +0100 Subject: [PATCH 059/106] [EXPERIMENTAL] Mobject shader cleanup + Scene changes + Undo orientation input in vertex shader + Transparency Fix (#3474) * Updated Scene.remove * Updated Scene.replace * When shader file is missing, log its absolute path * Undo adding 'orientation' in vert.glsl, revert to 'unit_normal' in OpenGLVMobject * Added removed docstring to Scene.replace * Removed and rewrote multiple OpenGL(V)Mobject methods * Fixed OpenGLVMobject.get_style() * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fixing transparency and generator bug * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: MrDiver --- example_scenes/new_test_new.py | 162 +++++++++++ manim/mobject/opengl/opengl_mobject.py | 103 +------ .../opengl/opengl_vectorized_mobject.py | 256 +++--------------- manim/mobject/types/vectorized_mobject.py | 7 +- manim/renderer/buffers/buffer.py | 3 +- manim/renderer/opengl_renderer.py | 28 +- manim/renderer/shader_wrapper.py | 2 +- .../include/camera_uniform_declarations.glsl | 2 +- .../shaders/quadratic_bezier_fill/vert.glsl | 1 - .../shaders/quadratic_bezier_stroke/frag.glsl | 14 +- manim/scene/scene.py | 69 ++--- 11 files changed, 271 insertions(+), 376 deletions(-) create mode 100644 example_scenes/new_test_new.py diff --git a/example_scenes/new_test_new.py b/example_scenes/new_test_new.py new file mode 100644 index 0000000000..e196263ecc --- /dev/null +++ b/example_scenes/new_test_new.py @@ -0,0 +1,162 @@ +import time + +import numpy as np +import pyglet +from PIL import Image +from pyglet import shapes +from pyglet.gl import Config +from pyglet.window import Window + +import manim.utils.color.manim_colors as col +from manim._config import config, tempconfig +from manim.animation.creation import Create, DrawBorderThenFill, Write +from manim.animation.fading import FadeIn +from manim.animation.transform import Transform +from manim.camera.camera import OpenGLCameraFrame +from manim.constants import LEFT, OUT, RIGHT, UP +from manim.mobject.geometry.arc import Circle +from manim.mobject.geometry.polygram import Square +from manim.mobject.logo import ManimBanner +from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject +from manim.mobject.text.numbers import DecimalNumber +from manim.mobject.text.text_mobject import Text +from manim.renderer.opengl_renderer import OpenGLRenderer + + +def progress_through_animations(animations): + dt = t - last_t + last_t = t + for animation in animations: + animation.update_mobjects(dt) + alpha = t / animation.run_time + animation.interpolate(alpha) + self.update_frame(dt) + self.emit_frame() + + +if __name__ == "__main__": + with tempconfig({"renderer": "opengl"}): + win = Window( + width=1920, + height=1080, + vsync=True, + config=Config(double_buffer=True, samples=0), + ) + renderer = OpenGLRenderer(1920, 1080, background_color=col.GRAY) + # vm = OpenGLVMobject([col.RED, col.GREEN]) + vm = ( + Circle( + radius=1, + stroke_color=col.YELLOW, + ) + .shift(3 * RIGHT + OUT) + .set_opacity(0.6) + ) + vm2 = Square(stroke_color=col.GREEN, fill_opacity=0, stroke_opacity=1).move_to( + (0, 0, -0.5) + ) + vm3 = ManimBanner().set_opacity(0.6) + vm4 = ( + Circle(0.5, col.GREEN) + .set_opacity(0.6) + .shift(OUT) + .set_fill(col.BLUE, opacity=0.2) + ) + # vm.set_points_as_corners([[-1920/2, 0, 0], [1920/2, 0, 0], [0, 1080/2, 0]]) + # print(vm.color) + # print(vm.fill_color) + # print(vm.stroke_color) + + clock_mobject = DecimalNumber(0.0).shift(4 * LEFT + 2.5 * UP) + clock_mobject.fix_in_frame() + + camera = OpenGLCameraFrame() + camera.save_state() + # renderer.init_camera(camera) + + # renderer.render(camera, [vm, vm2]) + # image = renderer.get_pixels() + # print(image.shape) + # Image.fromarray(image, "RGBA").show() + # exit(0) + renderer.use_window() + + clock = pyglet.clock.get_default() + + def update_circle(dt): + vm.move_to((np.sin(dt) * 4, np.cos(dt) * 4, -1)) + + def p2m(x, y, z): + from manim._config import config + + return ( + config.frame_width * (x / config.pixel_width - 0.5), + config.frame_height * (y / config.pixel_height - 0.5), + z, + ) + + @win.event + def on_close(): + win.close() + + @win.event + def on_mouse_motion(x, y, dx, dy): + # vm.move_to((14.2222 * (x / 1920 - 0.5), 8 * (y / 1080 - 0.5), 0)) + # camera.move_to(p2m(x,y,camera.get_center()[2])) + from scipy.spatial.transform import Rotation + + camera.set_orientation( + Rotation.from_rotvec( + (-UP * (x / 1920 - 0.5) + RIGHT * (y / 1080 - 0.5)) * 2 * 3.1415 + ) + ) + # vm.set_color(col.RED.interpolate(col.GREEN,x/1920)) + # print(x,y) + + @win.event + def on_draw(): + dt = clock.update_time() + renderer.render(camera, [vm2, vm3, vm4, clock_mobject, vm]) + # update_circle(counter) + + @win.event + def on_resize(width, height): + super(Window, win).on_resize(width, height) + + # pyglet.app.run() + has_started = False + is_finished = False + + run_time = 5 + new_vm = Square(fill_color=col.GREEN, stroke_color=col.BLUE).shift( + 2.5 * RIGHT - UP + 2 * OUT + ) + animation = DrawBorderThenFill(vm3, run_time=run_time) + + real_time = 0 + virtual_time = 0 + start_timestamp = time.time() + dt = 1 / 30 + + while True: + # pyglet.app.platform_event_loop.step() + win.switch_to() + if not has_started: + animation.begin() + has_started = True + + real_time = time.time() - start_timestamp + while virtual_time < real_time: + virtual_time += dt + if not is_finished: + if virtual_time >= run_time: + animation.finish() + has_finished = True + else: + animation.update_mobjects(dt) + animation.interpolate(virtual_time / run_time) + # update_circle(virtual_time) + clock_mobject.set_value(virtual_time) + win.dispatch_event("on_draw") + win.dispatch_events() + win.flip() diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index e990e57484..5de786e785 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -174,10 +174,6 @@ def __init__( self.init_points() self.color = ManimColor.parse(color) self.init_colors() - self.init_shader_data() - - if self.depth_test: - self.apply_depth_test() @classmethod def __init_subclass__(cls, **kwargs): @@ -2639,8 +2635,6 @@ def align_data_and_family(self, mobject): self.align_data(mobject) def align_data(self, mobject) -> None: - # In case any data arrays get resized when aligned to shader data - self.refresh_shader_data() for mob1, mob2 in zip(self.get_family(), mobject.get_family()): # Separate out how points are treated so that subclasses # can handle that case differently if they choose @@ -2731,24 +2725,9 @@ def construct(self): self.add(dotL, dotR, dotMiddle) """ - for key in self.data: - if key in self.locked_data_keys: - continue - if len(self.data[key]) == 0: # type: ignore - continue - if key not in mobject1.data or key not in mobject2.data: - continue - - if key in ("points", "bounding_box"): - func = path_func - else: - func = interpolate - - self.data[key][:] = func(mobject1.data[key], mobject2.data[key], alpha) # type: ignore - for key in self.uniforms: - self.uniforms[key] = interpolate( # type: ignore - mobject1.uniforms[key], mobject2.uniforms[key], alpha - ) + # TODO: replace with list of attribute names with a locking system + self.points = path_func(mobject1.points, mobject2.points, alpha) + self.interpolate_color(mobject1, mobject2, alpha) return self def pointwise_become_partial(self, mobject, a, b): @@ -2906,44 +2885,36 @@ def has_same_shape_as(self, mobject: OpenGLMobject) -> bool: return bool(np.isclose(points1, points2).all()) # Operations touching shader uniforms - - @affects_shader_info_id def fix_in_frame(self) -> Self: self.uniforms["is_fixed_in_frame"] = float(1.0) self.is_fixed_in_frame = True return self - @affects_shader_info_id def fix_orientation(self) -> Self: self.uniforms["is_fixed_orientation"] = float(1.0) self.is_fixed_orientation = True self.fixed_orientation_center = tuple(self.get_center()) return self - @affects_shader_info_id def unfix_from_frame(self) -> Self: self.uniforms["is_fixed_in_frame"] = float(0.0) self.is_fixed_in_frame = False return self - @affects_shader_info_id def unfix_orientation(self): self.is_fixed_orientation = 0.0 self.fixed_orientation_center = (0, 0, 0) return self - @affects_shader_info_id def apply_depth_test(self): self.depth_test = True return self - @affects_shader_info_id def deactivate_depth_test(self): self.depth_test = False return self # Shader code manipulation - def replace_shader_code(self, old, new): # TODO, will this work with VMobject structure, given # that it does not simpler return shader_wrappers of @@ -2988,47 +2959,6 @@ def set_color_by_xyz_func( ) return self - # For shader data - def init_shader_data(self): - # TODO, only call this when needed? - self.shader_data = np.zeros(len(self.points), dtype=self.shader_dtype) - self.shader_indices = None - self.shader_wrapper = ShaderWrapper( - vert_data=self.shader_data, - shader_folder=self.shader_folder, - texture_paths=self.texture_paths, - depth_test=self.depth_test, - render_primitive=self.render_primitive, - ) - - def refresh_shader_wrapper_id(self): - self.shader_wrapper.refresh_id() - return self - - def get_shader_wrapper(self): - self.shader_wrapper.vert_data = self.get_shader_data() - self.shader_wrapper.vert_indices = self.get_shader_vert_indices() - self.shader_wrapper.uniforms = self.get_shader_uniforms() - self.shader_wrapper.depth_test = self.depth_test - return self.shader_wrapper - - def get_shader_wrapper_list(self): - shader_wrappers = it.chain( - [self.get_shader_wrapper()], - *(sm.get_shader_wrapper_list() for sm in self.submobjects), - ) - batches = batch_by_property(shader_wrappers, lambda sw: sw.get_id()) - - result = [] - for wrapper_group, _ in batches: - shader_wrapper = wrapper_group[0] - if not shader_wrapper.is_valid(): - continue - shader_wrapper.combine_with(*wrapper_group[1:]) - if len(shader_wrapper.vert_data) > 0: - result.append(shader_wrapper) - return result - def check_data_alignment(self, array, data_key): # Makes sure that self.data[key] can be broadcast into # the given array, meaning its length has to be either 1 @@ -3041,33 +2971,6 @@ def check_data_alignment(self, array, data_key): ) return self - def get_resized_shader_data_array(self, length: int) -> np.ndarray: - # If possible, try to populate an existing array, rather - # than recreating it each frame - if len(self.shader_data) != length: - self.shader_data = resize_array(self.shader_data, length) - return self.shader_data - - def read_data_to_shader(self, shader_data, shader_data_key, data_key): - if data_key in self.locked_data_keys: - return - self.check_data_alignment(shader_data, data_key) - shader_data[shader_data_key] = self.data[data_key] - - def get_shader_data(self): - shader_data = self.get_resized_shader_data_array(self.get_num_points()) - self.read_data_to_shader(shader_data, "point", "points") - return shader_data - - def refresh_shader_data(self): - self.get_shader_data() - - def get_shader_uniforms(self): - return self.uniforms - - def get_shader_vert_indices(self): - return self.shader_indices - # Event Handlers """ Event handling follows the Event Bubbling model of DOM in javascript. diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 47789ab757..0e501cb87d 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -55,16 +55,6 @@ DEFAULT_FILL_COLOR = GREY_C -def triggers_refreshed_triangulation(func: Callable): - @wraps(func) - def wrapper(self, *args, **kwargs): - res = func(self, *args, **kwargs) - self.refresh_triangulation() - return res - - return wrapper - - class OpenGLVMobject(OpenGLMobject): """A vectorized mobject.""" @@ -73,7 +63,7 @@ class OpenGLVMobject(OpenGLMobject): fill_shader_folder = "quadratic_bezier_fill" fill_dtype = [ ("point", np.float32, (3,)), - ("orientation", np.float32, (3,)), + ("unit_normal", np.float32, (3,)), ("color", np.float32, (4,)), ("vert_index", np.float32, (1,)), ] @@ -157,7 +147,7 @@ def init_data(self): "fill_rgba": np.zeros((1, 4)), "stroke_rgba": np.zeros((1, 4)), "stroke_width": np.zeros((1, 1)), - "orientation": np.zeros((1, 1)), + "unit_normal": np.zeros((1, 3)), } ) @@ -188,11 +178,6 @@ def add(self, *vmobjects: OpenGLVMobject): # type: ignore raise Exception("All submobjects must be of type OpenGLVMobject") super().add(*vmobjects) - def copy(self, deep: bool = False) -> Self: - result = super().copy(deep) - result.shader_wrapper_list = [sw.copy() for sw in self.shader_wrapper_list] - return result - # Colors def init_colors(self): # self.set_fill( @@ -343,10 +328,10 @@ def set_style( def get_style(self): return { - "fill_rgba": self.data["fill_rgba"].copy(), - "stroke_rgba": self.data["stroke_rgba"].copy(), - "stroke_width": self.data["stroke_width"].copy(), - "stroke_background": self.draw_stroke_behind_fill, + "fill_color": self.fill_color.copy(), + "stroke_color": self.stroke_color.copy(), + "stroke_width": self.stroke_width.copy(), + # "stroke_background": self.draw_stroke_behind_fill, "reflectiveness": self.get_reflectiveness(), "gloss": self.get_gloss(), "shadow": self.get_shadow(), @@ -395,13 +380,13 @@ def get_fill_colors(self): return self.fill_color def get_fill_opacities(self) -> np.ndarray: - return (c.to_rgba()[3] for c in self.fill_color) + return [c.to_rgba()[3] for c in self.fill_color] def get_stroke_colors(self): return self.stroke_color def get_stroke_opacities(self) -> np.ndarray: - return (c.to_rgba()[3] for c in self.stroke_color) + return [c.to_rgba()[3] for c in self.stroke_color] def get_stroke_widths(self) -> np.ndarray: return self.stroke_width @@ -1334,14 +1319,43 @@ def insert_n_curves_to_point_list(self, n: int, points: np.ndarray) -> np.ndarra new_points += partial_quadratic_bezier_points(group, a1, a2) return np.vstack(new_points) - def interpolate(self, mobject1, mobject2, alpha, *args, **kwargs): - super().interpolate(mobject1, mobject2, alpha, *args, **kwargs) - if self.has_fill(): - tri1 = mobject1.get_triangulation() - tri2 = mobject2.get_triangulation() - if len(tri1) != len(tri2) or not np.all(tri1 == tri2): - self.refresh_triangulation() - return self + def interpolate_color(self, mobject1, mobject2, alpha): + attrs = [ + "fill_color", + "stroke_color", + "opacity", + "reflectiveness", + "shadow", + "gloss", + "stroke_width", + # TODO: eventually add these attributes to OpenGLVMobject + # "background_stroke_width", + # "sheen_direction", + # "sheen_factor", + ] + + def interp(obj1, obj2, alpha): + result = None + if isinstance(obj1, ManimColor) or isinstance(obj2, ManimColor): + result = obj1.interpolate(obj2, alpha) + else: + result = interpolate(obj1, obj2, alpha) + return result + + for attr in attrs: + if alpha == 1.0: + setattr(self, attr, getattr(mobject2, attr)) + continue + + attr1 = getattr(mobject1, attr) + attr2 = getattr(mobject2, attr) + if isinstance(attr1, list) or isinstance(attr2, list): + result = [ + interp(elem1, elem2, alpha) for elem1, elem2 in zip(attr1, attr2) + ] + else: + result = interp(attr1, attr2, alpha) + setattr(self, attr, result) # TODO: compare to 3b1b/manim again check if something changed so we don't need the cairo interpolation anymore def pointwise_become_partial( @@ -1435,215 +1449,35 @@ def get_subcurve(self, a: float, b: float) -> Self: # Related to triangulation - def refresh_triangulation(self): - for mob in self.get_family(): - mob.needs_new_triangulation = True - mob.data["orientation"] = resize_array( - mob.data["orientation"], mob.get_num_points() - ) - return self - - def get_triangulation(self): - # Figure out how to triangulate the interior to know - # how to send the points as to the vertex shader. - # First triangles come directly from the points - if not self.needs_new_triangulation: - return self.triangulation - - points = self.points - - if len(points) <= 1: - self.triangulation = np.zeros(0, dtype="i4") - self.needs_new_triangulation = False - return self.triangulation - - normal_vector = self.get_unit_normal() - indices = np.arange(len(points), dtype=int) - - # Rotate points such that unit normal vector is OUT - if not np.isclose(normal_vector, OUT).all(): - points = np.dot(points, z_to_vector(normal_vector)) - - atol = self.tolerance_for_point_equality - end_of_loop = np.zeros(len(points) // 3, dtype=bool) - end_of_loop[:-1] = (np.abs(points[2:-3:3] - points[3::3]) > atol).any(1) - end_of_loop[-1] = True - - v01s = points[1::3] - points[0::3] - v12s = points[2::3] - points[1::3] - curve_orientations = np.sign(cross2d(v01s, v12s)) - self.data["orientation"] = np.transpose([curve_orientations.repeat(3)]) - - concave_parts = curve_orientations < 0 - - # These are the vertices to which we'll apply a polygon triangulation - inner_vert_indices = np.hstack( - [ - indices[0::3], - indices[1::3][concave_parts], - indices[2::3][end_of_loop], - ] - ) - inner_vert_indices.sort() - rings = np.arange(1, len(inner_vert_indices) + 1)[inner_vert_indices % 3 == 2] - - # Triangulate - inner_verts = points[inner_vert_indices] - inner_tri_indices = inner_vert_indices[ - earclip_triangulation(inner_verts, rings) - ] - - tri_indices = np.hstack([indices, inner_tri_indices]) - self.triangulation = tri_indices - self.needs_new_triangulation = False - return tri_indices - - @triggers_refreshed_triangulation def set_points(self, points): super().set_points(points) return self - @triggers_refreshed_triangulation def append_points(self, points): return super().append_points(points) - @triggers_refreshed_triangulation def reverse_points(self): return super().reverse_points() - @triggers_refreshed_triangulation def set_data(self, data): super().set_data(data) return self # TODO, how to be smart about tangents here? - @triggers_refreshed_triangulation def apply_function(self, function, make_smooth=False, **kwargs): super().apply_function(function, **kwargs) if self.make_smooth_after_applying_functions or make_smooth: self.make_approximately_smooth() return self - @triggers_refreshed_triangulation def apply_points_function(self, *args, **kwargs): super().apply_points_function(*args, **kwargs) return self - @triggers_refreshed_triangulation def flip(self, *args, **kwargs): super().flip(*args, **kwargs) return self - # For shaders - def init_shader_data(self): - self.fill_data = np.zeros(0, dtype=self.fill_dtype) - self.stroke_data = np.zeros(0, dtype=self.stroke_dtype) - self.fill_shader_wrapper = ShaderWrapper( - vert_data=self.fill_data, - vert_indices=np.zeros(0, dtype="i4"), - uniforms=self.uniforms, - shader_folder=self.fill_shader_folder, - render_primitive=self.render_primitive, - ) - self.stroke_shader_wrapper = ShaderWrapper( - vert_data=self.stroke_data, - uniforms=self.uniforms, - shader_folder=self.stroke_shader_folder, - render_primitive=self.render_primitive, - ) - - self.shader_wrapper_list = [ - self.stroke_shader_wrapper.copy(), # Use for back stroke - self.fill_shader_wrapper.copy(), - self.stroke_shader_wrapper.copy(), - ] - for sw in self.shader_wrapper_list: - sw.uniforms = self.uniforms - - def refresh_shader_wrapper_id(self): - for wrapper in [self.fill_shader_wrapper, self.stroke_shader_wrapper]: - wrapper.refresh_id() - return self - - def get_fill_shader_wrapper(self) -> ShaderWrapper: - self.fill_shader_wrapper.vert_indices = self.get_fill_shader_vert_indices() - self.fill_shader_wrapper.vert_data = self.get_fill_shader_data() - self.fill_shader_wrapper.uniforms = self.get_shader_uniforms() - self.fill_shader_wrapper.depth_test = self.depth_test - return self.fill_shader_wrapper - - def get_stroke_shader_wrapper(self) -> ShaderWrapper: - self.stroke_shader_wrapper.vert_data = self.get_stroke_shader_data() - self.stroke_shader_wrapper.uniforms = self.get_shader_uniforms() - self.stroke_shader_wrapper.depth_test = self.depth_test - return self.stroke_shader_wrapper - - def get_shader_wrapper_list(self): - # Build up data lists - fill_shader_wrappers = [] - stroke_shader_wrappers = [] - back_stroke_shader_wrappers = [] - for submob in self.family_members_with_points(): - if submob.has_fill(): - fill_shader_wrappers.append(submob.get_fill_shader_wrapper()) - if submob.has_stroke(): - ssw = submob.get_stroke_shader_wrapper() - if submob.draw_stroke_behind_fill: - back_stroke_shader_wrappers.append(ssw) - else: - stroke_shader_wrappers.append(ssw) - - # Combine data lists - sw_lists = [ - back_stroke_shader_wrappers, - fill_shader_wrappers, - stroke_shader_wrappers, - ] - for sw, sw_list in zip(self.shader_wrapper_list, sw_lists): - if not sw_list: - continue - sw.read_in(*sw_list) - sw.depth_test = any(sw.depth_test for sw in sw_list) - sw.uniforms.update(sw_list[0].uniforms) - return list(filter(lambda sw: len(sw.vert_data) > 0, self.shader_wrapper_list)) - - def get_stroke_shader_data(self) -> np.ndarray: - points = self.points - if len(self.stroke_data) != len(points): - self.stroke_data = resize_array(self.stroke_data, len(points)) - - if "points" not in self.locked_data_keys: - nppc = self.n_points_per_curve - self.stroke_data["point"] = points - self.stroke_data["prev_point"][:nppc] = points[-nppc:] - self.stroke_data["prev_point"][nppc:] = points[:-nppc] - self.stroke_data["next_point"][:-nppc] = points[nppc:] - self.stroke_data["next_point"][-nppc:] = points[:nppc] - - self.read_data_to_shader(self.stroke_data, "color", "stroke_rgba") - self.read_data_to_shader(self.stroke_data, "stroke_width", "stroke_width") - - return self.stroke_data - - def get_fill_shader_data(self) -> np.ndarray: - points = self.points - if len(self.fill_data) != len(points): - self.fill_data = resize_array(self.fill_data, len(points)) - self.fill_data["vert_index"][:, 0] = range(len(points)) - - self.read_data_to_shader(self.fill_data, "point", "points") - self.read_data_to_shader(self.fill_data, "color", "fill_rgba") - self.read_data_to_shader(self.fill_data, "orientation", "orientation") - - return self.fill_data - - def refresh_shader_data(self): - self.get_fill_shader_data() - self.get_stroke_shader_data() - - def get_fill_shader_vert_indices(self) -> np.ndarray: - return self.get_triangulation() - class OpenGLVGroup(OpenGLVMobject): """A group of vectorized mobjects. diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index da8e560b59..de9e13ac6f 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -372,10 +372,9 @@ def get_style(self, simple=False): return ret - def match_style(self, vmobject, family=True): - self.set_style(**vmobject.get_style(), family=False) - - if family: + def match_style(self, vmobject: VMobject, recurse: bool = True): + self.set_style(**vmobject.get_style(), recurse=False) + if recurse: # Does its best to match up submobject lists, and # match styles accordingly submobs1, submobs2 = self.submobjects, vmobject.submobjects diff --git a/manim/renderer/buffers/buffer.py b/manim/renderer/buffers/buffer.py index 70a4dbbc2c..e028ee2654 100644 --- a/manim/renderer/buffers/buffer.py +++ b/manim/renderer/buffers/buffer.py @@ -1,6 +1,7 @@ -import numpy as np import math +import numpy as np + class STD140BufferFormat: _GL_DTYPES: dict[str, tuple[str, int, tuple[int, ...]]] = { diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index ef2f9fb482..b28f37e1fa 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -9,10 +9,10 @@ import manim.constants as const import manim.utils.color.manim_colors as color -from manim.renderer.buffers.buffer import STD140BufferFormat from manim._config import config, logger from manim.camera.camera import OpenGLCameraFrame from manim.mobject.types.vectorized_mobject import VMobject +from manim.renderer.buffers.buffer import STD140BufferFormat from manim.renderer.opengl_shader_program import load_shader_program_by_folder from manim.renderer.renderer import ImageType, Renderer, RendererData from manim.renderer.shader_wrapper import ShaderWrapper @@ -406,7 +406,8 @@ def enable_depth(mob): self.ctx.disable(gl.DEPTH_TEST) # type: ignore for sub in mob.family_members_with_points(): - if sub.renderer_data is None: + # TODO: review this renderer data optimization attempt + if True: # if sub.renderer_data is None: # Initialize GLVMobjectManager.init_render_data(sub) @@ -422,6 +423,27 @@ def enable_depth(mob): # mob.renderer_data.mesh = ... # Triangulation todo num_mobs = len(mob.family_members_with_points()) + + # Another stroke pass is needed in the beginning to deal with transparency properly + for counter, sub in enumerate(mob.family_members_with_points()): + if not isinstance(sub.renderer_data, GLRenderData): + return + enable_depth(sub) + uniforms = GLVMobjectManager.read_uniforms(sub) + uniforms["index"] = (counter + 1) / num_mobs / 2 + uniforms["disable_stencil"] = float(True) + # uniforms['z_shift'] = counter/9 + 1/20 + self.ctx.copy_framebuffer(self.stencil_texture_fbo, self.stencil_buffer_fbo) + self.stencil_texture.use(0) + self.vmobject_stroke_program["stencil_texture"] = 0 + if sub.has_stroke(): + ProgramManager.write_uniforms(self.vmobject_stroke_program, uniforms) + self.render_program( + self.vmobject_stroke_program, + self.get_stroke_shader_data(sub), + np.array(range(len(sub.points))), + ) + for counter, sub in enumerate(mob.family_members_with_points()): if not isinstance(sub.renderer_data, GLRenderData): return @@ -429,6 +451,7 @@ def enable_depth(mob): uniforms = GLVMobjectManager.read_uniforms(sub) # uniforms['z_shift'] = counter/9 uniforms["index"] = (counter + 1) / num_mobs + uniforms["disable_stencil"] = float(False) self.ctx.copy_framebuffer(self.stencil_texture_fbo, self.stencil_buffer_fbo) self.stencil_texture.use(0) self.vmobject_fill_program["stencil_texture"] = 0 @@ -446,6 +469,7 @@ def enable_depth(mob): enable_depth(sub) uniforms = GLVMobjectManager.read_uniforms(sub) uniforms["index"] = (counter + 1) / num_mobs + uniforms["disable_stencil"] = float(False) # uniforms['z_shift'] = counter/9 + 1/20 self.ctx.copy_framebuffer(self.stencil_texture_fbo, self.stencil_buffer_fbo) self.stencil_texture.use(0) diff --git a/manim/renderer/shader_wrapper.py b/manim/renderer/shader_wrapper.py index 7c562d2eb7..21b8592cb6 100644 --- a/manim/renderer/shader_wrapper.py +++ b/manim/renderer/shader_wrapper.py @@ -202,7 +202,7 @@ def get_shader_code_from_file(filename: Path) -> str | None: directories=[get_shader_dir(), Path("/")], ) except OSError: - logger.warning(f"Could not find shader file {filename}") + logger.warning(f"Could not find shader file {filename.absolute()}") return None result = filepath.read_text() diff --git a/manim/renderer/shaders/include/camera_uniform_declarations.glsl b/manim/renderer/shaders/include/camera_uniform_declarations.glsl index ae914a19a2..53b38ae12f 100644 --- a/manim/renderer/shaders/include/camera_uniform_declarations.glsl +++ b/manim/renderer/shaders/include/camera_uniform_declarations.glsl @@ -7,4 +7,4 @@ layout (std140) uniform ubo_camera { float is_fixed_in_frame; float is_fixed_orientation; vec3 fixed_orientation_center; -}; \ No newline at end of file +}; diff --git a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl index a394b5ce87..6b182a946d 100644 --- a/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl +++ b/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl @@ -3,7 +3,6 @@ #include ../include/camera_uniform_declarations.glsl in vec3 point; -in float orientation; in vec3 unit_normal; in vec4 color; in float vert_index; diff --git a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl index 879c275963..9149fa700a 100644 --- a/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl +++ b/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl @@ -3,6 +3,7 @@ #include ../include/camera_uniform_declarations.glsl uniform vec2 pixel_shape; uniform float index; +uniform float disable_stencil; in vec2 uv_coords; in vec2 uv_b2; @@ -88,8 +89,12 @@ float modify_distance_for_endpoints(vec2 p, float dist, float t){ void main() { // Use the default value as standard output - stencil_value.rgb = vec3(index); - stencil_value.a = 1.0; + if(disable_stencil==1.0){ + stencil_value = vec4(0.0); + }else{ + stencil_value.rgb = vec3(index); + stencil_value.a = 1.0; + } gl_FragDepth = gl_FragCoord.z; // Get the previous index that was written to this fragment float previous_index = @@ -113,7 +118,10 @@ void main() { if (color.a == 1.0) discard; else - gl_FragDepth = gl_FragCoord.z - 3*index / 1000.0; + gl_FragDepth = gl_FragCoord.z + index / 1000.0; + } + if(disable_stencil==1.0){ + gl_FragDepth = gl_FragCoord.z + 4.5 * index / 1000.0; } if (uv_stroke_width == 0) discard; diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 2ef9d89707..96d818da43 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -29,6 +29,7 @@ extract_mobject_family_members, recursive_mobject_remove, ) +from manim.utils.iterables import list_difference_update from manim.utils.module_ops import get_module if TYPE_CHECKING: @@ -406,28 +407,15 @@ def remove(self, *mobjects_to_remove: Mobject): For example, if the scene includes Group(m1, m2, m3), and we call scene.remove(m1), the desired behavior is for the scene to then include m2 and m3 (ungrouped). """ - if config.renderer == RendererType.OPENGL: - mobjects_to_remove = [] - meshes_to_remove = set() - for mobject_or_mesh in mobjects: - if isinstance(mobject_or_mesh, Object3D): - meshes_to_remove.add(mobject_or_mesh) - else: - mobjects_to_remove.append(mobject_or_mesh) - self.mobjects = restructure_list_to_exclude_certain_family_members( - self.mobjects, - mobjects_to_remove, - ) - self.meshes = list( - filter(lambda mesh: mesh not in set(meshes_to_remove), self.meshes), - ) - return self - elif config.renderer == RendererType.CAIRO: - for list_name in "mobjects", "foreground_mobjects": - self.restructure_mobjects(mobjects, list_name, False) - return self + for mob in mobjects_to_remove: + # First restructure self.mobjects so that parents/grandparents/etc. are replaced + # with their children, likewise for all ancestors in the extended family. + for ancestor in mob.get_ancestors(extended=True): + self.replace(ancestor, *ancestor.submobjects) + self.mobjects = list_difference_update(self.mobjects, mob.get_family()) + return self - def replace(self, old_mobject: Mobject, new_mobject: Mobject) -> None: + def replace(self, mobject: Mobject, *replacements: Mobject): """Replace one mobject in the scene with another, preserving draw order. If ``old_mobject`` is a submobject of some other Mobject (e.g. a @@ -442,37 +430,14 @@ def replace(self, old_mobject: Mobject, new_mobject: Mobject) -> None: A mobject which must not already be in the scene. """ - if old_mobject is None or new_mobject is None: - raise ValueError("Specified mobjects cannot be None") - - def replace_in_list( - mobj_list: list[Mobject], old_m: Mobject, new_m: Mobject - ) -> bool: - # We use breadth-first search because some Mobjects get very deep and - # we expect top-level elements to be the most common targets for replace. - for i in range(0, len(mobj_list)): - # Is this the old mobject? - if mobj_list[i] == old_m: - # If so, write the new object to the same spot and stop looking. - mobj_list[i] = new_m - return True - # Now check all the children of all these mobs. - for mob in mobj_list: # noqa: SIM110 - if replace_in_list(mob.submobjects, old_m, new_m): - # If we found it in a submobject, stop looking. - return True - # If we did not find the mobject in the mobject list or any submobjects, - # (or the list was empty), indicate we did not make the replacement. - return False - - # Make use of short-circuiting conditionals to check mobjects and then - # foreground_mobjects - replaced = replace_in_list( - self.mobjects, old_mobject, new_mobject - ) or replace_in_list(self.foreground_mobjects, old_mobject, new_mobject) - - if not replaced: - raise ValueError(f"Could not find {old_mobject} in scene") + if mobject in self.mobjects: + index = self.mobjects.index(mobject) + self.mobjects = [ + *self.mobjects[:index], + *replacements, + *self.mobjects[index + 1 :], + ] + return self def add_updater(self, func: Callable[[float], None]) -> None: """Add an update function to the scene. From c6dfc1583b12bd0e7887d2230f5290b89a3caa10 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Sat, 16 Dec 2023 14:25:18 +0100 Subject: [PATCH 060/106] Disable rendering doc examples for experimental branch (#3475) * add MANIM_SKIP_EXAMPLES env variable, disable rendering for this branch * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * try using predefined env variable * what * env vars don't work * skip based on PR numbers * Apply suggestions from code review --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- manim/utils/docbuild/manim_directive.py | 1 + 1 file changed, 1 insertion(+) diff --git a/manim/utils/docbuild/manim_directive.py b/manim/utils/docbuild/manim_directive.py index 5b744985ca..fe5b050e54 100644 --- a/manim/utils/docbuild/manim_directive.py +++ b/manim/utils/docbuild/manim_directive.py @@ -166,6 +166,7 @@ def run(self): should_skip = ( "skip-manim" in self.state.document.settings.env.app.builder.tags.tags or self.state.document.settings.env.app.builder.name == "gettext" + or os.getenv("READTHEDOCS_VERSION_NAME", None) in ["3112", "3475"] ) if should_skip: node = SkipManimNode() From 22844a23ce147b187516983ac4ec122284408e20 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Thu, 2 May 2024 13:12:09 -0400 Subject: [PATCH 061/106] Add rendering loop to experimental (#3707) * try adding a render manager * Add a test scene * Got keys working * yay its a triangle * Cursed! * Allow support for self.add * Get it working * change test scene * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Separate Animation and Scene using SceneBuffer * Update subclasses This is likely to be a very bug-prone commit * Fix bugs with not clearing buffer * remove useless clear in scene.py' * fixes * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add Scene.replace functionality * Make :class:`.Animation` explicitly implement `AnimationProtocol` * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix a bug with animation restructuring * fix succession * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix typo in render_manager * Added window independent resolution rendering * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Whops ? * Who needs window names anyway * fixed transform animation * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Remove printing of animation buffer * Lint, remove unused imports * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Removed useless reading from the gpu * Fixed broken interp function in opengl_vectorized mobject which used non-existing opacity * Fixed TracedPath * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Whops --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: = <=> Co-authored-by: Tristan Schulz --- example_scenes/new_test_new.py | 7 +- example_scenes/test_new_rendering.py | 13 + manim/__init__.py | 2 - manim/_config/utils.py | 10 + manim/animation/animation.py | 118 +- manim/animation/changing.py | 27 +- manim/animation/composition.py | 48 +- manim/animation/creation.py | 13 +- manim/animation/fading.py | 14 +- manim/animation/indication.py | 22 +- manim/animation/movement.py | 3 +- manim/animation/protocol.py | 30 + manim/animation/scene_buffer.py | 58 + manim/animation/speedmodifier.py | 15 +- manim/animation/transform.py | 17 +- manim/animation/transform_matching_parts.py | 12 +- manim/camera/cairo_camera.py | 1213 ----------------- manim/camera/camera.py | 21 +- manim/cli/render/global_options.py | 1 + manim/mobject/logo.py | 4 +- manim/mobject/opengl/opengl_mobject.py | 7 +- .../opengl/opengl_vectorized_mobject.py | 24 +- manim/mobject/types/vectorized_mobject.py | 18 +- manim/renderer/buffers/buffer.py | 14 +- manim/renderer/opengl_file_writer.py | 471 +++++++ manim/renderer/opengl_renderer.py | 74 +- manim/renderer/opengl_renderer_window.py | 81 +- manim/renderer/render_manager.py | 82 ++ .../renderer/shaders/render_texture/frag.glsl | 11 + .../renderer/shaders/render_texture/vert.glsl | 11 + manim/scene/scene.py | 170 +-- manim/scene/scene_file_writer.py | 4 +- manim/utils/commands.py | 4 +- manim/utils/hashing.py | 2 +- 34 files changed, 1039 insertions(+), 1582 deletions(-) create mode 100644 example_scenes/test_new_rendering.py create mode 100644 manim/animation/protocol.py create mode 100644 manim/animation/scene_buffer.py delete mode 100644 manim/camera/cairo_camera.py create mode 100644 manim/renderer/opengl_file_writer.py create mode 100644 manim/renderer/render_manager.py create mode 100644 manim/renderer/shaders/render_texture/frag.glsl create mode 100644 manim/renderer/shaders/render_texture/vert.glsl diff --git a/example_scenes/new_test_new.py b/example_scenes/new_test_new.py index e196263ecc..63589cbe5c 100644 --- a/example_scenes/new_test_new.py +++ b/example_scenes/new_test_new.py @@ -12,7 +12,7 @@ from manim.animation.creation import Create, DrawBorderThenFill, Write from manim.animation.fading import FadeIn from manim.animation.transform import Transform -from manim.camera.camera import OpenGLCameraFrame +from manim.camera.camera import Camera from manim.constants import LEFT, OUT, RIGHT, UP from manim.mobject.geometry.arc import Circle from manim.mobject.geometry.polygram import Square @@ -39,6 +39,7 @@ def progress_through_animations(animations): win = Window( width=1920, height=1080, + fullscreen=True, vsync=True, config=Config(double_buffer=True, samples=0), ) @@ -70,7 +71,7 @@ def progress_through_animations(animations): clock_mobject = DecimalNumber(0.0).shift(4 * LEFT + 2.5 * UP) clock_mobject.fix_in_frame() - camera = OpenGLCameraFrame() + camera = Camera() camera.save_state() # renderer.init_camera(camera) @@ -151,6 +152,8 @@ def on_resize(width, height): if not is_finished: if virtual_time >= run_time: animation.finish() + buffer = str(animation.buffer) + print(f"{buffer = }") has_finished = True else: animation.update_mobjects(dt) diff --git a/example_scenes/test_new_rendering.py b/example_scenes/test_new_rendering.py new file mode 100644 index 0000000000..90b42db035 --- /dev/null +++ b/example_scenes/test_new_rendering.py @@ -0,0 +1,13 @@ +from manim import * + + +class Test(Scene): + def construct(self) -> None: + s = Square() + c = Circle() + st = Star(color=YELLOW, fill_color=YELLOW) + self.play(Succession(*[Create(x) for x in VGroup(s, c, st).arrange()])) + + +with tempconfig({"renderer": "opengl", "preview": True, "parallel": False}): + Test().render() diff --git a/manim/__init__.py b/manim/__init__.py index f66a5f75f0..32b831089b 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -37,7 +37,6 @@ from .animation.transform_matching_parts import * from .animation.updaters.mobject_update_utils import * from .animation.updaters.update import * -from .camera.cairo_camera import * from .constants import * from .mobject.frame import * from .mobject.geometry.arc import * @@ -73,7 +72,6 @@ from .mobject.types.vectorized_mobject import * from .mobject.value_tracker import * from .mobject.vector_field import * -from .renderer.cairo_renderer import * from .scene.scene import * from .scene.scene_file_writer import * from .scene.section import * diff --git a/manim/_config/utils.py b/manim/_config/utils.py index 35b862d749..86f420eab8 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -311,6 +311,7 @@ class MyScene(Scene): "write_to_movie", "zero_pad", "force_window", + "parallel", } def __init__(self) -> None: @@ -582,6 +583,7 @@ def digest_parser(self, parser: configparser.ConfigParser) -> ManimConfig: "use_projection_stroke_shaders", "enable_wireframe", "force_window", + "parallel", ]: setattr(self, key, parser["CLI"].getboolean(key, fallback=False)) @@ -995,6 +997,14 @@ def format(self, val: str) -> None: "Output format set as webm, this can be slower than other formats", ) + @property + def in_parallel(self) -> None: + return self._d["parallel"] + + @in_parallel.setter + def in_parallel(self, val: bool) -> None: + self._set_boolean("parallel", val) + ffmpeg_loglevel = property( lambda self: self._d["ffmpeg_loglevel"], lambda self, val: self._set_from_list( diff --git a/manim/animation/animation.py b/manim/animation/animation.py index 47e86ec0a7..7d282350c6 100644 --- a/manim/animation/animation.py +++ b/manim/animation/animation.py @@ -11,22 +11,23 @@ from ..mobject.mobject import Mobject from ..mobject.opengl import opengl_mobject from ..utils.rate_functions import linear, smooth +from .protocol import AnimationProtocol +from .scene_buffer import SceneBuffer __all__ = ["Animation", "Wait", "override_animation"] - from copy import deepcopy -from typing import TYPE_CHECKING, Callable, Iterable, Sequence +from typing import TYPE_CHECKING, Callable, Iterable, Sequence, TypeVar if TYPE_CHECKING: - from manim.scene.scene import Scene + from typing_extensions import Self DEFAULT_ANIMATION_RUN_TIME: float = 1.0 DEFAULT_ANIMATION_LAG_RATIO: float = 0.0 -class Animation: +class Animation(AnimationProtocol): """An animation. Animations have a fixed time span. @@ -127,17 +128,17 @@ def __new__( def __init__( self, - mobject: Mobject | None, + mobject: OpenGLMobject | None, lag_ratio: float = DEFAULT_ANIMATION_LAG_RATIO, run_time: float = DEFAULT_ANIMATION_RUN_TIME, rate_func: Callable[[float], float] = smooth, reverse_rate_function: bool = False, - name: str = None, - remover: bool = False, # remove a mobject from the screen? + name: str | None = None, + remover: bool = False, # remove a mobject from the screen at end of animation suspend_mobject_updating: bool = True, introducer: bool = False, *, - _on_finish: Callable[[], None] = lambda _: None, + _on_finish: Callable[[SceneBuffer], object] = lambda _: None, **kwargs, ) -> None: self._typecheck_input(mobject) @@ -149,15 +150,15 @@ def __init__( self.introducer: bool = introducer self.suspend_mobject_updating: bool = suspend_mobject_updating self.lag_ratio: float = lag_ratio - self._on_finish: Callable[[Scene], None] = _on_finish - if config["renderer"] == RendererType.OPENGL: - self.starting_mobject: OpenGLMobject = OpenGLMobject() - self.mobject: OpenGLMobject = ( - mobject if mobject is not None else OpenGLMobject() - ) - else: - self.starting_mobject: Mobject = Mobject() - self.mobject: Mobject = mobject if mobject is not None else Mobject() + self._on_finish = _on_finish + + self.buffer = SceneBuffer() + self.apply_buffer = False # ask scene to apply buffer + + self.starting_mobject: OpenGLMobject = OpenGLMobject() + self.mobject: OpenGLMobject = ( + mobject if mobject is not None else OpenGLMobject() + ) if kwargs: logger.debug("Animation received extra kwargs: %s", kwargs) @@ -169,7 +170,7 @@ def __init__( ), ) - def _typecheck_input(self, mobject: Mobject | None) -> None: + def _typecheck_input(self, mobject: Mobject | OpenGLMobject | None) -> None: if mobject is None: logger.debug("Animation with empty mobject") elif not isinstance(mobject, (Mobject, OpenGLMobject)): @@ -213,10 +214,12 @@ def begin(self) -> None: self.mobject.suspend_updating() self.interpolate(0) + # TODO: Figure out a way to check + # if self.mobject in scene.get_mobject_family + if self.is_introducer(): + self.buffer.add(self.mobject) + def finish(self) -> None: - # TODO: begin and finish should require a scene as parameter. - # That way Animation.clean_up_from_screen and Scene.add_mobjects_from_animations - # could be removed as they fulfill basically the same purpose. """Finish the animation. This method gets called when the animation is over. @@ -226,39 +229,9 @@ def finish(self) -> None: if self.suspend_mobject_updating and self.mobject is not None: self.mobject.resume_updating() - def clean_up_from_scene(self, scene: Scene) -> None: - """Clean up the :class:`~.Scene` after finishing the animation. - - This includes to :meth:`~.Scene.remove` the Animation's - :class:`~.Mobject` if the animation is a remover. - - Parameters - ---------- - scene - The scene the animation should be cleaned up from. - """ - self._on_finish(scene) + self._on_finish(self.buffer) if self.is_remover(): - scene.remove(self.mobject) - - def _setup_scene(self, scene: Scene) -> None: - """Setup up the :class:`~.Scene` before starting the animation. - - This includes to :meth:`~.Scene.add` the Animation's - :class:`~.Mobject` if the animation is an introducer. - - Parameters - ---------- - scene - The scene the animation should be cleaned up from. - """ - if scene is None: - return - if ( - self.is_introducer() - and self.mobject not in scene.get_mobject_family_members() - ): - scene.add(self.mobject) + self.buffer.remove(self.mobject) def create_starting_mobject(self) -> Mobject: # Keep track of where the mobject starts @@ -294,6 +267,17 @@ def update_mobjects(self, dt: float) -> None: for mob in self.get_all_mobjects_to_update(): mob.update(dt) + def process_subanimation_buffer(self, buffer: SceneBuffer): + """ + This is used in animations that are proxies around + other animations, like :class:`.AnimationGroup` + """ + self.buffer.remove(*buffer.to_remove) + for to_replace_pairs in buffer.to_replace: + self.buffer.replace(*to_replace_pairs) + self.buffer.add(*buffer.to_add) + buffer.clear() + def get_all_mobjects_to_update(self) -> list[Mobject]: """Get all mobjects to be updated during the animation. @@ -305,9 +289,9 @@ def get_all_mobjects_to_update(self) -> list[Mobject]: # The surrounding scene typically handles # updating of self.mobject. Besides, in # most cases its updating is suspended anyway - return list(filter(lambda m: m is not self.mobject, self.get_all_mobjects())) + return [m for m in self.get_all_mobjects() if m is not self.mobject] - def copy(self) -> Animation: + def copy(self) -> Self: """Create a copy of the animation. Returns @@ -343,7 +327,7 @@ def interpolate_mobject(self, alpha: float) -> None: is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively. """ - families = list(self.get_all_families_zipped()) + families = tuple(self.get_all_families_zipped()) for i, mobs in enumerate(families): sub_alpha = self.get_sub_alpha(alpha, i, len(families)) self.interpolate_submobject(*mobs, sub_alpha) @@ -356,7 +340,7 @@ def interpolate_submobject( alpha: float, ) -> Animation: # Typically implemented by subclass - pass + raise NotImplementedError() def get_sub_alpha(self, alpha: float, index: int, num_submobjects: int) -> float: """Get the animation progress of any submobjects subanimation. @@ -422,7 +406,7 @@ def get_run_time(self) -> float: def set_rate_func( self, rate_func: Callable[[float], float], - ) -> Animation: + ) -> Self: """Set the rate function of the animation. Parameters @@ -451,7 +435,7 @@ def get_rate_func( """ return self.rate_func - def set_name(self, name: str) -> Animation: + def set_name(self, name: str) -> Self: """Set the name of the animation. Parameters @@ -489,7 +473,9 @@ def is_introducer(self) -> bool: def prepare_animation( - anim: Animation | mobject._AnimationBuilder, + anim: AnimationProtocol + | mobject._AnimationBuilder + | opengl_mobject._AnimationBuilder, ) -> Animation: r"""Returns either an unchanged animation, or the animation built from a passed animation factory. @@ -517,10 +503,7 @@ def prepare_animation( TypeError: Object 42 cannot be converted to an animation """ - if isinstance(anim, mobject._AnimationBuilder): - return anim.build() - - if isinstance(anim, opengl_mobject._AnimationBuilder): + if isinstance(anim, (mobject._AnimationBuilder, opengl_mobject._AnimationBuilder)): return anim.build() if isinstance(anim, Animation): @@ -576,9 +559,6 @@ def begin(self) -> None: def finish(self) -> None: pass - def clean_up_from_scene(self, scene: Scene) -> None: - pass - def update_mobjects(self, dt: float) -> None: pass @@ -625,7 +605,9 @@ def construct(self): """ - def decorator(func): + _F = TypeVar("_F", bound=Callable) + + def decorator(func: _F) -> _F: func._override_animation = animation_class return func diff --git a/manim/animation/changing.py b/manim/animation/changing.py index 0354a1c002..1a2dcdadc1 100644 --- a/manim/animation/changing.py +++ b/manim/animation/changing.py @@ -4,9 +4,13 @@ __all__ = ["AnimatedBoundary", "TracedPath"] -from typing import Callable +from typing import TYPE_CHECKING, Callable + +if TYPE_CHECKING: + import numpy.typing as npt + +import numpy as np -from manim._config import config from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.utils.color import ( @@ -61,7 +65,7 @@ def __init__( ] self.add(*self.boundary_copies) self.total_time = 0 - self.add_updater(lambda m, dt: self.update_boundary_copies(dt)) + self.add_updater(lambda _, dt: self.update_boundary_copies(dt)) def update_boundary_copies(self, dt): # Not actual time, but something which passes at @@ -143,23 +147,32 @@ def construct(self): def __init__( self, - traced_point_func: Callable, + traced_point_func: Callable[ + [], npt.NDArray[npt.float] + ], # TODO: Replace with Callable[[], Point3D] stroke_width: float = 2, stroke_color: ParsableManimColor | None = WHITE, dissipating_time: float | None = None, + fill_opacity: float = 0, **kwargs, ): - super().__init__(stroke_color=stroke_color, stroke_width=stroke_width, **kwargs) + super().__init__( + stroke_color=stroke_color, + stroke_width=stroke_width, + fill_opacity=fill_opacity, + **kwargs, + ) self.traced_point_func = traced_point_func self.dissipating_time = dissipating_time self.time = 1 if self.dissipating_time else None self.add_updater(self.update_path) - def update_path(self, mob, dt): + def update_path(self, _mob, dt): new_point = self.traced_point_func() if not self.has_points(): self.start_new_path(new_point) - self.add_line_to(new_point) + if not np.allclose(self.get_end(), new_point): + self.add_line_to(new_point) if self.dissipating_time: self.time += dt if self.time - 1 > self.dissipating_time: diff --git a/manim/animation/composition.py b/manim/animation/composition.py index cc6fa2ca7e..5467ed2760 100644 --- a/manim/animation/composition.py +++ b/manim/animation/composition.py @@ -7,13 +7,12 @@ import numpy as np +from manim import config, logger from manim.mobject.opengl.opengl_mobject import OpenGLGroup -from .._config import config from ..animation.animation import Animation, prepare_animation from ..constants import RendererType from ..mobject.mobject import Group, Mobject -from ..scene.scene import Scene from ..utils.iterables import remove_list_redundancies from ..utils.rate_functions import linear @@ -21,6 +20,7 @@ from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup from ..mobject.types.vectorized_mobject import VGroup + from .scene_buffer import SceneBuffer __all__ = ["AnimationGroup", "Succession", "LaggedStart", "LaggedStartMap"] @@ -55,7 +55,7 @@ class AnimationGroup(Animation): def __init__( self, *animations: Animation, - group: Group | VGroup | OpenGLGroup | OpenGLVGroup = None, + group: Group | VGroup | OpenGLGroup | OpenGLVGroup | None = None, run_time: float | None = None, rate_func: Callable[[float], float] = linear, lag_ratio: float = 0, @@ -81,27 +81,22 @@ def get_all_mobjects(self) -> Sequence[Mobject]: return list(self.group) def begin(self) -> None: - if self.suspend_mobject_updating: - self.group.suspend_updating() for anim in self.animations: anim.begin() - - def _setup_scene(self, scene) -> None: - for anim in self.animations: - anim._setup_scene(scene) + self.process_subanimation_buffer(anim.buffer) + if self.suspend_mobject_updating: + self.group.suspend_updating() def finish(self) -> None: for anim in self.animations: + if self.remover: + anim.remover = self.remover anim.finish() + self.process_subanimation_buffer(anim.buffer) + if self.suspend_mobject_updating: self.group.resume_updating() - - def clean_up_from_scene(self, scene: Scene) -> None: - self._on_finish(scene) - for anim in self.animations: - if self.remover: - anim.remover = self.remover - anim.clean_up_from_scene(scene) + self._on_finish(self.buffer) def update_mobjects(self, dt: float) -> None: for anim in self.animations: @@ -129,7 +124,10 @@ def init_run_time(self, run_time) -> float: def build_animations_with_timings(self) -> None: """Creates a list of triplets of the form (anim, start_time, end_time).""" + self.anims_with_timings = [] + """List of tuple[Animation, start_time, end_time]""" + curr_time: float = 0 for anim in self.animations: start_time: float = curr_time @@ -198,6 +196,10 @@ def begin(self) -> None: assert len(self.animations) > 0 self.update_active_animation(0) + for anim in self.animations: + if not anim.is_introducer() and anim.mobject is not None: + self.buffer.add(anim.mobject) + def finish(self) -> None: while self.active_animation is not None: self.next_animation() @@ -206,16 +208,6 @@ def update_mobjects(self, dt: float) -> None: if self.active_animation: self.active_animation.update_mobjects(dt) - def _setup_scene(self, scene) -> None: - if scene is None: - return - if self.is_introducer(): - for anim in self.animations: - if not anim.is_introducer() and anim.mobject is not None: - scene.add(anim.mobject) - - self.scene = scene - def update_active_animation(self, index: int) -> None: self.active_index = index if index >= len(self.animations): @@ -224,8 +216,9 @@ def update_active_animation(self, index: int) -> None: self.active_end_time: float | None = None else: self.active_animation = self.animations[index] - self.active_animation._setup_scene(self.scene) self.active_animation.begin() + self.process_subanimation_buffer(self.active_animation.buffer) + self.apply_buffer = True self.active_start_time = self.anims_with_timings[index][1] self.active_end_time = self.anims_with_timings[index][2] @@ -236,6 +229,7 @@ def next_animation(self) -> None: """ if self.active_animation is not None: self.active_animation.finish() + self.process_subanimation_buffer(self.active_animation.buffer) self.update_active_animation(self.active_index + 1) def interpolate(self, alpha: float) -> None: diff --git a/manim/animation/creation.py b/manim/animation/creation.py index a2e7f8a362..f6fd67a264 100644 --- a/manim/animation/creation.py +++ b/manim/animation/creation.py @@ -79,6 +79,8 @@ def construct(self): import numpy as np if TYPE_CHECKING: + from typing_extensions import Self + from manim.mobject.text.text_mobject import Text from manim.mobject.opengl.opengl_surface import OpenGLSurface @@ -92,7 +94,7 @@ def construct(self): from ..mobject.mobject import Group, Mobject from ..mobject.types.vectorized_mobject import VMobject from ..utils.bezier import integer_interpolate -from ..utils.rate_functions import double_smooth, linear, smooth +from ..utils.rate_functions import double_smooth, linear class ShowPartial(Animation): @@ -124,12 +126,13 @@ def interpolate_submobject( submobject: Mobject, starting_submobject: Mobject, alpha: float, - ) -> None: + ) -> Self: submobject.pointwise_become_partial( starting_submobject, *self._get_bounds(alpha) ) + return self - def _get_bounds(self, alpha: float) -> None: + def _get_bounds(self, alpha: float) -> tuple[float, float]: raise NotImplementedError("Please use Create or ShowPassingFlash") @@ -318,10 +321,10 @@ def __init__( vmobject: VMobject | OpenGLVMobject, rate_func: Callable[[float], float] = linear, reverse: bool = False, + run_time: float | None = None, + lag_ratio: float | None = None, **kwargs, ) -> None: - run_time: float | None = kwargs.pop("run_time", None) - lag_ratio: float | None = kwargs.pop("lag_ratio", None) run_time, lag_ratio = self._set_default_config_from_length( vmobject, run_time, diff --git a/manim/animation/fading.py b/manim/animation/fading.py index fdfbfc27e8..e2e35b6a8b 100644 --- a/manim/animation/fading.py +++ b/manim/animation/fading.py @@ -80,12 +80,12 @@ def __init__( self.scale_factor = scale super().__init__(mobject, **kwargs) - def _create_faded_mobject(self, fadeIn: bool) -> Mobject: + def _create_faded_mobject(self, fade_in: bool) -> Mobject: """Create a faded, shifted and scaled copy of the mobject. Parameters ---------- - fadeIn + fade_in Whether the faded mobject is used to fade in. Returns @@ -95,7 +95,7 @@ def _create_faded_mobject(self, fadeIn: bool) -> Mobject: """ faded_mobject = self.mobject.copy() faded_mobject.fade(1) - direction_modifier = -1 if fadeIn and not self.point_target else 1 + direction_modifier = -1 if fade_in and not self.point_target else 1 faded_mobject.shift(self.shift_vector * direction_modifier) faded_mobject.scale(self.scale_factor) return faded_mobject @@ -146,7 +146,7 @@ def create_target(self): return self.mobject def create_starting_mobject(self): - return self._create_faded_mobject(fadeIn=True) + return self._create_faded_mobject(fade_in=True) class FadeOut(_Fade): @@ -191,8 +191,8 @@ def __init__(self, *mobjects: Mobject, **kwargs) -> None: super().__init__(*mobjects, remover=True, **kwargs) def create_target(self): - return self._create_faded_mobject(fadeIn=False) + return self._create_faded_mobject(fade_in=False) - def clean_up_from_scene(self, scene: Scene = None) -> None: - super().clean_up_from_scene(scene) + def begin(self) -> None: + super().begin() self.interpolate(0) diff --git a/manim/animation/indication.py b/manim/animation/indication.py index fa3d801b24..d042701bcd 100644 --- a/manim/animation/indication.py +++ b/manim/animation/indication.py @@ -31,13 +31,12 @@ def construct(self): "Flash", "ShowPassingFlash", "ShowPassingFlashWithThinningStrokeWidth", - "ShowCreationThenFadeOut", "ApplyWave", "Circumscribe", "Wiggle", ] -from typing import Callable, Iterable, Optional, Tuple, Type, Union +from typing import Callable, Iterable, Optional, Type, Union import numpy as np @@ -305,7 +304,7 @@ def __init__(self, mobject: "VMobject", time_width: float = 0.1, **kwargs) -> No self.time_width = time_width super().__init__(mobject, remover=True, introducer=True, **kwargs) - def _get_bounds(self, alpha: float) -> Tuple[float]: + def _get_bounds(self, alpha: float) -> tuple[float, float]: tw = self.time_width upper = interpolate(0, 1 + tw, alpha) lower = upper - tw @@ -313,8 +312,8 @@ def _get_bounds(self, alpha: float) -> Tuple[float]: lower = max(lower, 0) return (lower, upper) - def clean_up_from_scene(self, scene: "Scene") -> None: - super().clean_up_from_scene(scene) + def finish(self) -> None: + super().finish() for submob, start in self.get_all_families_zipped(): submob.pointwise_become_partial(start, 0, 1) @@ -341,16 +340,6 @@ def __init__(self, vmobject, n_segments=10, time_width=0.1, remover=True, **kwar ) -@deprecated( - since="v0.15.0", - until="v0.16.0", - message="Use Create then FadeOut to achieve this effect.", -) -class ShowCreationThenFadeOut(Succession): - def __init__(self, mobject: "Mobject", remover: bool = True, **kwargs) -> None: - super().__init__(Create(mobject), FadeOut(mobject), remover=remover, **kwargs) - - class ApplyWave(Homotopy): """Send a wave through the Mobject distorting it temporarily. @@ -469,7 +458,7 @@ def homotopy( y: float, z: float, t: float, - ) -> Tuple[float, float, float]: + ) -> tuple[float, float, float]: upper = interpolate(0, 1 + time_width, t) lower = upper - time_width relative_x = inverse_interpolate(x_min, x_max, x) @@ -558,6 +547,7 @@ def interpolate_submobject( ) +# TODO: get rid of this if condition madness class Circumscribe(Succession): """Draw a temporary line surrounding the mobject. diff --git a/manim/animation/movement.py b/manim/animation/movement.py index 816f714477..52db2ec85a 100644 --- a/manim/animation/movement.py +++ b/manim/animation/movement.py @@ -18,7 +18,8 @@ from ..utils.rate_functions import linear if TYPE_CHECKING: - from ..mobject.mobject import Mobject, VMobject + from ..mobject.mobject import Mobject + from ..mobject.types.vectorized_mobject import VMobject class Homotopy(Animation): diff --git a/manim/animation/protocol.py b/manim/animation/protocol.py new file mode 100644 index 0000000000..3951efc6e4 --- /dev/null +++ b/manim/animation/protocol.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Protocol, Sequence + +if TYPE_CHECKING: + from .animation import Animation + from .scene_buffer import SceneBuffer + + +__all__ = ("AnimationProtocol",) + + +class AnimationProtocol(Protocol): + buffer: SceneBuffer + apply_buffer: bool + + def begin(self) -> None: + ... + + def finish(self) -> None: + ... + + def update_mobjects(self, dt: float) -> None: + ... + + def interpolate(self, alpha: float) -> None: + ... + + def get_run_time(self) -> float: + ... diff --git a/manim/animation/scene_buffer.py b/manim/animation/scene_buffer.py new file mode 100644 index 0000000000..3b3747ecbe --- /dev/null +++ b/manim/animation/scene_buffer.py @@ -0,0 +1,58 @@ +from typing import final + +from manim.mobject.opengl.opengl_mobject import OpenGLMobject as Mobject + +__all__ = ["SceneBuffer"] + + +@final +class SceneBuffer: + """ + A "buffer" between :class:`.Scene` and :class:`.Animation` + + Operations an animation wants to do on :class:`.Scene` should be + done here (eg. :meth:`.Scene.add`, :meth:`.Scene.remove`). The + scene will then apply these changes at specific points (namely + at the beginning and end of animations) + + It is the scenes job to clear the buffer in between the beginning + and end of animations. + """ + + def __init__(self) -> None: + self.to_remove: list[Mobject] = [] + self.to_add: list[Mobject] = [] + self.to_replace: list[tuple[Mobject, ...]] = [] + self.deferred = False + + def add(self, *mobs: Mobject) -> None: + self._check_deferred() + self.to_add.extend(mobs) + + def remove(self, *mobs: Mobject) -> None: + self._check_deferred() + self.to_remove.extend(mobs) + + def replace(self, mob: Mobject, *replacements: Mobject) -> None: + self._check_deferred() + self.to_replace.append((mob, *replacements)) + + def clear(self) -> None: + self.to_remove.clear() + self.to_add.clear() + + def deferred_clear(self) -> None: + """Clear ``self`` on next operation""" + self.deferred = True + + def _check_deferred(self) -> None: + if self.deferred: + self.clear() + self.deferred = False + + def __str__(self) -> str: + to_add = self.to_add + to_remove = self.to_remove + return f"{type(self).__name__}({to_add=}, {to_remove=})" + + __repr__ = __str__ diff --git a/manim/animation/speedmodifier.py b/manim/animation/speedmodifier.py index 8aa71646b2..5f5265ea31 100644 --- a/manim/animation/speedmodifier.py +++ b/manim/animation/speedmodifier.py @@ -12,7 +12,6 @@ from ..animation.animation import Animation, Wait, prepare_animation from ..animation.composition import AnimationGroup from ..mobject.mobject import Mobject, Updater, _AnimationBuilder -from ..scene.scene import Scene class ChangeSpeed(Animation): @@ -278,15 +277,11 @@ def interpolate(self, alpha: float) -> None: def update_mobjects(self, dt: float) -> None: self.anim.update_mobjects(dt) - def finish(self) -> None: - ChangeSpeed.is_changing_dt = False - self.anim.finish() - def begin(self) -> None: self.anim.begin() + self.process_subanimation_buffer(self.anim.buffer) - def clean_up_from_scene(self, scene: Scene) -> None: - self.anim.clean_up_from_scene(scene) - - def _setup_scene(self, scene) -> None: - self.anim._setup_scene(scene) + def finish(self) -> None: + ChangeSpeed.is_changing_dt = False + self.anim.finish() + self.process_subanimation_buffer(self.anim.buffer) diff --git a/manim/animation/transform.py b/manim/animation/transform.py index 85b1fbca4b..4ea41f6979 100644 --- a/manim/animation/transform.py +++ b/manim/animation/transform.py @@ -205,10 +205,13 @@ def create_target(self) -> Mobject: # in subclasses return self.target_mobject - def clean_up_from_scene(self, scene: Scene) -> None: - super().clean_up_from_scene(scene) + def finish(self) -> None: + super().finish() if self.replace_mobject_with_target_in_scene: - scene.replace(self.mobject, self.target_mobject) + # Ideally this should stay at the same z-level as + # the original mobject, but this is difficult to implement + self.buffer.remove(self.mobject) + self.buffer.add(self.target_mobject) def get_all_mobjects(self) -> Sequence[Mobject]: return [ @@ -871,11 +874,11 @@ def get_all_mobjects(self) -> Sequence[Mobject]: def get_all_families_zipped(self): return Animation.get_all_families_zipped(self) - def clean_up_from_scene(self, scene): - Animation.clean_up_from_scene(self, scene) - scene.remove(self.mobject) + def finish(self): + Animation.finish(self) # TODO: is this really needed over super()? + self.buffer.remove(self.mobject) self.mobject[0].restore() - scene.add(self.to_add_on_completion) + self.buffer.add(self.to_add_on_completion) class FadeTransformPieces(FadeTransform): diff --git a/manim/animation/transform_matching_parts.py b/manim/animation/transform_matching_parts.py index 8c97643860..8e02b0e800 100644 --- a/manim/animation/transform_matching_parts.py +++ b/manim/animation/transform_matching_parts.py @@ -19,9 +19,6 @@ from .fading import FadeIn, FadeOut from .transform import FadeTransformPieces, Transform -if TYPE_CHECKING: - from ..scene.scene import Scene - class TransformMatchingAbstractBase(AnimationGroup): """Abstract base class for transformations that keep track of matching parts. @@ -153,13 +150,14 @@ def get_shape_map(self, mobject: Mobject) -> dict: shape_map[key].add(sm) return shape_map - def clean_up_from_scene(self, scene: Scene) -> None: + def finish(self) -> None: + super().finish() # Interpolate all animations back to 0 to ensure source mobjects remain unchanged. for anim in self.animations: anim.interpolate(0) - scene.remove(self.mobject) - scene.remove(*self.to_remove) - scene.add(self.to_add) + self.buffer.remove(self.mobject) + self.buffer.remove(*self.to_remove) + self.buffer.add(self.to_add) @staticmethod def get_mobject_parts(mobject: Mobject): diff --git a/manim/camera/cairo_camera.py b/manim/camera/cairo_camera.py deleted file mode 100644 index 9b1671ecce..0000000000 --- a/manim/camera/cairo_camera.py +++ /dev/null @@ -1,1213 +0,0 @@ -"""A camera converts the mobjects contained in a Scene into an array of pixels.""" - - -from __future__ import annotations - -__all__ = ["CairoCamera"] - -import copy -import itertools as it -import operator as op -import pathlib -import time -from functools import reduce -from typing import Any, Callable, Iterable - -import cairo -import numpy as np -from PIL import Image -from scipy.spatial.distance import pdist - -from .. import config, logger -from ..constants import * -from ..mobject.mobject import Mobject -from ..mobject.types.image_mobject import AbstractImageMobject -from ..mobject.types.point_cloud_mobject import PMobject -from ..mobject.types.vectorized_mobject import VMobject -from ..utils.color import color_to_int_rgba -from ..utils.family import extract_mobject_family_members -from ..utils.images import get_full_raster_image_path -from ..utils.iterables import list_difference_update -from ..utils.space_ops import angle_of_vector - -LINE_JOIN_MAP = { - LineJointType.AUTO: None, # TODO: this could be improved - LineJointType.ROUND: cairo.LineJoin.ROUND, - LineJointType.BEVEL: cairo.LineJoin.BEVEL, - LineJointType.MITER: cairo.LineJoin.MITER, -} - - -class CairoCamera: - """Cairo rendering implementation. - - This is the object which takes care of what exactly is displayed - on screen at any given moment. - - Parameters - ---------- - background_image - The path to an image that should be the background image. - If not set, the background is filled with :attr:`self.background_color` - background - What :attr:`background` is set to. By default, ``None``. - pixel_height - The height of the scene in pixels. - pixel_width - The width of the scene in pixels. - kwargs - Additional arguments (``background_color``, ``background_opacity``) - to be set. - """ - - def __init__( - self, - background_image: str | None = None, - frame_center: np.ndarray = ORIGIN, - image_mode: str = "RGBA", - n_channels: int = 4, - pixel_array_dtype: str = "uint8", - cairo_line_width_multiple: float = 0.01, - use_z_index: bool = True, - background: np.ndarray | None = None, - pixel_height: int | None = None, - pixel_width: int | None = None, - frame_height: float | None = None, - frame_width: float | None = None, - frame_rate: float | None = None, - **kwargs, - ): - logger.warning("Camera is deprecated. Please use OpenGLCamera instead.") - self.background_image = background_image - self.frame_center = frame_center - self.image_mode = image_mode - self.n_channels = n_channels - self.pixel_array_dtype = pixel_array_dtype - self.cairo_line_width_multiple = cairo_line_width_multiple - self.use_z_index = use_z_index - self.background = background - - if pixel_height is None: - pixel_height = config["pixel_height"] - self.pixel_height = pixel_height - - if pixel_width is None: - pixel_width = config["pixel_width"] - self.pixel_width = pixel_width - - if frame_height is None: - frame_height = config["frame_height"] - self.frame_height = frame_height - - if frame_width is None: - frame_width = config["frame_width"] - self.frame_width = frame_width - - if frame_rate is None: - frame_rate = config["frame_rate"] - self.frame_rate = frame_rate - - # TODO: change this to not use kwargs.get - for attr in ["background_color", "background_opacity"]: - setattr(self, f"_{attr}", kwargs.get(attr, config[attr])) - - # This one is in the same boat as the above, but it doesn't have the - # same name as the corresponding key so it has to be handled on its own - self.max_allowable_norm = config["frame_width"] - - self.rgb_max_val = np.iinfo(self.pixel_array_dtype).max - self.pixel_array_to_cairo_context = {} - - # Contains the correct method to process a list of Mobjects of the - # corresponding class. If a Mobject is not an instance of a class in - # this dict (or an instance of a class that inherits from a class in - # this dict), then it cannot be rendered. - - self.init_background() - self.resize_frame_shape() - self.reset() - - def __deepcopy__(self, memo): - # This is to address a strange bug where deepcopying - # will result in a segfault, which is somehow related - # to the aggdraw library - self.canvas = None - return copy.copy(self) - - @property - def background_color(self): - return self._background_color - - @background_color.setter - def background_color(self, color): - self._background_color = color - self.init_background() - - @property - def background_opacity(self): - return self._background_opacity - - @background_opacity.setter - def background_opacity(self, alpha): - self._background_opacity = alpha - self.init_background() - - def type_or_raise(self, mobject: Mobject): - """Return the type of mobject, if it is a type that can be rendered. - - If `mobject` is an instance of a class that inherits from a class that - can be rendered, return the super class. For example, an instance of a - Square is also an instance of VMobject, and these can be rendered. - Therefore, `type_or_raise(Square())` returns True. - - Parameters - ---------- - mobject - The object to take the type of. - - Notes - ----- - For a list of classes that can currently be rendered, see :meth:`display_funcs`. - - Returns - ------- - Type[:class:`~.Mobject`] - The type of mobjects, if it can be rendered. - - Raises - ------ - :exc:`TypeError` - When mobject is not an instance of a class that can be rendered. - """ - self.display_funcs = { - VMobject: self.display_multiple_vectorized_mobjects, - PMobject: self.display_multiple_point_cloud_mobjects, - AbstractImageMobject: self.display_multiple_image_mobjects, - Mobject: lambda batch, pa: batch, # Do nothing - } - # We have to check each type in turn because we are dealing with - # super classes. For example, if square = Square(), then - # type(square) != VMobject, but isinstance(square, VMobject) == True. - for _type in self.display_funcs: - if isinstance(mobject, _type): - return _type - raise TypeError(f"Displaying an object of class {_type} is not supported") - - def reset_pixel_shape(self, new_height: float, new_width: float): - """This method resets the height and width - of a single pixel to the passed new_height and new_width. - - Parameters - ---------- - new_height - The new height of the entire scene in pixels - new_width - The new width of the entire scene in pixels - """ - self.pixel_width = new_width - self.pixel_height = new_height - self.init_background() - self.resize_frame_shape() - self.reset() - - def resize_frame_shape(self, fixed_dimension: int = 0): - """ - Changes frame_shape to match the aspect ratio - of the pixels, where fixed_dimension determines - whether frame_height or frame_width - remains fixed while the other changes accordingly. - - Parameters - ---------- - fixed_dimension - If 0, height is scaled with respect to width - else, width is scaled with respect to height. - """ - pixel_height = self.pixel_height - pixel_width = self.pixel_width - frame_height = self.frame_height - frame_width = self.frame_width - aspect_ratio = pixel_width / pixel_height - if fixed_dimension == 0: - frame_height = frame_width / aspect_ratio - else: - frame_width = aspect_ratio * frame_height - self.frame_height = frame_height - self.frame_width = frame_width - - def init_background(self): - """Initialize the background. - If self.background_image is the path of an image - the image is set as background; else, the default - background color fills the background. - """ - height = self.pixel_height - width = self.pixel_width - if self.background_image is not None: - path = get_full_raster_image_path(self.background_image) - image = Image.open(path).convert(self.image_mode) - # TODO, how to gracefully handle backgrounds - # with different sizes? - self.background = np.array(image)[:height, :width] - self.background = self.background.astype(self.pixel_array_dtype) - else: - background_rgba = color_to_int_rgba( - self.background_color, - self.background_opacity, - ) - self.background = np.zeros( - (height, width, self.n_channels), - dtype=self.pixel_array_dtype, - ) - self.background[:, :] = background_rgba - - def get_image(self, pixel_array: np.ndarray | list | tuple | None = None): - """Returns an image from the passed - pixel array, or from the current frame - if the passed pixel array is none. - - Parameters - ---------- - pixel_array - The pixel array from which to get an image, by default None - - Returns - ------- - PIL.Image - The PIL image of the array. - """ - if pixel_array is None: - pixel_array = self.pixel_array - return Image.fromarray(pixel_array, mode=self.image_mode) - - def convert_pixel_array( - self, pixel_array: np.ndarray | list | tuple, convert_from_floats: bool = False - ): - """Converts a pixel array from values that have floats in then - to proper RGB values. - - Parameters - ---------- - pixel_array - Pixel array to convert. - convert_from_floats - Whether or not to convert float values to ints, by default False - - Returns - ------- - np.array - The new, converted pixel array. - """ - retval = np.array(pixel_array) - if convert_from_floats: - retval = np.apply_along_axis( - lambda f: (f * self.rgb_max_val).astype(self.pixel_array_dtype), - 2, - retval, - ) - return retval - - def set_pixel_array( - self, pixel_array: np.ndarray | list | tuple, convert_from_floats: bool = False - ): - """Sets the pixel array of the camera to the passed pixel array. - - Parameters - ---------- - pixel_array - The pixel array to convert and then set as the camera's pixel array. - convert_from_floats - Whether or not to convert float values to proper RGB values, by default False - """ - converted_array = self.convert_pixel_array(pixel_array, convert_from_floats) - if not ( - hasattr(self, "pixel_array") - and self.pixel_array.shape == converted_array.shape - ): - self.pixel_array = converted_array - else: - # Set in place - self.pixel_array[:, :, :] = converted_array[:, :, :] - - def set_background( - self, pixel_array: np.ndarray | list | tuple, convert_from_floats: bool = False - ): - """Sets the background to the passed pixel_array after converting - to valid RGB values. - - Parameters - ---------- - pixel_array - The pixel array to set the background to. - convert_from_floats - Whether or not to convert floats values to proper RGB valid ones, by default False - """ - self.background = self.convert_pixel_array(pixel_array, convert_from_floats) - - # TODO, this should live in utils, not as a method of Camera - def make_background_from_func( - self, coords_to_colors_func: Callable[[np.ndarray], np.ndarray] - ): - """ - Makes a pixel array for the background by using coords_to_colors_func to determine each pixel's color. Each input - pixel's color. Each input to coords_to_colors_func is an (x, y) pair in space (in ordinary space coordinates; not - pixel coordinates), and each output is expected to be an RGBA array of 4 floats. - - Parameters - ---------- - coords_to_colors_func - The function whose input is an (x,y) pair of coordinates and - whose return values must be the colors for that point - - Returns - ------- - np.array - The pixel array which can then be passed to set_background. - """ - - logger.info("Starting set_background") - coords = self.get_coords_of_all_pixels() - new_background = np.apply_along_axis(coords_to_colors_func, 2, coords) - logger.info("Ending set_background") - - return self.convert_pixel_array(new_background, convert_from_floats=True) - - def set_background_from_func( - self, coords_to_colors_func: Callable[[np.ndarray], np.ndarray] - ): - """ - Sets the background to a pixel array using coords_to_colors_func to determine each pixel's color. Each input - pixel's color. Each input to coords_to_colors_func is an (x, y) pair in space (in ordinary space coordinates; not - pixel coordinates), and each output is expected to be an RGBA array of 4 floats. - - Parameters - ---------- - coords_to_colors_func - The function whose input is an (x,y) pair of coordinates and - whose return values must be the colors for that point - """ - self.set_background(self.make_background_from_func(coords_to_colors_func)) - - def reset(self): - """Resets the camera's pixel array - to that of the background - - Returns - ------- - Camera - The camera object after setting the pixel array. - """ - self.set_pixel_array(self.background) - return self - - def set_frame_to_background(self, background): - self.set_pixel_array(background) - - #### - - def get_mobjects_to_display( - self, - mobjects: Iterable[Mobject], - include_submobjects: bool = True, - excluded_mobjects: list | None = None, - ): - """Used to get the list of mobjects to display - with the camera. - - Parameters - ---------- - mobjects - The Mobjects - include_submobjects - Whether or not to include the submobjects of mobjects, by default True - excluded_mobjects - Any mobjects to exclude, by default None - - Returns - ------- - list - list of mobjects - """ - if include_submobjects: - mobjects = extract_mobject_family_members( - mobjects, - use_z_index=self.use_z_index, - only_those_with_points=True, - ) - if excluded_mobjects: - all_excluded = extract_mobject_family_members( - excluded_mobjects, - use_z_index=self.use_z_index, - ) - mobjects = list_difference_update(mobjects, all_excluded) - return list(mobjects) - - def is_in_frame(self, mobject: Mobject): - """Checks whether the passed mobject is in - frame or not. - - Parameters - ---------- - mobject - The mobject for which the checking needs to be done. - - Returns - ------- - bool - True if in frame, False otherwise. - """ - fc = self.frame_center - fh = self.frame_height - fw = self.frame_width - return not reduce( - op.or_, - [ - mobject.get_right()[0] < fc[0] - fw / 2, - mobject.get_bottom()[1] > fc[1] + fh / 2, - mobject.get_left()[0] > fc[0] + fw / 2, - mobject.get_top()[1] < fc[1] - fh / 2, - ], - ) - - def capture_mobject(self, mobject: Mobject, **kwargs: Any): - """Capture mobjects by storing it in :attr:`pixel_array`. - - This is a single-mobject version of :meth:`capture_mobjects`. - - Parameters - ---------- - mobject - Mobject to capture. - - kwargs - Keyword arguments to be passed to :meth:`get_mobjects_to_display`. - - """ - return self.capture_mobjects([mobject], **kwargs) - - def capture_mobjects(self, mobjects: Iterable[Mobject], **kwargs): - """Capture mobjects by printing them on :attr:`pixel_array`. - - This is the essential function that converts the contents of a Scene - into an array, which is then converted to an image or video. - - Parameters - ---------- - mobjects - Mobjects to capture. - - kwargs - Keyword arguments to be passed to :meth:`get_mobjects_to_display`. - - Notes - ----- - For a list of classes that can currently be rendered, see :meth:`display_funcs`. - - """ - # The mobjects will be processed in batches (or runs) of mobjects of - # the same type. That is, if the list mobjects contains objects of - # types [VMobject, VMobject, VMobject, PMobject, PMobject, VMobject], - # then they will be captured in three batches: [VMobject, VMobject, - # VMobject], [PMobject, PMobject], and [VMobject]. This must be done - # without altering their order. it.groupby computes exactly this - # partition while at the same time preserving order. - mobjects = self.get_mobjects_to_display(mobjects, **kwargs) - for group_type, group in it.groupby(mobjects, self.type_or_raise): - self.display_funcs[group_type](list(group), self.pixel_array) - - # Methods associated with svg rendering - - # NOTE: None of the methods below have been mentioned outside of their definitions. Their DocStrings are not as - # detailed as possible. - - def get_cached_cairo_context(self, pixel_array: np.ndarray): - """Returns the cached cairo context of the passed - pixel array if it exists, and None if it doesn't. - - Parameters - ---------- - pixel_array - The pixel array to check. - - Returns - ------- - cairo.Context - The cached cairo context. - """ - return self.pixel_array_to_cairo_context.get(id(pixel_array), None) - - def cache_cairo_context(self, pixel_array: np.ndarray, ctx: cairo.Context): - """Caches the passed Pixel array into a Cairo Context - - Parameters - ---------- - pixel_array - The pixel array to cache - ctx - The context to cache it into. - """ - self.pixel_array_to_cairo_context[id(pixel_array)] = ctx - - def get_cairo_context(self, pixel_array: np.ndarray): - """Returns the cairo context for a pixel array after - caching it to self.pixel_array_to_cairo_context - If that array has already been cached, it returns the - cached version instead. - - Parameters - ---------- - pixel_array - The Pixel array to get the cairo context of. - - Returns - ------- - cairo.Context - The cairo context of the pixel array. - """ - cached_ctx = self.get_cached_cairo_context(pixel_array) - if cached_ctx: - return cached_ctx - pw = self.pixel_width - ph = self.pixel_height - fw = self.frame_width - fh = self.frame_height - fc = self.frame_center - surface = cairo.ImageSurface.create_for_data( - pixel_array, - cairo.FORMAT_ARGB32, - pw, - ph, - ) - ctx = cairo.Context(surface) - ctx.scale(pw, ph) - ctx.set_matrix( - cairo.Matrix( - (pw / fw), - 0, - 0, - -(ph / fh), - (pw / 2) - fc[0] * (pw / fw), - (ph / 2) + fc[1] * (ph / fh), - ), - ) - self.cache_cairo_context(pixel_array, ctx) - return ctx - - def display_multiple_vectorized_mobjects( - self, vmobjects: list, pixel_array: np.ndarray - ): - """Displays multiple VMobjects in the pixel_array - - Parameters - ---------- - vmobjects - list of VMobjects to display - pixel_array - The pixel array - """ - if len(vmobjects) == 0: - return - batch_image_pairs = it.groupby(vmobjects, lambda vm: vm.get_background_image()) - for image, batch in batch_image_pairs: - if image: - self.display_multiple_background_colored_vmobjects(batch, pixel_array) - else: - self.display_multiple_non_background_colored_vmobjects( - batch, - pixel_array, - ) - - def display_multiple_non_background_colored_vmobjects( - self, vmobjects: list, pixel_array: np.ndarray - ): - """Displays multiple VMobjects in the cairo context, as long as they don't have - background colors. - - Parameters - ---------- - vmobjects - list of the VMobjects - pixel_array - The Pixel array to add the VMobjects to. - """ - ctx = self.get_cairo_context(pixel_array) - for vmobject in vmobjects: - self.display_vectorized(vmobject, ctx) - - def display_vectorized(self, vmobject: VMobject, ctx: cairo.Context): - """Displays a VMobject in the cairo context - - Parameters - ---------- - vmobject - The Vectorized Mobject to display - ctx - The cairo context to use. - - Returns - ------- - Camera - The camera object - """ - self.set_cairo_context_path(ctx, vmobject) - self.apply_stroke(ctx, vmobject, background=True) - self.apply_fill(ctx, vmobject) - self.apply_stroke(ctx, vmobject) - return self - - def set_cairo_context_path(self, ctx: cairo.Context, vmobject: VMobject): - """Sets a path for the cairo context with the vmobject passed - - Parameters - ---------- - ctx - The cairo context - vmobject - The VMobject - - Returns - ------- - Camera - Camera object after setting cairo_context_path - """ - points = self.transform_points_pre_display(vmobject, vmobject.points) - # TODO, shouldn't this be handled in transform_points_pre_display? - # points = points - self.get_frame_center() - if len(points) == 0: - return - - ctx.new_path() - subpaths = vmobject.gen_subpaths_from_points_2d(points) - for subpath in subpaths: - quads = vmobject.gen_cubic_bezier_tuples_from_points(subpath) - ctx.new_sub_path() - start = subpath[0] - ctx.move_to(*start[:2]) - for _p0, p1, p2, p3 in quads: - ctx.curve_to(*p1[:2], *p2[:2], *p3[:2]) - if vmobject.consider_points_equals_2d(subpath[0], subpath[-1]): - ctx.close_path() - return self - - def set_cairo_context_color( - self, ctx: cairo.Context, rgbas: np.ndarray, vmobject: VMobject - ): - """Sets the color of the cairo context - - Parameters - ---------- - ctx - The cairo context - rgbas - The RGBA array with which to color the context. - vmobject - The VMobject with which to set the color. - - Returns - ------- - Camera - The camera object - """ - if len(rgbas) == 1: - # Use reversed rgb because cairo surface is - # encodes it in reverse order - ctx.set_source_rgba(*rgbas[0][2::-1], rgbas[0][3]) - else: - points = vmobject.get_gradient_start_and_end_points() - points = self.transform_points_pre_display(vmobject, points) - pat = cairo.LinearGradient(*it.chain(*(point[:2] for point in points))) - step = 1.0 / (len(rgbas) - 1) - offsets = np.arange(0, 1 + step, step) - for rgba, offset in zip(rgbas, offsets): - pat.add_color_stop_rgba(offset, *rgba[2::-1], rgba[3]) - ctx.set_source(pat) - return self - - def apply_fill(self, ctx: cairo.Context, vmobject: VMobject): - """Fills the cairo context - - Parameters - ---------- - ctx - The cairo context - vmobject - The VMobject - - Returns - ------- - Camera - The camera object. - """ - self.set_cairo_context_color(ctx, self.get_fill_rgbas(vmobject), vmobject) - ctx.fill_preserve() - return self - - def apply_stroke( - self, ctx: cairo.Context, vmobject: VMobject, background: bool = False - ): - """Applies a stroke to the VMobject in the cairo context. - - Parameters - ---------- - ctx - The cairo context - vmobject - The VMobject - background - Whether or not to consider the background when applying this - stroke width, by default False - - Returns - ------- - Camera - The camera object with the stroke applied. - """ - width = vmobject.get_stroke_width(background) - if width == 0: - return self - self.set_cairo_context_color( - ctx, - self.get_stroke_rgbas(vmobject, background=background), - vmobject, - ) - ctx.set_line_width( - width - * self.cairo_line_width_multiple - # This ensures lines have constant width as you zoom in on them. - * (self.frame_width / self.frame_width), - ) - if vmobject.joint_type != LineJointType.AUTO: - ctx.set_line_join(LINE_JOIN_MAP[vmobject.joint_type]) - ctx.stroke_preserve() - return self - - def get_stroke_rgbas(self, vmobject: VMobject, background: bool = False): - """Gets the RGBA array for the stroke of the passed - VMobject. - - Parameters - ---------- - vmobject - The VMobject - background - Whether or not to consider the background when getting the stroke - RGBAs, by default False - - Returns - ------- - np.ndarray - The RGBA array of the stroke. - """ - return vmobject.get_stroke_rgbas(background) - - def get_fill_rgbas(self, vmobject: VMobject): - """Returns the RGBA array of the fill of the passed VMobject - - Parameters - ---------- - vmobject - The VMobject - - Returns - ------- - np.array - The RGBA Array of the fill of the VMobject - """ - return vmobject.get_fill_rgbas() - - def get_background_colored_vmobject_displayer(self): - """Returns the background_colored_vmobject_displayer - if it exists or makes one and returns it if not. - - Returns - ------- - BackGroundColoredVMobjectDisplayer - Object that displays VMobjects that have the same color - as the background. - """ - # Quite wordy to type out a bunch - bcvd = "background_colored_vmobject_displayer" - if not hasattr(self, bcvd): - setattr(self, bcvd, BackgroundColoredVMobjectDisplayer(self)) - return getattr(self, bcvd) - - def display_multiple_background_colored_vmobjects( - self, cvmobjects: list, pixel_array: np.ndarray - ): - """Displays multiple vmobjects that have the same color as the background. - - Parameters - ---------- - cvmobjects - List of Colored VMobjects - pixel_array - The pixel array. - - Returns - ------- - Camera - The camera object. - """ - displayer = self.get_background_colored_vmobject_displayer() - cvmobject_pixel_array = displayer.display(*cvmobjects) - self.overlay_rgba_array(pixel_array, cvmobject_pixel_array) - return self - - # Methods for other rendering - - # NOTE: Out of the following methods, only `transform_points_pre_display` and `points_to_pixel_coords` have been mentioned outside of their definitions. - # As a result, the other methods do not have as detailed docstrings as would be preferred. - - def display_multiple_point_cloud_mobjects( - self, pmobjects: list, pixel_array: np.ndarray - ): - """Displays multiple PMobjects by modifying the passed pixel array. - - Parameters - ---------- - pmobjects - List of PMobjects - pixel_array - The pixel array to modify. - """ - for pmobject in pmobjects: - self.display_point_cloud( - pmobject, - pmobject.points, - pmobject.rgbas, - self.adjusted_thickness(pmobject.stroke_width), - pixel_array, - ) - - def display_point_cloud( - self, - pmobject: PMobject, - points: list, - rgbas: np.ndarray, - thickness: float, - pixel_array: np.ndarray, - ): - """Displays a PMobject by modifying the Pixel array suitably.. - TODO: Write a description for the rgbas argument. - Parameters - ---------- - pmobject - Point Cloud Mobject - points - The points to display in the point cloud mobject - rgbas - - thickness - The thickness of each point of the PMobject - pixel_array - The pixel array to modify. - - """ - if len(points) == 0: - return - pixel_coords = self.points_to_pixel_coords(pmobject, points) - pixel_coords = self.thickened_coordinates(pixel_coords, thickness) - rgba_len = pixel_array.shape[2] - - rgbas = (self.rgb_max_val * rgbas).astype(self.pixel_array_dtype) - target_len = len(pixel_coords) - factor = target_len // len(rgbas) - rgbas = np.array([rgbas] * factor).reshape((target_len, rgba_len)) - - on_screen_indices = self.on_screen_pixels(pixel_coords) - pixel_coords = pixel_coords[on_screen_indices] - rgbas = rgbas[on_screen_indices] - - ph = self.pixel_height - pw = self.pixel_width - - flattener = np.array([1, pw], dtype="int") - flattener = flattener.reshape((2, 1)) - indices = np.dot(pixel_coords, flattener)[:, 0] - indices = indices.astype("int") - - new_pa = pixel_array.reshape((ph * pw, rgba_len)) - new_pa[indices] = rgbas - pixel_array[:, :] = new_pa.reshape((ph, pw, rgba_len)) - - def display_multiple_image_mobjects( - self, image_mobjects: list, pixel_array: np.ndarray - ): - """Displays multiple image mobjects by modifying the passed pixel_array. - - Parameters - ---------- - image_mobjects - list of ImageMobjects - pixel_array - The pixel array to modify. - """ - for image_mobject in image_mobjects: - self.display_image_mobject(image_mobject, pixel_array) - - def display_image_mobject( - self, image_mobject: AbstractImageMobject, pixel_array: np.ndarray - ): - """Displays an ImageMobject by changing the pixel_array suitably. - - Parameters - ---------- - image_mobject - The imageMobject to display - pixel_array - The Pixel array to put the imagemobject in. - """ - corner_coords = self.points_to_pixel_coords(image_mobject, image_mobject.points) - ul_coords, ur_coords, dl_coords = corner_coords - right_vect = ur_coords - ul_coords - down_vect = dl_coords - ul_coords - center_coords = ul_coords + (right_vect + down_vect) / 2 - - sub_image = Image.fromarray(image_mobject.get_pixel_array(), mode="RGBA") - - # Reshape - pixel_width = max(int(pdist([ul_coords, ur_coords])), 1) - pixel_height = max(int(pdist([ul_coords, dl_coords])), 1) - sub_image = sub_image.resize( - (pixel_width, pixel_height), - resample=image_mobject.resampling_algorithm, - ) - - # Rotate - angle = angle_of_vector(right_vect) - adjusted_angle = -int(360 * angle / TAU) - if adjusted_angle != 0: - sub_image = sub_image.rotate( - adjusted_angle, - resample=image_mobject.resampling_algorithm, - expand=1, - ) - - # TODO, there is no accounting for a shear... - - # Paste into an image as large as the camera's pixel array - full_image = Image.fromarray( - np.zeros((self.pixel_height, self.pixel_width)), - mode="RGBA", - ) - new_ul_coords = center_coords - np.array(sub_image.size) / 2 - new_ul_coords = new_ul_coords.astype(int) - full_image.paste( - sub_image, - box=( - new_ul_coords[0], - new_ul_coords[1], - new_ul_coords[0] + sub_image.size[0], - new_ul_coords[1] + sub_image.size[1], - ), - ) - # Paint on top of existing pixel array - self.overlay_PIL_image(pixel_array, full_image) - - def overlay_rgba_array(self, pixel_array: np.ndarray, new_array: np.ndarray): - """Overlays an RGBA array on top of the given Pixel array. - - Parameters - ---------- - pixel_array - The original pixel array to modify. - new_array - The new pixel array to overlay. - """ - self.overlay_PIL_image(pixel_array, self.get_image(new_array)) - - def overlay_PIL_image(self, pixel_array: np.ndarray, image: Image): - """Overlays a PIL image on the passed pixel array. - - Parameters - ---------- - pixel_array - The Pixel array - image - The Image to overlay. - """ - pixel_array[:, :] = np.array( - Image.alpha_composite(self.get_image(pixel_array), image), - dtype="uint8", - ) - - def adjust_out_of_range_points(self, points: np.ndarray): - """If any of the points in the passed array are out of - the viable range, they are adjusted suitably. - - Parameters - ---------- - points - The points to adjust - - Returns - ------- - np.array - The adjusted points. - """ - if not np.any(points > self.max_allowable_norm): - return points - norms = np.apply_along_axis(np.linalg.norm, 1, points) - violator_indices = norms > self.max_allowable_norm - violators = points[violator_indices, :] - violator_norms = norms[violator_indices] - reshaped_norms = np.repeat( - violator_norms.reshape((len(violator_norms), 1)), - points.shape[1], - 1, - ) - rescaled = self.max_allowable_norm * violators / reshaped_norms - points[violator_indices] = rescaled - return points - - def transform_points_pre_display( - self, - mobject, - points, - ): # TODO: Write more detailed docstrings for this method. - # NOTE: There seems to be an unused argument `mobject`. - - # Subclasses (like ThreeDCamera) may want to - # adjust points further before they're shown - if not np.all(np.isfinite(points)): - # TODO, print some kind of warning about - # mobject having invalid points? - points = np.zeros((1, 3)) - return points - - def points_to_pixel_coords( - self, - mobject, - points, - ): # TODO: Write more detailed docstrings for this method. - points = self.transform_points_pre_display(mobject, points) - shifted_points = points - self.frame_center - - result = np.zeros((len(points), 2)) - pixel_height = self.pixel_height - pixel_width = self.pixel_width - frame_height = self.frame_height - frame_width = self.frame_width - width_mult = pixel_width / frame_width - width_add = pixel_width / 2 - height_mult = pixel_height / frame_height - height_add = pixel_height / 2 - # Flip on y-axis as you go - height_mult *= -1 - - result[:, 0] = shifted_points[:, 0] * width_mult + width_add - result[:, 1] = shifted_points[:, 1] * height_mult + height_add - return result.astype("int") - - def on_screen_pixels(self, pixel_coords: np.ndarray): - """Returns array of pixels that are on the screen from a given - array of pixel_coordinates - - Parameters - ---------- - pixel_coords - The pixel coords to check. - - Returns - ------- - np.array - The pixel coords on screen. - """ - return reduce( - op.and_, - [ - pixel_coords[:, 0] >= 0, - pixel_coords[:, 0] < self.pixel_width, - pixel_coords[:, 1] >= 0, - pixel_coords[:, 1] < self.pixel_height, - ], - ) - - def adjusted_thickness(self, thickness: float): - """ - - Parameters - ---------- - thickness - - Returns - ------- - float - - """ - # TODO: This seems...unsystematic - big_sum = op.add(config["pixel_height"], config["pixel_width"]) - this_sum = op.add(self.pixel_height, self.pixel_width) - factor = big_sum / this_sum - return 1 + (thickness - 1) * factor - - def get_thickening_nudges(self, thickness: float): - """ - - Parameters - ---------- - thickness - - Returns - ------- - np.array - - """ - thickness = int(thickness) - _range = list(range(-thickness // 2 + 1, thickness // 2 + 1)) - return np.array(list(it.product(_range, _range))) - - def thickened_coordinates(self, pixel_coords: np.ndarray, thickness: float): - """Returns thickened coordinates for a passed array of pixel coords and - a thickness to thicken by. - - Parameters - ---------- - pixel_coords - Pixel coordinates - thickness - Thickness - - Returns - ------- - np.array - Array of thickened pixel coords. - """ - nudges = self.get_thickening_nudges(thickness) - pixel_coords = np.array([pixel_coords + nudge for nudge in nudges]) - size = pixel_coords.size - return pixel_coords.reshape((size // 2, 2)) - - # TODO, reimplement using cairo matrix - def get_coords_of_all_pixels(self): - """Returns the cartesian coordinates of each pixel. - - Returns - ------- - np.ndarray - The array of cartesian coordinates. - """ - # These are in x, y order, to help me keep things straight - full_space_dims = np.array([self.frame_width, self.frame_height]) - full_pixel_dims = np.array([self.pixel_width, self.pixel_height]) - - # These are addressed in the same y, x order as in pixel_array, but the values in them - # are listed in x, y order - uncentered_pixel_coords = np.indices([self.pixel_height, self.pixel_width])[ - ::-1 - ].transpose(1, 2, 0) - uncentered_space_coords = ( - uncentered_pixel_coords * full_space_dims - ) / full_pixel_dims - # Could structure above line's computation slightly differently, but figured (without much - # thought) multiplying by frame_shape first, THEN dividing by pixel_shape, is probably - # better than the other order, for avoiding underflow quantization in the division (whereas - # overflow is unlikely to be a problem) - - centered_space_coords = uncentered_space_coords - (full_space_dims / 2) - - # Have to also flip the y coordinates to account for pixel array being listed in - # top-to-bottom order, opposite of screen coordinate convention - centered_space_coords = centered_space_coords * (1, -1) - - return centered_space_coords diff --git a/manim/camera/camera.py b/manim/camera/camera.py index 413ce60c89..bf6a285caa 100644 --- a/manim/camera/camera.py +++ b/manim/camera/camera.py @@ -3,18 +3,8 @@ import itertools as it import math import sys -import time from typing import Any, Iterable -from manim.renderer.shader_wrapper import ShaderWrapper - -from ..constants import RADIANS - -if sys.version_info < (3, 8): - from backports.cached_property import cached_property -else: - from functools import cached_property - import moderngl import numpy as np from PIL import Image @@ -22,16 +12,18 @@ from manim import config, logger from manim.mobject.opengl.opengl_mobject import OpenGLMobject, OpenGLPoint +from manim.renderer.shader_wrapper import ShaderWrapper from manim.utils.color import BLACK, color_to_rgba from ..constants import * -from ..utils.config_ops import _Data +from ..constants import RADIANS from ..utils.simple_functions import fdiv from ..utils.space_ops import normalize -# TODO: This becomes the new camera in the future -class OpenGLCameraFrame(OpenGLMobject): +class Camera(OpenGLMobject): + fps: int = 30 + def __init__( self, frame_shape: tuple[float, float] = (config.frame_width, config.frame_height), @@ -45,9 +37,6 @@ def __init__( self.orientation = Rotation.identity().as_quat() super().__init__(**kwargs) - def init_uniforms(self): - super().init_uniforms() - def init_points(self) -> None: self.set_points([ORIGIN, LEFT, RIGHT, DOWN, UP]) self.set_width(self.frame_shape[0], stretch=True) diff --git a/manim/cli/render/global_options.py b/manim/cli/render/global_options.py index b17e4671c2..6e5bf5e8fc 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -102,4 +102,5 @@ def validate_gui_location(ctx, param, value): help="Renders animations without outputting image or video files and disables the window", default=False, ), + option("--parallel", default=True, help="Renders all animations in parallel"), ) diff --git a/manim/mobject/logo.py b/manim/mobject/logo.py index fcb7adef9e..4f054c7d72 100644 --- a/manim/mobject/logo.py +++ b/manim/mobject/logo.py @@ -261,7 +261,7 @@ def construct(self): ) """ - if direction not in ["left", "right", "center"]: + if direction.lower() not in {"left", "right", "center"}: raise ValueError("direction must be 'left', 'right' or 'center'.") m_shape_offset = 6.25 * self.scale_factor @@ -301,7 +301,7 @@ def slide_and_uncover(mob, alpha): if alpha == 1: self.remove(*[self.anim]) self.add_to_back(self.anim) - mob.shapes.set_z_index(0) + mob.shapes.set_z(0) mob.shapes.save_state() mob.M.save_state() diff --git a/manim/mobject/opengl/opengl_mobject.py b/manim/mobject/opengl/opengl_mobject.py index 5de786e785..391f87c3bc 100644 --- a/manim/mobject/opengl/opengl_mobject.py +++ b/manim/mobject/opengl/opengl_mobject.py @@ -48,12 +48,12 @@ ) if TYPE_CHECKING: - from typing import Callable, Iterable, Sequence, Tuple, Union + from typing import Any, Callable, Iterable, Sequence, Union from typing_extensions import Self, TypeAlias TimeBasedUpdater: TypeAlias = Callable[ - ["OpenGLMobject", float], "OpenGLMobject" | None + ["OpenGLMobject", float], "OpenGLMobject | None" ] NonTimeUpdater: TypeAlias = Callable[["OpenGLMobject"], "OpenGLMobject" | None] Updater: TypeAlias = Union[TimeBasedUpdater, NonTimeUpdater] @@ -61,11 +61,12 @@ from manim.renderer.renderer import RendererData T = TypeVar("T", bound=RendererData) + _F = TypeVar("_F", bound=Callable[..., Any]) UNIFORM_DTYPE = np.float64 -def stash_mobject_pointers(func: Callable): +def stash_mobject_pointers(func: _F) -> _F: @wraps(func) def wrapper(self, *args, **kwargs): uncopied_attrs = ["parents", "target", "saved_state"] diff --git a/manim/mobject/opengl/opengl_vectorized_mobject.py b/manim/mobject/opengl/opengl_vectorized_mobject.py index 0e501cb87d..f23a3e3caf 100644 --- a/manim/mobject/opengl/opengl_vectorized_mobject.py +++ b/manim/mobject/opengl/opengl_vectorized_mobject.py @@ -7,6 +7,7 @@ import moderngl import numpy as np +from numpy.typing import NDArray from manim import config from manim.constants import * @@ -29,6 +30,7 @@ quadratic_bezier_remap, ) from manim.utils.color import * +from manim.utils.deprecation import deprecated from manim.utils.iterables import ( listify, make_even, @@ -497,7 +499,7 @@ def add_quadratic_bezier_curve_to(self, handle, anchor): else: self.append_points([self.get_last_point(), handle, anchor]) - def add_line_to(self, point: Sequence[float]) -> Self: + def add_line_to(self, point: Sequence[float] | NDArray[float]) -> Self: """Add a straight line from the last point of OpenGLVMobject to the given point. Parameters @@ -506,6 +508,10 @@ def add_line_to(self, point: Sequence[float]) -> Self: point end of the straight line. """ + point = np.asarray(point) + if not self.has_points(): + self.points = np.array([point]) + return self end = self.points[-1] alphas = np.linspace(0, 1, self.n_points_per_curve) if self.long_lines: @@ -577,7 +583,7 @@ def subdivide_sharp_curves(self, angle_threshold=30 * DEGREES, recurse=True): def add_points_as_corners(self, points): for point in points: self.add_line_to(point) - return points + return self def set_points_as_corners(self, points: Iterable[float]) -> Self: """Given an array of points, set them as corner of the vmobject. @@ -1323,7 +1329,7 @@ def interpolate_color(self, mobject1, mobject2, alpha): attrs = [ "fill_color", "stroke_color", - "opacity", + # "opacity", # TODO: This probably doesn't exist anymore because opacity is now moved into the colors "reflectiveness", "shadow", "gloss", @@ -1562,6 +1568,18 @@ def __str__(self): f"submobject{'s' if len(self.submobjects) > 0 else ''}" ) + def set_z(self, z: float) -> Self: + self.points[..., -1] = z + return self + + @deprecated( + since="0.18.2", + until="0.19.0", + message="OpenGL has no concept of z_index. Use set_z instead", + ) + def set_z_index(self, z: float) -> Self: + return self.set_z(z) + def add(self, *vmobjects: OpenGLVMobject): # type: ignore """Checks if all passed elements are an instance of OpenGLVMobject and then add them to submobjects diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index de9e13ac6f..6fe51a7c14 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -15,7 +15,7 @@ import itertools as it import sys import typing -from typing import Callable, Sequence +from typing import TYPE_CHECKING, Callable, Sequence import numpy as np from PIL.Image import Image @@ -38,9 +38,13 @@ proportions_along_bezier_curve_for_point, ) from ...utils.color import BLACK, WHITE, ManimColor, ParsableManimColor +from ...utils.deprecation import deprecated from ...utils.iterables import make_even, resize_array, stretch_array_to_length, tuplify from ...utils.space_ops import rotate_vector, shoelace_direction +if TYPE_CHECKING: + from typing_extensions import Self + # TODO # - Change cubic curve groups to have 4 points instead of 3 # - Change sub_path idea accordingly @@ -622,6 +626,18 @@ def set_points(self, points): self.points = np.array(points) return self + def set_z(self, z: float) -> Self: + self.points[..., -1] = z + return self + + @deprecated( + since="0.18.2", + until="0.19.0", + message="OpenGL has no concept of z_index. Use set_z instead", + ) + def set_z_index(self, z: float) -> Self: + return self.set_z(z) + def resize_points( self, new_length: int, diff --git a/manim/renderer/buffers/buffer.py b/manim/renderer/buffers/buffer.py index e028ee2654..8828b0a5be 100644 --- a/manim/renderer/buffers/buffer.py +++ b/manim/renderer/buffers/buffer.py @@ -4,7 +4,7 @@ class STD140BufferFormat: - _GL_DTYPES: dict[str, tuple[str, int, tuple[int, ...]]] = { + _GL_DTYPES: dict[str, tuple[str, type[np.float_], tuple[int, ...]]] = { "int": ("i", np.float32, (1,)), "ivec2": ("i", np.float32, (2,)), "ivec3": ("i", np.float32, (3,)), @@ -44,19 +44,17 @@ class STD140BufferFormat: def __init__( self, name: str, - struct: tuple[(str, str), ...], + struct: tuple[tuple[str, str], ...], ) -> None: self.dtype = [] - self._paddings = dict() # LUT for future writes + self._paddings = {} # LUT for future writes byte_offset = 0 # Track the offset so we can calculate padding for alignment -- NOTE: use RenderDoc to debug for data_type, var_name in struct: - base_char, base_bytesize, shape = self._GL_DTYPES[data_type] + _base_char, base_bytesize, shape = self._GL_DTYPES[data_type] shape = dict(enumerate(shape)) col_len, row_len = shape.get(0, 1), shape.get(1, 1) # Calculate padding for NON (float/vec2) items - col_padding = ( - 0 if row_len == 1 and (col_len == 1 or col_len == 2) else 4 - col_len - ) + col_padding = 0 if row_len == 1 and (col_len in [1, 2]) else 4 - col_len # Store padding in LUT self._paddings[var_name] = col_padding shape = (col_len + col_padding,) @@ -95,7 +93,7 @@ def _write_padded(self, data: tuple | np.ndarray, var: str) -> np.ndarray: try: # This fails for 1D data (python or np.array) return np.pad(data, ((0, 0), (0, self._paddings[var])), mode="constant") - except: + except Exception: return np.pad(data, ((0, self._paddings[var])), mode="constant") def write(self, data: dict) -> None: diff --git a/manim/renderer/opengl_file_writer.py b/manim/renderer/opengl_file_writer.py new file mode 100644 index 0000000000..0529bb6245 --- /dev/null +++ b/manim/renderer/opengl_file_writer.py @@ -0,0 +1,471 @@ +from __future__ import annotations + +import os +import pathlib as path +import platform +import shutil +import subprocess as sp +import sys +from pathlib import Path +from typing import TYPE_CHECKING + +import numpy as np +from pydub import AudioSegment +from tqdm import tqdm as ProgressDisplay + +from manim import config +from manim._config import logger as log +from manim.mobject.mobject import Mobject +from manim.utils.file_ops import ( + add_extension_if_not_present, + get_sorted_integer_files, + guarantee_existence, +) +from manim.utils.sounds import get_full_sound_file_path + +if TYPE_CHECKING: + from PIL.Image import Image + + from manim.camera.camera import OpenGLCamera as Camera + + +class FileWriter: + def __init__( + self, + file_name: str, + write_to_movie: bool = False, + break_into_partial_movies: bool = False, + save_pngs: bool = False, # TODO, this currently does nothing + png_mode: str = "RGBA", + save_last_frame: bool = False, + movie_file_extension: str = ".mp4", + # What python file is generating this scene + input_file_path: str = "", + # Where should this be written + output_directory: str | None = None, + open_file_upon_completion: bool = False, + show_file_location_upon_completion: bool = False, + quiet: bool = False, + total_frames: int = 0, + progress_description_len: int = 40, + ): + self.frames: list[Image] = [] + self.write_to_movie = write_to_movie + self.break_into_partial_movies = break_into_partial_movies + self.save_pngs = save_pngs + self.png_mode = png_mode + self.save_last_frame = save_last_frame + self.movie_file_extension = movie_file_extension + self.input_file_path = input_file_path + self.output_directory = output_directory + self.file_name = file_name + self.open_file_upon_completion = open_file_upon_completion + self.show_file_location_upon_completion = show_file_location_upon_completion + self.quiet = quiet + self.total_frames = total_frames + self.progress_description_len = progress_description_len + + # State during file writing + self.writing_process: sp.Popen | None = None + self.progress_display: ProgressDisplay | None = None + self.ended_with_interrupt: bool = False + self.init_output_directories() + self.init_audio() + + # Output directories and files + def init_output_directories(self) -> None: + out_dir = self.output_directory or "" + scene_name = Path(self.file_name) + if self.save_last_frame: + image_dir = guarantee_existence(Path(out_dir) / "images") + image_file = add_extension_if_not_present(scene_name, ".png") + self.image_file_path = Path(image_dir) / image_file + if self.write_to_movie: + movie_dir = guarantee_existence(Path(out_dir) / "videos") + movie_file = add_extension_if_not_present( + scene_name, self.movie_file_extension + ) + self.movie_file_path = Path(movie_dir) / movie_file + if self.break_into_partial_movies: + self.partial_movie_directory = guarantee_existence( + Path(movie_dir) / "partial_movie_files" / scene_name, + ) + # A place to save mobjects + self.saved_mobject_directory = Path(out_dir) / "mobjects" / scene_name + + def add_frames(self, *frames: Image) -> None: + self.frames.extend(frames) + + def get_default_module_directory(self) -> str: + path, _ = os.path.splitext(self.input_file_path) + path = path.removeprefix("_") + return path + + # Directory getters + def get_image_file_path(self) -> str: + return self.image_file_path + + # Sound + def init_audio(self) -> None: + self.includes_sound: bool = False + + def create_audio_segment(self) -> None: + self.audio_segment = AudioSegment.silent() + + def add_audio_segment( + self, + new_segment: AudioSegment, + time: float | None = None, + gain_to_background: float | None = None, + ) -> None: + if not self.includes_sound: + self.includes_sound = True + self.create_audio_segment() + segment = self.audio_segment + curr_end = segment.duration_seconds + if time is None: + time = curr_end + if time < 0: + raise Exception("Adding sound at timestamp < 0") + + new_end = time + new_segment.duration_seconds + diff = new_end - curr_end + if diff > 0: + segment = segment.append( + AudioSegment.silent(int(np.ceil(diff * 1000))), + crossfade=0, + ) + self.audio_segment = segment.overlay( + new_segment, + position=int(1000 * time), + gain_during_overlay=gain_to_background, + ) + + def add_sound( + self, + sound_file: str, + time: float | None = None, + gain: float | None = None, + gain_to_background: float | None = None, + ) -> None: + file_path = get_full_sound_file_path(sound_file) + new_segment = AudioSegment.from_file(file_path) + if gain: + new_segment = new_segment.apply_gain(gain) + self.add_audio_segment(new_segment, time, gain_to_background) + + # Writers + def begin(self) -> None: + if not self.break_into_partial_movies and self.write_to_movie: + self.open_movie_pipe(self.get_movie_file_path()) + + def begin_animation(self) -> None: + if self.break_into_partial_movies and self.write_to_movie: + # self.open_movie_pipe(self.get_next_partial_movie_path()) + ... + + def end_animation(self) -> None: + if self.break_into_partial_movies and self.write_to_movie: + # self.close_movie_pipe() + ... + + def finish(self) -> None: + if self.write_to_movie: + if self.break_into_partial_movies: + self.combine_movie_files() + else: + self.close_movie_pipe() + if self.includes_sound: + self.add_sound_to_video() + self.print_file_ready_message(self.get_movie_file_path()) + if self.save_last_frame: + self.save_final_image(self.scene.get_image()) + if self.should_open_file(): + self.open_file() + + def open_movie_pipe(self, file_path: str) -> None: + stem, ext = os.path.splitext(file_path) + self.final_file_path = file_path + self.temp_file_path = stem + "_temp" + ext + + fps = self.scene.camera.fps + width, height = self.scene.camera.get_pixel_shape() + + command = [ + config.ffmpeg_executable, + "-y", # overwrite output file if it exists + "-f", + "rawvideo", + "-s", + f"{width}x{height}", # size of one frame + "-pix_fmt", + "rgba", + "-r", + str(fps), # frames per second + "-i", + "-", # The input comes from a pipe + "-vf", + "vflip", + "-an", # Tells FFMPEG not to expect any audio + "-loglevel", + "error", + ] + if self.movie_file_extension == ".mov": + # This is if the background of the exported + # video should be transparent. + command += [ + "-vcodec", + "prores_ks", + ] + elif self.movie_file_extension != ".gif": + command += [ + "-vcodec", + "libx264", + "-pix_fmt", + "yuv420p", + ] + command += [self.temp_file_path] + self.writing_process = sp.Popen(command, stdin=sp.PIPE) + + if self.total_frames > 0 and not self.quiet: + self.progress_display = ProgressDisplay( + range(self.total_frames), + # bar_format="{l_bar}{bar}|{n_fmt}/{total_fmt}", + leave=False, + ascii=True if platform.system() == "Windows" else None, + dynamic_ncols=True, + ) + self.set_progress_display_description() + + def has_progress_display(self): + return self.progress_display is not None + + def set_progress_display_description( + self, file: str = "", sub_desc: str = "" + ) -> None: + if self.progress_display is None: + return + + desc_len = self.progress_description_len + if not file: + file = os.path.split(self.get_movie_file_path())[1] + full_desc = f"{file} {sub_desc}" + if len(full_desc) > desc_len: + full_desc = full_desc[: desc_len - 3] + "..." + else: + full_desc += " " * (desc_len - len(full_desc)) + self.progress_display.set_description(full_desc) + + def write_frame(self, frame: Image) -> None: + if self.write_to_movie: + self.writing_process.stdin.write(frame.tobytes("utf-8")) + if self.progress_display is not None: + self.progress_display.update() + + def close_movie_pipe(self) -> None: + self.writing_process.stdin.close() + self.writing_process.wait() + self.writing_process.terminate() + if self.progress_display is not None: + self.progress_display.close() + + if not self.ended_with_interrupt: + shutil.move(self.temp_file_path, self.final_file_path) + else: + self.movie_file_path = self.temp_file_path + + def combine_movie_files(self) -> None: + kwargs = { + "remove_non_integer_files": True, + "extension": self.movie_file_extension, + } + if self.scene.start_at_animation_number is not None: + kwargs["min_index"] = self.scene.start_at_animation_number + if self.scene.end_at_animation_number is not None: + kwargs["max_index"] = self.scene.end_at_animation_number + else: + kwargs["remove_indices_greater_than"] = self.scene.num_plays - 1 + partial_movie_files = get_sorted_integer_files( + self.partial_movie_directory, **kwargs + ) + if len(partial_movie_files) == 0: + log.warning("No animations in this scene") + return + + # Write a file partial_file_list.txt containing all + # partial movie files + file_list = Path(self.partial_movie_directory) / "partial_movie_file_list.txt" + with open(file_list, "w") as fp: + for pf_path in partial_movie_files: + if os.name == "nt": + pf_path = pf_path.replace("\\", "/") + fp.write(f"file '{pf_path}'\n") + + movie_file_path = self.get_movie_file_path() + commands = [ + config.ffmpeg_executable, + "-y", # overwrite output file if it exists + "-f", + "concat", + "-safe", + "0", + "-i", + file_list, + "-loglevel", + "error", + "-c", + "copy", + movie_file_path, + ] + if not self.includes_sound: + commands.insert(-1, "-an") + + combine_process = sp.Popen(commands) + combine_process.wait() + + def add_sound_to_video(self) -> None: + movie_file_path = self.get_movie_file_path() + stem, ext = os.path.splitext(movie_file_path) + sound_file_path = stem + ".wav" + # Makes sure sound file length will match video file + self.add_audio_segment(AudioSegment.silent(0)) + self.audio_segment.export( + sound_file_path, + bitrate="312k", + ) + temp_file_path = stem + "_temp" + ext + commands = [ + config.ffmpeg_executable, + "-i", + movie_file_path, + "-i", + sound_file_path, + "-y", # overwrite output file if it exists + "-c:v", + "copy", + "-c:a", + "aac", + "-b:a", + "320k", + # select video stream from first file + "-map", + "0:v:0", + # select audio stream from second file + "-map", + "1:a:0", + "-loglevel", + "error", + # "-shortest", + temp_file_path, + ] + sp.call(commands) + shutil.move(temp_file_path, movie_file_path) + os.remove(sound_file_path) + + def save_final_image(self, image: Image) -> None: + file_path = self.get_image_file_path() + image.save(file_path) + self.print_file_ready_message(file_path) + + def print_file_ready_message(self, file_path: str) -> None: + if not self.quiet: + log.info(f"File ready at {file_path}") + + def should_open_file(self) -> bool: + return any( + ( + self.show_file_location_upon_completion, + self.open_file_upon_completion, + ) + ) + + def combine_to_section_videos(self) -> None: + """Concatenate partial movie files for each section.""" + + self.finish_last_section() + sections_index: list[dict[str, Any]] = [] + for section in self.sections: + # only if section does want to be saved + if section.video is not None: + logger.info(f"Combining partial files for section '{section.name}'") + self.combine_files( + section.get_clean_partial_movie_files(), + self.sections_output_dir / section.video, + ) + sections_index.append(section.get_dict(self.sections_output_dir)) + with (self.sections_output_dir / f"{self.output_name}.json").open("w") as file: + json.dump(sections_index, file, indent=4) + + def clean_cache(self): + """Will clean the cache by removing the oldest partial_movie_files.""" + cached_partial_movies = [ + (self.partial_movie_directory / file_name) + for file_name in self.partial_movie_directory.iterdir() + if file_name != "partial_movie_file_list.txt" + ] + if len(cached_partial_movies) > config["max_files_cached"]: + number_files_to_delete = ( + len(cached_partial_movies) - config["max_files_cached"] + ) + oldest_files_to_delete = sorted( + cached_partial_movies, + key=lambda path: path.stat().st_atime, + )[:number_files_to_delete] + for file_to_delete in oldest_files_to_delete: + file_to_delete.unlink() + logger.info( + f"The partial movie directory is full (> {config['max_files_cached']} files). Therefore, manim has removed the {number_files_to_delete} oldest file(s)." + " You can change this behaviour by changing max_files_cached in config.", + ) + + def flush_cache_directory(self): + """Delete all the cached partial movie files""" + cached_partial_movies = [ + self.partial_movie_directory / file_name + for file_name in self.partial_movie_directory.iterdir() + if file_name != "partial_movie_file_list.txt" + ] + for f in cached_partial_movies: + f.unlink() + logger.info( + f"Cache flushed. {len(cached_partial_movies)} file(s) deleted in %(par_dir)s.", + {"par_dir": self.partial_movie_directory}, + ) + + def open_file(self) -> None: + if self.quiet: + curr_stdout = sys.stdout + sys.stdout = open(os.devnull, "w") + + current_os = platform.system() + file_paths = [] + + if self.save_last_frame: + file_paths.append(self.get_image_file_path()) + if self.write_to_movie: + file_paths.append(self.get_movie_file_path()) + + for file_path in file_paths: + if current_os == "Windows": + os.startfile(file_path) + else: + commands = [] + if current_os == "Linux": + commands.append("xdg-open") + elif current_os.startswith("CYGWIN"): + commands.append("cygstart") + else: # Assume macOS + commands.append("open") + + if self.show_file_location_upon_completion: + commands.append("-R") + + commands.append(file_path) + + FNULL = open(os.devnull, "w") + sp.call(commands, stdout=FNULL, stderr=sp.STDOUT) + FNULL.close() + + if self.quiet: + sys.stdout.close() + sys.stdout = curr_stdout diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index b28f37e1fa..64343eab4b 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -1,30 +1,20 @@ -import re -from functools import lru_cache -from pathlib import Path -from typing import TYPE_CHECKING +from __future__ import annotations import moderngl as gl import numpy as np -from typing_extensions import override import manim.constants as const +import manim.utils.color.core as c import manim.utils.color.manim_colors as color -from manim._config import config, logger -from manim.camera.camera import OpenGLCameraFrame -from manim.mobject.types.vectorized_mobject import VMobject +from manim import config, logger +from manim.camera.camera import Camera +from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.renderer.buffers.buffer import STD140BufferFormat from manim.renderer.opengl_shader_program import load_shader_program_by_folder from manim.renderer.renderer import ImageType, Renderer, RendererData -from manim.renderer.shader_wrapper import ShaderWrapper -from manim.utils.iterables import listify, resize_array, resize_with_interpolation +from manim.utils.iterables import listify from manim.utils.space_ops import cross2d, earclip_triangulation, z_to_vector -if TYPE_CHECKING: - from manim.mobject.types.vectorized_mobject import VMobject - -import manim.utils.color.core as c -from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject - ubo_camera = STD140BufferFormat( "ubo_camera", ( @@ -51,6 +41,7 @@ ("stroke_width", np.float32, (1,)), ("color", np.float32, (4,)), ] +frame_dtype = [("pos", np.float32, (2,)), ("uv", np.float32, (2,))] class GLRenderData(RendererData): @@ -241,6 +232,9 @@ def __init__( self.stencil_texture = self.ctx.texture( (self.pixel_width, self.pixel_height), components=1, samples=0, dtype="f1" ) + self.render_target_texture = self.ctx.texture( + (self.pixel_width, self.pixel_height), components=4, samples=0, dtype="f1" + ) self.stencil_buffer = self.ctx.renderbuffer( (self.pixel_width, self.pixel_height), components=1, @@ -277,6 +271,11 @@ def __init__( color_attachments=[self.color_buffer] ) + # this is used as destination for copying the rendered target + # and using it as texture on the output_fbo + self.render_target_texture_fbo = self.ctx.framebuffer( + color_attachments=[self.render_target_texture] + ) self.output_fbo = self.ctx.framebuffer( color_attachments=[ self.ctx.renderbuffer( @@ -293,14 +292,18 @@ def __init__( self.vmobject_stroke_program = load_shader_program_by_folder( self.ctx, "quadratic_bezier_stroke" ) + self.render_texture_program = load_shader_program_by_folder( + self.ctx, "render_texture" + ) def use_window(self): self.output_fbo.release() self.output_fbo = self.ctx.detect_framebuffer() - def init_camera(self, camera: OpenGLCameraFrame): + # TODO this should also be done with the update decorators because if the camera doesn't change this is pretty rough + def init_camera(self, camera: Camera): camera_data = { - "frame_shape": (14.2222222221, 8.0), + "frame_shape": (config.frame_width, config.frame_height), "camera_center": camera.get_center(), "camera_rotation": camera.get_inverse_camera_rotation_matrix().T, "focal_distance": camera.get_focal_distance(), @@ -310,7 +313,7 @@ def init_camera(self, camera: OpenGLCameraFrame): } ubo_camera.write(camera_data) - uniforms = dict() + uniforms = {} uniforms["anti_alias_width"] = 0.01977 uniforms["light_source_position"] = (-10, 10, 10) uniforms["pixel_shape"] = (self.pixel_width, self.pixel_height) @@ -356,11 +359,29 @@ def get_fill_shader_data(self, mob: OpenGLVMobject) -> np.ndarray: def pre_render(self, camera): self.init_camera(camera=camera) + self.ctx.clear() self.render_target_fbo.use() self.render_target_fbo.clear(*self.background_color) def post_render(self): - self.ctx.copy_framebuffer(self.output_fbo, self.color_buffer_fbo) + frame_data = np.zeros(6, dtype=frame_dtype) + frame_data["pos"] = np.array( + [[-1, -1], [-1, 1], [1, -1], [1, -1], [-1, 1], [1, 1]] + ) + frame_data["uv"] = np.array([[0, 0], [0, 1], [1, 0], [1, 0], [0, 1], [1, 1]]) + vbo = self.ctx.buffer(frame_data.tobytes()) + format = gl.detect_format(self.render_texture_program, frame_data.dtype.names) + vao = self.ctx.vertex_array( + program=self.render_texture_program, + content=[(vbo, format, *frame_data.dtype.names)], + ) + self.ctx.copy_framebuffer(self.render_target_texture_fbo, self.color_buffer_fbo) + self.render_target_texture.use(0) + self.output_fbo.use() + vao.render(gl.TRIANGLES) + vbo.release() + vao.release() + # self.ctx.copy_framebuffer(self.output_fbo, self.color_buffer_fbo) def render_program(self, prog, data, indices=None): vbo = self.ctx.buffer(data.tobytes()) @@ -379,10 +400,12 @@ def render_program(self, prog, data, indices=None): ) vao.render(gl.TRIANGLES) + # data, data_size = ibo.read(), ibo.size vbo.release() if ibo is not None: ibo.release() vao.release() + # return data, data_size def render_vmobject(self, mob: OpenGLVMobject) -> None: # type: ignore self.stencil_buffer_fbo.use() @@ -422,10 +445,11 @@ def enable_depth(mob): # if(mob.has_fill()): # mob.renderer_data.mesh = ... # Triangulation todo - num_mobs = len(mob.family_members_with_points()) + family = mob.family_members_with_points() + num_mobs = len(family) # Another stroke pass is needed in the beginning to deal with transparency properly - for counter, sub in enumerate(mob.family_members_with_points()): + for counter, sub in enumerate(family): if not isinstance(sub.renderer_data, GLRenderData): return enable_depth(sub) @@ -444,7 +468,7 @@ def enable_depth(mob): np.array(range(len(sub.points))), ) - for counter, sub in enumerate(mob.family_members_with_points()): + for counter, sub in enumerate(family): if not isinstance(sub.renderer_data, GLRenderData): return enable_depth(sub) @@ -463,7 +487,7 @@ def enable_depth(mob): sub.renderer_data.vert_indices, ) - for counter, sub in enumerate(mob.family_members_with_points()): + for counter, sub in enumerate(family): if not isinstance(sub.renderer_data, GLRenderData): return enable_depth(sub) @@ -527,7 +551,7 @@ def read_uniforms(mob: OpenGLVMobject): # def init_frame(self, **config) -> None: -# self.frame = OpenGLCameraFrame(**config) +# self.frame = Camera(**config) # def init_context(self, ctx: moderngl.Context | None = None) -> None: # if ctx is None: diff --git a/manim/renderer/opengl_renderer_window.py b/manim/renderer/opengl_renderer_window.py index a8b762226a..11c47b6b26 100644 --- a/manim/renderer/opengl_renderer_window.py +++ b/manim/renderer/opengl_renderer_window.py @@ -4,7 +4,7 @@ import moderngl_window as mglw import numpy as np -from moderngl_window.context.pyglet.window import Window as PygletWindow +from moderngl_window.context.pyglet.window import Window as FunWindow from moderngl_window.timers.clock import Timer from screeninfo import get_monitors @@ -14,14 +14,14 @@ import manim.scene as m_scene -class Window(PygletWindow): +class Window(FunWindow): fullscreen: bool = False - resizable: bool = True + resizable: bool = False gl_version: tuple[int, int] = (3, 3) vsync: bool = True cursor: bool = True - def __init__(self, scene: m_scene.Scene, size=config.window_size): + def __init__(self, size=config.window_size): # TODO: remove size argument from window init, # move size computation below to config @@ -46,9 +46,8 @@ def __init__(self, scene: m_scene.Scene, size=config.window_size): size = tuple(size) super().__init__(size=size) - self.scene = scene self.pressed_keys = set() - self.title = self.title = f"Manim Community {__version__} - {str(scene)}" + self.title = f"Manim Community {__version__}" self.size = size mglw.activate_context(window=self) @@ -90,70 +89,18 @@ def pixel_coords_to_space_coords( self, px: int, py: int, relative: bool = False ) -> np.ndarray: pw, ph = self.size - fw, fh = self.scene.camera.get_frame_shape() - fc = self.scene.camera.get_frame_center() + # TODO + fw, fh = ( + config.frame_width, + config.frame_height, + ) or self.scene.camera.get_frame_shape() + fc = ( + config.frame_width, + config.frame_height, + ) or self.scene.camera.get_frame_center() if relative: return np.array([px / pw, py / ph, 0]) else: return np.array( [fc[0] + px * fw / pw - fw / 2, fc[1] + py * fh / ph - fh / 2, 0] ) - - def on_mouse_motion(self, x: int, y: int, dx: int, dy: int) -> None: - super().on_mouse_motion(x, y, dx, dy) - point = self.pixel_coords_to_space_coords(x, y) - d_point = self.pixel_coords_to_space_coords(dx, dy, relative=True) - self.scene.on_mouse_motion(point, d_point) - - def on_mouse_drag( - self, x: int, y: int, dx: int, dy: int, buttons: int, modifiers: int - ) -> None: - super().on_mouse_drag(x, y, dx, dy, buttons, modifiers) - point = self.pixel_coords_to_space_coords(x, y) - d_point = self.pixel_coords_to_space_coords(dx, dy, relative=True) - self.scene.on_mouse_drag(point, d_point, buttons, modifiers) - - def on_mouse_press(self, x: int, y: int, button: int, mods: int) -> None: - super().on_mouse_press(x, y, button, mods) - point = self.pixel_coords_to_space_coords(x, y) - self.scene.on_mouse_press(point, button, mods) - - def on_mouse_release(self, x: int, y: int, button: int, mods: int) -> None: - super().on_mouse_release(x, y, button, mods) - point = self.pixel_coords_to_space_coords(x, y) - self.scene.on_mouse_release(point, button, mods) - - def on_mouse_scroll(self, x: int, y: int, x_offset: float, y_offset: float) -> None: - super().on_mouse_scroll(x, y, x_offset, y_offset) - point = self.pixel_coords_to_space_coords(x, y) - offset = self.pixel_coords_to_space_coords(x_offset, y_offset, relative=True) - self.scene.on_mouse_scroll(point, offset) - - def on_key_press(self, symbol: int, modifiers: int) -> None: - self.pressed_keys.add(symbol) # Modifiers? - super().on_key_press(symbol, modifiers) - self.scene.on_key_press(symbol, modifiers) - - def on_key_release(self, symbol: int, modifiers: int) -> None: - self.pressed_keys.difference_update({symbol}) # Modifiers? - super().on_key_release(symbol, modifiers) - self.scene.on_key_release(symbol, modifiers) - - def on_resize(self, width: int, height: int) -> None: - super().on_resize(width, height) - self.scene.on_resize(width, height) - - def on_show(self) -> None: - super().on_show() - self.scene.on_show() - - def on_hide(self) -> None: - super().on_hide() - self.scene.on_hide() - - def on_close(self) -> None: - super().on_close() - self.scene.on_close() - - def is_key_pressed(self, symbol: int) -> bool: - return symbol in self.pressed_keys diff --git a/manim/renderer/render_manager.py b/manim/renderer/render_manager.py new file mode 100644 index 0000000000..233af3585b --- /dev/null +++ b/manim/renderer/render_manager.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +import multiprocessing as mp +import queue # NOTE: Cannot use mp.Queue because of auth keys +from typing import TYPE_CHECKING, Any, Iterable + +import numpy as np + +from manim import config, logger + +from .opengl_file_writer import FileWriter +from .opengl_renderer import OpenGLRenderer + +if TYPE_CHECKING: + from ..camera.camera import Camera + from ..scene.scene import SceneState + +__all__ = ("RenderManager",) + + +class RenderManager: + """ + Manage rendering in parallel + """ + + def __init__(self, scene_name: str, camera: Camera, **kwargs) -> None: + # renderer + self.renderer = OpenGLRenderer(**kwargs) + self.ctx = mp.get_context("spawn") + + # setup + self.processes: queue.Queue[mp.Process] = queue.Queue() + self.manager = mp.Manager() + self.manager_dict = self.manager.dict() + + # file writer + self.camera = camera + self.file_writer = FileWriter(scene_name) # TODO + self.renderer.use_window() + + def begin(self) -> None: + """Set up processes and manager""" + ... + + def get_time_progression(self, run_time: float) -> Iterable[float]: + return np.arange(0, run_time, 1 / self.camera.fps) + + def render_state(self, state: SceneState, parallel: bool = True) -> None: + """Launch a process (optionally in parallel) + to render a frame + """ + if parallel and config.in_parallel: + logger.warning("Not supported yet") + self.render_frame(state) + + # type state: SceneState + def render_frame(self, state: SceneState) -> Any | None: + """Renders a frame based on a state""" + data = self.send_scene_to_renderer(state) + # result = self.file_writer.write(data) + self.manager_dict[state.time] = data + + def send_scene_to_renderer(self, state: SceneState): + """Renders the State""" + result = self.renderer.render(self.camera, state.mobjects) + return result + + def get_frames(self) -> list: + """Get a list of every frame produced by the + manager. + + .. warning:: + + This list is _not guarenteed_ to be sorted until + after calling :meth:`.RenderManager.finish` + """ + return self.manager_dict + + def finish(self) -> None: + for process in self.processes.queue: + process.join() + self.manager_dict = dict(sorted(self.manager_dict.items())) diff --git a/manim/renderer/shaders/render_texture/frag.glsl b/manim/renderer/shaders/render_texture/frag.glsl new file mode 100644 index 0000000000..9d1097bf2b --- /dev/null +++ b/manim/renderer/shaders/render_texture/frag.glsl @@ -0,0 +1,11 @@ +#version 330 + +uniform sampler2D tex; +in vec2 f_uv; + +out vec4 frag_color; + +void main() { + frag_color = texture(tex, f_uv); + frag_color.a = 1.0; +} diff --git a/manim/renderer/shaders/render_texture/vert.glsl b/manim/renderer/shaders/render_texture/vert.glsl new file mode 100644 index 0000000000..89c3184617 --- /dev/null +++ b/manim/renderer/shaders/render_texture/vert.glsl @@ -0,0 +1,11 @@ +#version 330 + +in vec2 pos; +in vec2 uv; + +out vec2 f_uv; + +void main() { + gl_Position = vec4(pos, 0.0, 1.0); + f_uv = uv; +} diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 96d818da43..991b4626de 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -14,32 +14,31 @@ from pyglet.window import key from tqdm import tqdm as ProgressDisplay -from manim._config import logger as log +from manim import config, logger from manim.animation.animation import prepare_animation -from manim.camera.camera import OpenGLCamera as Camera +from manim.camera.camera import Camera from manim.constants import DEFAULT_WAIT_TIME from manim.event_handler import EVENT_DISPATCHER from manim.event_handler.event_type import EventType from manim.mobject.frame import FullScreenRectangle -from manim.mobject.mobject import Group, Mobject, Point, _AnimationBuilder +from manim.mobject.mobject import Group, Point, _AnimationBuilder +from manim.mobject.opengl.opengl_mobject import OpenGLMobject as Mobject from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.scene.scene_file_writer import SceneFileWriter +from manim.renderer.render_manager import RenderManager from manim.utils.color import RED -from manim.utils.family_ops import ( - extract_mobject_family_members, - recursive_mobject_remove, -) +from manim.utils.family_ops import extract_mobject_family_members from manim.utils.iterables import list_difference_update from manim.utils.module_ops import get_module if TYPE_CHECKING: - from typing import Callable, Iterable + from typing import Any, Callable, Iterable from PIL.Image import Image - from manim.animation.animation import Animation + from manim.animation.protocol import AnimationProtocol as Animation + from manim.animation.scene_buffer import SceneBuffer -## TODO: these keybindings should be made configureable +# TODO: these keybindings should be made configureable PAN_3D_KEY = "d" FRAME_SHIFT_KEY = "f" @@ -60,7 +59,6 @@ def __init__( self, window_config: dict = {}, camera_config: dict = {}, - file_writer_config: dict = {}, skip_animations: bool = False, always_update_mobjects: bool = False, start_at_animation_number: int | None = None, @@ -83,27 +81,18 @@ def __init__( self.embed_exception_mode = embed_exception_mode self.embed_error_sound = embed_error_sound - self.camera_config = {**self.default_camera_config, **camera_config} - self.window_config = {**self.default_window_config, **window_config} - self.file_writer_config = { - **self.default_file_writer_config, - **file_writer_config, - } - # Initialize window, if applicable if self.preview: from manim.renderer.opengl_renderer_window import Window - self.window = Window(scene=self, **self.window_config) - self.camera_config["ctx"] = self.window.ctx - self.camera_config["fps"] = 30 # Where's that 30 from? + self.window = Window() else: self.window = None # Core state of the scene - self.camera: Camera = Camera(**self.camera_config) - self.file_writer = SceneFileWriter(self, **self.file_writer_config) - self.mobjects: list[Mobject] = [self.camera.frame] + self.camera: Camera = Camera() + self.camera.save_state() + self.mobjects: list[Mobject] = [] self.id_to_mobject_map: dict[int, Mobject] = {} self.num_plays: int = 0 self.time: float = 0 @@ -111,10 +100,11 @@ def __init__( self.original_skipping_status: bool = self.skip_animations self.undo_stack = [] self.redo_stack = [] + self.manager = RenderManager(self.get_default_scene_name(), camera=self.camera) if self.start_at_animation_number is not None: self.skip_animations = True - if self.file_writer.has_progress_display(): + if self.manager.file_writer.has_progress_display(): self.show_animation_progress = False # Items associated with interaction @@ -131,21 +121,40 @@ def __init__( def __str__(self) -> str: return self.__class__.__name__ + def get_default_scene_name(self) -> str: + name = str(self) + saan = self.start_at_animation_number + eaan = self.end_at_animation_number + if saan is not None: + name += f"_{saan}" + if eaan is not None: + name += f"_{eaan}" + return name + + def process_buffer(self, buffer: SceneBuffer) -> None: + self.remove(*buffer.to_remove) + for to_replace_pairs in buffer.to_replace: + self.replace(*to_replace_pairs) + self.add(*buffer.to_add) + buffer.clear() + def run(self) -> None: + config.scene_name = str(self) self.virtual_animation_start_time: float = 0 self.real_animation_start_time: float = time.time() - self.file_writer.begin() self.setup() try: self.construct() + # wait until all animations rendered in parallel + self.manager.finish() self.interact() except EndScene: pass except KeyboardInterrupt: # Get rid keyboard interrupt symbols print("", end="\r") - self.file_writer.ended_with_interrupt = True + self.manager.file_writer.ended_with_interrupt = True self.tear_down() render = run @@ -165,9 +174,13 @@ def construct(self) -> None: def tear_down(self) -> None: self.stop_skipping() - self.file_writer.finish() + + if config.save_last_frame: + self.update_frame(ignore_skipping=True) + self.manager.file_writer.finish() + if self.window: - self.window.destroy() + self.window.close() self.window = None def interact(self) -> None: @@ -178,14 +191,14 @@ def interact(self) -> None: """ if self.window is None: return - log.info( + logger.info( "\nTips: Using the keys `d`, `f`, or `z` " + "you can interact with the scene. " + "Press `command + q` or `esc` to quit" ) self.skip_animations = False self.refresh_static_mobjects() - while not self.is_window_closing(): + while not self.window.is_closing: self.update_frame(1 / self.camera.fps) def embed( @@ -286,27 +299,20 @@ def custom_exc(shell, etype, evalue, tb, tb_offset=None): raise EndScene() # Only these methods should touch the camera - - def get_image(self) -> Image: - return self.camera.get_image() - - def show(self) -> None: - self.update_frame(ignore_skipping=True) - self.get_image().show() - def update_frame(self, dt: float = 0, ignore_skipping: bool = False) -> None: self.increment_time(dt) self.update_mobjects(dt) if self.skip_animations and not ignore_skipping: return - if self.is_window_closing(): + if self.window.is_closing: raise EndScene() if self.window: self.window.clear() - self.camera.clear() - self.camera.capture(*self.mobjects) + # self.camera.clear() + state = self.get_state() + self.manager.render_state(state) if self.window: self.window.swap_buffers() @@ -315,10 +321,6 @@ def update_frame(self, dt: float = 0, ignore_skipping: bool = False) -> None: if rt < vt: self.update_frame(0) - def emit_frame(self) -> None: - if not self.skip_animations: - self.file_writer.write_frame(self.camera) - # Related to updating def update_mobjects(self, dt: float) -> None: @@ -347,7 +349,7 @@ def has_time_based_updaters(self) -> bool: return any( [ sm.has_time_based_updater() - for mob in self.mobjects() + for mob in self.mobjects for sm in mob.get_family() ] ) @@ -615,7 +617,7 @@ def get_time_progression( times = np.arange(0, run_time, 1 / self.camera.fps) - self.file_writer.set_progress_display_description(sub_desc=desc) + # self.file_writer.set_progress_display_description(sub_desc=desc) if self.show_animation_progress: return ProgressDisplay( @@ -629,7 +631,7 @@ def get_time_progression( return times def get_run_time(self, animations: Iterable[Animation]) -> float: - return np.max([animation.get_run_time() for animation in animations]) + return max([animation.get_run_time() for animation in animations]) def get_animation_time_progression( self, animations: Iterable[Animation] @@ -639,13 +641,13 @@ def get_animation_time_progression( description = f"{self.num_plays} {animations[0]}" if len(animations) > 1: description += ", etc." - time_progression = self.get_time_progression(run_time, desc=description) + time_progression = self.manager.get_time_progression(run_time) return time_progression def get_wait_time_progression( self, duration: float, stop_condition: Callable[[], bool] | None = None ) -> list[float] | np.ndarray | ProgressDisplay: - kw = {"desc": f"{self.num_plays} Waiting"} + kw: dict[str, Any] = {"desc": f"{self.num_plays} Waiting"} if stop_condition is not None: kw["n_iterations"] = -1 # So it doesn't show % progress kw["override_skip_animations"] = True @@ -657,38 +659,35 @@ def pre_play(self): # Doesn't exist in Main self.update_skipping_status() - if not self.skip_animations: - self.file_writer.begin_animation() + # if not self.skip_animations: + # self.file_writer.begin_animation() if self.window: self.real_animation_start_time = time.time() self.virtual_animation_start_time = self.time self.refresh_static_mobjects() + self.manager.begin() def post_play(self): - if not self.skip_animations: - self.file_writer.end_animation() + # if not self.skip_animations: + # self.manager.file_writer.end_animation() if self.skip_animations and self.window is not None: # Show some quick frames along the way self.update_frame(dt=0, ignore_skipping=True) self.num_plays += 1 + self.manager.finish() def refresh_static_mobjects(self) -> None: - self.camera.refresh_static_mobjects() + # self.camera.refresh_static_mobjects() + ... def begin_animations(self, animations: Iterable[Animation]) -> None: for animation in animations: animation.begin() - # Anything animated that's not already in the - # scene gets added to the scene. Note, for - # animated mobjects that are in the family of - # those on screen, this can result in a restructuring - # of the scene.mobjects list, which is usually desired. - if animation.mobject not in self.mobjects: - self.add(animation.mobject) + self.process_buffer(animation.buffer) def progress_through_animations(self, animations: Iterable[Animation]) -> None: last_t = 0 @@ -697,15 +696,19 @@ def progress_through_animations(self, animations: Iterable[Animation]) -> None: last_t = t for animation in animations: animation.update_mobjects(dt) - alpha = t / animation.run_time + alpha = t / animation.get_run_time() animation.interpolate(alpha) + if animation.apply_buffer: + self.process_buffer(animation.buffer) + animation.apply_buffer = False self.update_frame(dt) self.emit_frame() def finish_animations(self, animations: Iterable[Animation]) -> None: for animation in animations: animation.finish() - animation.clean_up_from_scene(self) + self.process_buffer(animation.buffer) + if self.skip_animations: self.update_mobjects(self.get_run_time(animations)) else: @@ -719,9 +722,9 @@ def play( lag_ratio: float | None = None, ) -> None: if len(proto_animations) == 0: - log.warning("Called Scene.play with no animations") + logger.warning("Called Scene.play with no animations") return - animations = list(map(prepare_animation, proto_animations)) + animations = [prepare_animation(x) for x in proto_animations] for anim in animations: anim.update_rate_info(run_time, rate_func, lag_ratio) self.pre_play() @@ -745,7 +748,7 @@ def wait( and not ignore_presenter_mode ): if note: - log.info(note) + logger.info(note) self.hold_loop() else: time_progression = self.get_wait_time_progression(duration, stop_condition) @@ -778,6 +781,9 @@ def revert_to_original_skipping_status(self): self.skip_animations = self.original_skipping_status return self + def emit_frame(self) -> None: + pass + def add_sound( self, sound_file: str, @@ -826,6 +832,7 @@ def redo(self): def save_mobject_to_file( self, mobject: Mobject, file_path: str | None = None ) -> None: + return if file_path is None: file_path = self.file_writer.get_saved_mobject_path(mobject) if file_path is None: @@ -840,9 +847,6 @@ def load_mobject(self, file_name): path = os.path.join(directory, file_name) return Mobject.load(path) - def is_window_closing(self): - return self.window and (self.window.is_closing or self.quit_interaction) - # Event handling def on_mouse_motion(self, point: np.ndarray, d_point: np.ndarray) -> None: @@ -855,6 +859,8 @@ def on_mouse_motion(self, point: np.ndarray, d_point: np.ndarray) -> None: if propagate_event is not None and propagate_event is False: return + # TODO + return frame = self.camera.frame # Handle perspective changes if self.window.is_key_pressed(ord(PAN_3D_KEY)): @@ -932,7 +938,7 @@ def on_key_press(self, symbol: int, modifiers: int) -> None: try: char = chr(symbol) except OverflowError: - log.warning("The value of the pressed key is too large.") + logger.warning("The value of the pressed key is too large.") return event_data = {"symbol": symbol, "modifiers": modifiers} @@ -948,15 +954,16 @@ def on_key_press(self, symbol: int, modifiers: int) -> None: self.undo() elif char == "z" and modifiers == key.MOD_COMMAND | key.MOD_SHIFT: self.redo() - # command + q - elif char == QUIT_KEY and modifiers == key.MOD_COMMAND: + # command + q or esc + elif (char == QUIT_KEY and modifiers == key.MOD_COMMAND) or char == key.ESCAPE: self.quit_interaction = True # Space or right arrow elif char == " " or symbol == key.RIGHT: self.hold_on_wait = False def on_resize(self, width: int, height: int) -> None: - self.camera.reset_pixel_shape(width, height) + # self.camera.reset_pixel_shape(width, height) + pass def on_show(self) -> None: pass @@ -969,9 +976,10 @@ def on_close(self) -> None: class SceneState: - def __init__(self, scene: Scene, ignore: list[Mobject] | None = None): + def __init__(self, scene: Scene, ignore: list[Mobject] | None = None) -> None: self.time = scene.time self.num_plays = scene.num_plays + self.camera = scene.camera.copy() self.mobjects_to_copies = OrderedDict.fromkeys(scene.mobjects) if ignore: for mob in ignore: @@ -986,8 +994,12 @@ def __init__(self, scene: Scene, ignore: list[Mobject] | None = None): else: self.mobjects_to_copies[mob] = mob.copy() - def __eq__(self, state: SceneState): - return all( + @property + def mobjects(self) -> list[Mobject]: + return self.mobjects_to_copies + + def __eq__(self, state: Any) -> bool: + return isinstance(state, SceneState) and all( ( self.time == state.time, self.num_plays == state.num_plays, diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 93185867b2..877d957700 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -274,9 +274,7 @@ def open_movie_pipe(self, file_path: str) -> None: "-vcodec", "prores_ks", ] - elif self.movie_file_extension == ".gif": - command += [] - else: + elif self.movie_file_extension != ".gif": command += [ "-vcodec", "libx264", diff --git a/manim/utils/commands.py b/manim/utils/commands.py index 2ec9a776dd..50a817b5cb 100644 --- a/manim/utils/commands.py +++ b/manim/utils/commands.py @@ -4,7 +4,7 @@ import os from pathlib import Path from subprocess import run -from typing import Generator +from typing import Any, Generator __all__ = [ "capture", @@ -19,7 +19,7 @@ def capture(command, cwd=None, command_input=None): return out, err, p.returncode -def get_video_metadata(path_to_video: str | os.PathLike) -> dict[str]: +def get_video_metadata(path_to_video: str | os.PathLike) -> dict[str, Any]: command = [ "ffprobe", "-v", diff --git a/manim/utils/hashing.py b/manim/utils/hashing.py index 27b182980f..f8a259b06c 100644 --- a/manim/utils/hashing.py +++ b/manim/utils/hashing.py @@ -15,7 +15,7 @@ import numpy as np from manim.animation.animation import Animation -from manim.camera.cairo_camera import CairoCamera as Camera +from manim.camera.camera import Camera from manim.mobject.mobject import Mobject from .. import config, logger From 69ddb0e8d5991aa0e54e2fedd539ad79664a1766 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:00:39 -0400 Subject: [PATCH 062/106] Rewrite Animation Loop (#3785) * Initial restructuring * Revamp exceptions * Got render loop working * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Implement self.wait * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add note --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Tristan Schulz --- example_scenes/new_test_new.py | 12 - example_scenes/test_new_rendering.py | 2 +- manim/__init__.py | 1 + manim/cli/render/render_options.py | 2 +- manim/renderer/cairo_renderer.py | 1 - manim/renderer/opengl_renderer.py | 12 +- manim/renderer/opengl_renderer_window.py | 3 - manim/renderer/opengl_shader_program.py | 11 +- manim/renderer/render_manager.py | 265 ++++++++++++++++---- manim/renderer/renderer.py | 69 ++++-- manim/scene/scene.py | 295 +++++++---------------- poetry.lock | 286 +++------------------- 12 files changed, 400 insertions(+), 559 deletions(-) diff --git a/example_scenes/new_test_new.py b/example_scenes/new_test_new.py index 63589cbe5c..ed2f425226 100644 --- a/example_scenes/new_test_new.py +++ b/example_scenes/new_test_new.py @@ -22,18 +22,6 @@ from manim.mobject.text.text_mobject import Text from manim.renderer.opengl_renderer import OpenGLRenderer - -def progress_through_animations(animations): - dt = t - last_t - last_t = t - for animation in animations: - animation.update_mobjects(dt) - alpha = t / animation.run_time - animation.interpolate(alpha) - self.update_frame(dt) - self.emit_frame() - - if __name__ == "__main__": with tempconfig({"renderer": "opengl"}): win = Window( diff --git a/example_scenes/test_new_rendering.py b/example_scenes/test_new_rendering.py index 90b42db035..68485607ac 100644 --- a/example_scenes/test_new_rendering.py +++ b/example_scenes/test_new_rendering.py @@ -10,4 +10,4 @@ def construct(self) -> None: with tempconfig({"renderer": "opengl", "preview": True, "parallel": False}): - Test().render() + Manager(Test).render() diff --git a/manim/__init__.py b/manim/__init__.py index 32b831089b..32d663d4b8 100644 --- a/manim/__init__.py +++ b/manim/__init__.py @@ -72,6 +72,7 @@ from .mobject.types.vectorized_mobject import * from .mobject.value_tracker import * from .mobject.vector_field import * +from .renderer.render_manager import * from .scene.scene import * from .scene.scene_file_writer import * from .scene.section import * diff --git a/manim/cli/render/render_options.py b/manim/cli/render/render_options.py index 738f5c310f..5abc5b323b 100644 --- a/manim/cli/render/render_options.py +++ b/manim/cli/render/render_options.py @@ -100,7 +100,7 @@ def validate_resolution(ctx, param, value): case_sensitive=False, ), help="Select a renderer for your Scene.", - default="cairo", + default="opengl", ), option( "-g", diff --git a/manim/renderer/cairo_renderer.py b/manim/renderer/cairo_renderer.py index 9be8f5a59a..add624e641 100644 --- a/manim/renderer/cairo_renderer.py +++ b/manim/renderer/cairo_renderer.py @@ -8,7 +8,6 @@ from manim.utils.hashing import get_hash_from_play_call from .. import config, logger -from ..camera.cairo_camera import CairoCamera as Camera from ..mobject.mobject import Mobject from ..scene.scene_file_writer import SceneFileWriter from ..utils.exceptions import EndSceneEarlyException diff --git a/manim/renderer/opengl_renderer.py b/manim/renderer/opengl_renderer.py index 64343eab4b..26899611de 100644 --- a/manim/renderer/opengl_renderer.py +++ b/manim/renderer/opengl_renderer.py @@ -11,7 +11,7 @@ from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.renderer.buffers.buffer import STD140BufferFormat from manim.renderer.opengl_shader_program import load_shader_program_by_folder -from manim.renderer.renderer import ImageType, Renderer, RendererData +from manim.renderer.renderer import ImageType, Renderer, RendererData, RendererProtocol from manim.utils.iterables import listify from manim.utils.space_ops import cross2d, earclip_triangulation, z_to_vector @@ -203,14 +203,14 @@ def bind_to_uniform_block(uniform_buffer_object: gl.Buffer, idx: int = 0): uniform_buffer_object.bind_to_uniform_block(idx) -class OpenGLRenderer(Renderer): +class OpenGLRenderer(Renderer, RendererProtocol): pixel_array_dtype = np.uint8 def __init__( self, pixel_width: int = config.pixel_width, pixel_height: int = config.pixel_height, - samples=4, + samples: int = 4, background_color: c.ManimColor = color.BLACK, background_opacity: float = 1.0, background_image: str | None = None, @@ -407,6 +407,12 @@ def render_program(self, prog, data, indices=None): vao.release() # return data, data_size + def render_image(self, mob): + raise NotImplementedError # TODO + + def render_previous(self, camera: Camera) -> None: + raise NotImplementedError + def render_vmobject(self, mob: OpenGLVMobject) -> None: # type: ignore self.stencil_buffer_fbo.use() self.stencil_buffer_fbo.clear() diff --git a/manim/renderer/opengl_renderer_window.py b/manim/renderer/opengl_renderer_window.py index 11c47b6b26..349ef8b767 100644 --- a/manim/renderer/opengl_renderer_window.py +++ b/manim/renderer/opengl_renderer_window.py @@ -10,9 +10,6 @@ from .. import __version__, config -if TYPE_CHECKING: - import manim.scene as m_scene - class Window(FunWindow): fullscreen: bool = False diff --git a/manim/renderer/opengl_shader_program.py b/manim/renderer/opengl_shader_program.py index d48311d44e..d030f54b61 100644 --- a/manim/renderer/opengl_shader_program.py +++ b/manim/renderer/opengl_shader_program.py @@ -85,9 +85,8 @@ def load_shader_program_by_folder(ctx: gl.Context, folder_name: str): raise RuntimeError("Loading Shader Program Error") if geometry_code is None: return ctx.program(vertex_shader=vertex_code, fragment_shader=fragment_code) - elif geometry_code is not None: - return ctx.program( - vertex_shader=vertex_code, - geometry_shader=geometry_code, - fragment_shader=fragment_code, - ) + return ctx.program( + vertex_shader=vertex_code, + geometry_shader=geometry_code, + fragment_shader=fragment_code, + ) diff --git a/manim/renderer/render_manager.py b/manim/renderer/render_manager.py index 233af3585b..31e477b573 100644 --- a/manim/renderer/render_manager.py +++ b/manim/renderer/render_manager.py @@ -1,82 +1,247 @@ from __future__ import annotations -import multiprocessing as mp -import queue # NOTE: Cannot use mp.Queue because of auth keys -from typing import TYPE_CHECKING, Any, Iterable +import time +from typing import TYPE_CHECKING, Any, Callable, Iterable import numpy as np from manim import config, logger +from manim.constants import RendererType +from manim.renderer.cairo_renderer import CairoRenderer +from manim.utils.exceptions import EndSceneEarlyException +from ..scene.scene import Scene, SceneState from .opengl_file_writer import FileWriter from .opengl_renderer import OpenGLRenderer +from .opengl_renderer_window import Window if TYPE_CHECKING: + from manim.animation.protocol import AnimationProtocol + from ..camera.camera import Camera - from ..scene.scene import SceneState + from .renderer import RendererProtocol -__all__ = ("RenderManager",) +__all__ = ("Manager",) -class RenderManager: +class Manager: """ - Manage rendering in parallel + The Brain of Manim + + .. note:: + + The only method of this class officially guaranteed to be + stable is :meth:`~.Manager.render`. Any other methods documented + are purely for development + + Usage + ----- + + .. code-block:: python + + class Manimation(Scene): + def construct(self): + self.play(FadeIn(Circle())) + + + Manager(Manimation).render() """ - def __init__(self, scene_name: str, camera: Camera, **kwargs) -> None: - # renderer - self.renderer = OpenGLRenderer(**kwargs) - self.ctx = mp.get_context("spawn") + def __init__(self, scene_cls: type[Scene]) -> None: + # scene + self.scene: Scene = scene_cls(self) - # setup - self.processes: queue.Queue[mp.Process] = queue.Queue() - self.manager = mp.Manager() - self.manager_dict = self.manager.dict() + if not isinstance(self.scene, Scene): + raise ValueError(f"{self.scene!r} is not an instance of Scene") - # file writer - self.camera = camera - self.file_writer = FileWriter(scene_name) # TODO + self.time = 0 + + # Initialize window, if applicable + if config.preview: + self.window = Window() + else: + self.window = None + + # this must be done AFTER instantiating a window + self.renderer = self.create_renderer() self.renderer.use_window() - def begin(self) -> None: + # file writer + self.file_writer = FileWriter(self.scene.get_default_scene_name()) # TODO + + @property + def camera(self) -> Camera: + return self.scene.camera + + def create_renderer(self) -> RendererProtocol: + match config.renderer: + case RendererType.OPENGL: + return OpenGLRenderer() + + case RendererType.CAIRO: + return CairoRenderer() + + case rendertype: + raise ValueError(f"Invalid Config Renderer type {rendertype}") + + def _setup(self) -> None: """Set up processes and manager""" - ... + if self.file_writer.has_progress_display(): + self.scene.show_animation_progress = False - def get_time_progression(self, run_time: float) -> Iterable[float]: - return np.arange(0, run_time, 1 / self.camera.fps) + self.scene.setup() - def render_state(self, state: SceneState, parallel: bool = True) -> None: - """Launch a process (optionally in parallel) - to render a frame + self.virtual_animation_start_time = 0 + self.real_animation_start_time = time.perf_counter() + + def render(self) -> None: """ - if parallel and config.in_parallel: - logger.warning("Not supported yet") - self.render_frame(state) - - # type state: SceneState - def render_frame(self, state: SceneState) -> Any | None: - """Renders a frame based on a state""" - data = self.send_scene_to_renderer(state) - # result = self.file_writer.write(data) - self.manager_dict[state.time] = data + Entry point to running a Manim class - def send_scene_to_renderer(self, state: SceneState): - """Renders the State""" - result = self.renderer.render(self.camera, state.mobjects) - return result + Example + ------- + + .. code-block:: python - def get_frames(self) -> list: - """Get a list of every frame produced by the - manager. + class MyScene(Scene): + def construct(self): + self.play(Create(Circle())) - .. warning:: - This list is _not guarenteed_ to be sorted until - after calling :meth:`.RenderManager.finish` + with tempconfig({"preview": True}): + Manager(MyScene).render() + """ + self._render_first_pass() + self._render_second_pass() + self._interact() + + def _render_first_pass(self) -> None: + """ + Temporarily use the normal single pass + rendering system + """ + self._setup() + + try: + self.scene.construct() + self._interact() + except EndSceneEarlyException: + pass + except KeyboardInterrupt: + # Get rid keyboard interrupt symbols + print("", end="\r") + self.file_writer.ended_with_interrupt = True + self._tear_down() + + def _render_second_pass(self) -> None: """ - return self.manager_dict + In the future, this method could be used + for two pass rendering + """ + ... + + def _tear_down(self): + self.scene.tear_down() + + if config.save_last_frame: + self._update_frame(0) + + self.file_writer.finish() + + if self.window is not None: + self.window.close() + self.window = None + + def _interact(self) -> None: + if self.window is None: + return + logger.info( + "\nTips: Using the keys `d`, `f`, or `z` " + + "you can interact with the scene. " + + "Press `command + q` or `esc` to quit" + ) + self.scene.skip_animations = False + self.scene.refresh_static_mobjects() + while not self.window.is_closing: + # TODO: Replace with actual dt instead + # of hardcoded dt + dt = 1 / self.camera.fps + self._update_frame(dt) + + def _update_frame(self, dt: float): + self.time += dt + self.scene._update_mobjects(dt) + + if self.window is not None: + self.window.clear() + + state = self.scene.get_state() + self._render_frame(state) + + if self.window is not None: + self.window.swap_buffers() + vt = self.time - self.virtual_animation_start_time + rt = time.perf_counter() - self.real_animation_start_time + if rt < vt: + self._update_frame(0) + + def _play(self, *animations: AnimationProtocol): + self.scene.pre_play() + + if self.window is not None: + self.real_animation_start_time = time.perf_counter() + self.virtual_animation_start_time = self.time + + self.scene.begin_animations(animations) + self._progress_through_animations(animations) + self.scene.finish_animations(animations) + + if self.scene.skip_animations and self.window is not None: + self._update_frame(dt=0) + + self.scene.post_play() + + def _wait( + self, duration: float, *, stop_condition: Callable[[], bool] | None = None + ): + self.scene.pre_play() + + update_mobjects = ( + self.scene.should_update_mobjects() + ) # TODO: this method needs to be implemented + condition = stop_condition or (lambda: False) + + last_t = 0 + for t in self._calc_time_progression(duration): + if update_mobjects: + dt, last_t = t - last_t, t + self._update_frame(dt) + if condition(): + break + else: + self.renderer.render_previous(self.camera) + self.scene.post_play() + + def _progress_through_animations(self, animations: Iterable[AnimationProtocol]): + last_t = 0 + run_time = self._calc_runtime(animations) + for t in self._calc_time_progression(run_time): + dt, last_t = t - last_t, t + self.scene._update_animations(animations, t, dt) + self._update_frame(dt) + + def _calc_time_progression(self, run_time: float) -> Iterable[float]: + return np.arange(0, run_time, 1 / self.camera.fps) + + def _calc_runtime(self, animations: Iterable[AnimationProtocol]): + return max(animation.get_run_time() for animation in animations) - def finish(self) -> None: - for process in self.processes.queue: - process.join() - self.manager_dict = dict(sorted(self.manager_dict.items())) + def _render_frame(self, state: SceneState) -> Any | None: + """Renders a frame based on a state, and writes it to a file""" + data = self._send_scene_to_renderer(state) + # result = self.file_writer.write(data) + + def _send_scene_to_renderer(self, state: SceneState): + """Renders the State""" + result = self.renderer.render(self.scene.camera, state.mobjects) + return result diff --git a/manim/renderer/renderer.py b/manim/renderer/renderer.py index 21842f9091..82c4e5a28e 100644 --- a/manim/renderer/renderer.py +++ b/manim/renderer/renderer.py @@ -1,14 +1,22 @@ -from abc import ABC, abstractclassmethod, abstractstaticmethod -from typing import TYPE_CHECKING +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Protocol import numpy as np from typing_extensions import TypeAlias -from manim import config from manim._config import logger +from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.mobject.types.image_mobject import ImageMobject -from manim.mobject.types.vectorized_mobject import VMobject + +if TYPE_CHECKING: + from collections.abc import Callable, Iterable, Sequence + + import moderngl as gl + + from manim.camera.camera import Camera ImageType: TypeAlias = np.ndarray @@ -20,15 +28,15 @@ class RendererData: class Renderer(ABC): def __init__(self): self.capabilities = [ - (OpenGLVMobject, self.render_vmobject), - (ImageMobject, self.render_image), + (OpenGLVMobject, self.render_vmobject), # type: ignore + (ImageMobject, self.render_image), # type: ignore ] - def render(self, camera, renderables: list[OpenGLVMobject]) -> None: # Image + def render(self, camera, renderables: Iterable[OpenGLMobject]) -> None: # Image self.pre_render(camera) for mob in renderables: - for type, render_func in self.capabilities: - if isinstance(mob, type): + for type_, render_func in self.capabilities: + if isinstance(mob, type_): render_func(mob) break else: @@ -37,27 +45,54 @@ def render(self, camera, renderables: list[OpenGLVMobject]) -> None: # Image ) self.post_render() - def pre_render(self, camera): + @abstractmethod + def pre_render(self, camera: Camera): raise NotImplementedError + @abstractmethod def post_render(self): raise NotImplementedError - def use_window(self): + @abstractmethod + def render_vmobject(self, mob: OpenGLVMobject): raise NotImplementedError - @abstractclassmethod - def render_vmobject(self, mob: OpenGLVMobject) -> None: + @abstractmethod + def render_image(self, mob: ImageMobject): raise NotImplementedError + +class RendererProtocol(Protocol): + capabilities: Sequence[ + tuple[type[OpenGLMobject], Callable[[type[OpenGLMobject]], object]] + ] + + def render(self, camera: Camera, renderables: Iterable[OpenGLMobject]) -> None: + ... + + def render_previous(self, camera: Camera) -> None: + ... + + def pre_render(self, camera) -> object: + ... + + def post_render(self) -> object: + ... + + def use_window(self): + ... + + def render_vmobject(self, mob: OpenGLVMobject) -> object: + ... + def render_mesh(self, mob) -> None: - raise NotImplementedError + ... - def render_image(self, mob) -> None: - raise NotImplementedError + def render_image(self, mob: ImageMobject) -> None: + ... def get_pixels(self) -> ImageType: - raise NotImplementedError + ... # NOTE: The user should expect depth between renderers not to be handled discussed at 03.09.2023 Between jsonv and MrDiver diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 991b4626de..01c64823aa 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -6,7 +6,7 @@ import random import time from collections import OrderedDict -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Sequence import numpy as np from IPython.terminal import pt_inputhooks @@ -24,8 +24,9 @@ from manim.mobject.mobject import Group, Point, _AnimationBuilder from manim.mobject.opengl.opengl_mobject import OpenGLMobject as Mobject from manim.mobject.types.vectorized_mobject import VGroup, VMobject -from manim.renderer.render_manager import RenderManager from manim.utils.color import RED +from manim.utils.deprecation import deprecated +from manim.utils.exceptions import EndSceneEarlyException from manim.utils.family_ops import extract_mobject_family_members from manim.utils.iterables import list_difference_update from manim.utils.module_ops import get_module @@ -33,12 +34,11 @@ if TYPE_CHECKING: from typing import Any, Callable, Iterable - from PIL.Image import Image - from manim.animation.protocol import AnimationProtocol as Animation from manim.animation.scene_buffer import SceneBuffer + from manim.renderer.render_manager import Manager -# TODO: these keybindings should be made configureable +# TODO: these keybindings should be made configurable PAN_3D_KEY = "d" FRAME_SHIFT_KEY = "f" @@ -57,6 +57,7 @@ class Scene: def __init__( self, + manager: Manager | None = None, window_config: dict = {}, camera_config: dict = {}, skip_animations: bool = False, @@ -81,17 +82,10 @@ def __init__( self.embed_exception_mode = embed_exception_mode self.embed_error_sound = embed_error_sound - # Initialize window, if applicable - if self.preview: - from manim.renderer.opengl_renderer_window import Window - - self.window = Window() - else: - self.window = None - # Core state of the scene self.camera: Camera = Camera() self.camera.save_state() + self.manager = manager self.mobjects: list[Mobject] = [] self.id_to_mobject_map: dict[int, Mobject] = {} self.num_plays: int = 0 @@ -100,12 +94,9 @@ def __init__( self.original_skipping_status: bool = self.skip_animations self.undo_stack = [] self.redo_stack = [] - self.manager = RenderManager(self.get_default_scene_name(), camera=self.camera) if self.start_at_animation_number is not None: self.skip_animations = True - if self.manager.file_writer.has_progress_display(): - self.show_animation_progress = False # Items associated with interaction self.mouse_point = Point() @@ -138,68 +129,31 @@ def process_buffer(self, buffer: SceneBuffer) -> None: self.add(*buffer.to_add) buffer.clear() - def run(self) -> None: - config.scene_name = str(self) - self.virtual_animation_start_time: float = 0 - self.real_animation_start_time: float = time.time() + @deprecated(message="Use Manager(Scene).render()") + @classmethod + def run(cls) -> None: + from ..renderer.render_manager import Manager - self.setup() - try: - self.construct() - # wait until all animations rendered in parallel - self.manager.finish() - self.interact() - except EndScene: - pass - except KeyboardInterrupt: - # Get rid keyboard interrupt symbols - print("", end="\r") - self.manager.file_writer.ended_with_interrupt = True - self.tear_down() + return Manager(cls).render() render = run def setup(self) -> None: """ - This is meant to be implement by any scenes which - are comonly subclassed, and have some common setup + This method is used to set up scenes to do any setup involved before the construct method is called. """ - pass def construct(self) -> None: - # Where all the animation happens - # To be implemented in subclasses - pass + """ + The entrypoint to animations in Manim. + Should be overridden in the subclass to produce animations + """ def tear_down(self) -> None: - self.stop_skipping() - - if config.save_last_frame: - self.update_frame(ignore_skipping=True) - self.manager.file_writer.finish() - - if self.window: - self.window.close() - self.window = None - - def interact(self) -> None: """ - If there is a window, enter a loop - which updates the frame while under - the hood calling the pyglet event loop + This method is used to clean up scenes """ - if self.window is None: - return - logger.info( - "\nTips: Using the keys `d`, `f`, or `z` " - + "you can interact with the scene. " - + "Press `command + q` or `esc` to quit" - ) - self.skip_animations = False - self.refresh_static_mobjects() - while not self.window.is_closing: - self.update_frame(1 / self.camera.fps) def embed( self, @@ -288,7 +242,7 @@ def custom_exc(shell, etype, evalue, tb, tb_offset=None): # Launch shell shell( local_ns=local_ns, - # Pretend like we're embeding in the caller function, not here + # Pretend like we're embedding in the caller function, not here stack_depth=2, # Specify that the present module is the caller's, not here module=get_module(caller_frame.f_globals["__file__"]), @@ -296,54 +250,39 @@ def custom_exc(shell, etype, evalue, tb, tb_offset=None): # End scene when exiting an embed if close_scene_on_exit: - raise EndScene() + raise EndSceneEarlyException() # Only these methods should touch the camera - def update_frame(self, dt: float = 0, ignore_skipping: bool = False) -> None: - self.increment_time(dt) - self.update_mobjects(dt) - if self.skip_animations and not ignore_skipping: - return - - if self.window.is_closing: - raise EndScene() - - if self.window: - self.window.clear() - # self.camera.clear() - state = self.get_state() - self.manager.render_state(state) - - if self.window: - self.window.swap_buffers() - vt = self.time - self.virtual_animation_start_time - rt = time.time() - self.real_animation_start_time - if rt < vt: - self.update_frame(0) - # Related to updating - def update_mobjects(self, dt: float) -> None: + def _update_mobjects(self, dt: float) -> None: for mobject in self.mobjects: mobject.update(dt) def should_update_mobjects(self) -> bool: """ - This is only called when a single Wait animation is played. + This is called to check if a wait frame should be frozen + + Returns + ------- + bool: does it have to be rerendered or is it static """ - wait_animation = self.animations[0] - if wait_animation.is_static_wait is None: - should_update = ( - self.always_update_mobjects - or self.updaters - or wait_animation.stop_condition is not None - or any( - mob.has_time_based_updater() - for mob in self.get_mobject_family_members() - ) - ) - wait_animation.is_static_wait = not should_update - return not wait_animation.is_static_wait + # always rerender by returning True + # TODO: Apply caching here + return True + # wait_animation = self.animations[0] + # if wait_animation.is_static_wait is None: + # should_update = ( + # self.always_update_mobjects + # or self.updaters + # or wait_animation.stop_condition is not None + # or any( + # mob.has_time_based_updater() + # for mob in self.get_mobject_family_members() + # ) + # ) + # wait_animation.is_static_wait = not should_update + # return not wait_animation.is_static_wait def has_time_based_updaters(self) -> bool: return any( @@ -597,7 +536,7 @@ def update_skipping_status(self) -> None: if (self.end_at_animation_number is not None) and ( self.num_plays >= self.end_at_animation_number ): - raise EndScene() + raise EndSceneEarlyException() def stop_skipping(self) -> None: self.virtual_animation_start_time = self.time @@ -605,45 +544,6 @@ def stop_skipping(self) -> None: # Methods associated with running animations - def get_time_progression( - self, - run_time: float, - n_iterations: int | None = None, - desc: str = "", - override_skip_animations: bool = False, - ) -> list[float] | np.ndarray | ProgressDisplay: - if self.skip_animations and not override_skip_animations: - return [run_time] - - times = np.arange(0, run_time, 1 / self.camera.fps) - - # self.file_writer.set_progress_display_description(sub_desc=desc) - - if self.show_animation_progress: - return ProgressDisplay( - times, - total=n_iterations, - leave=self.leave_progress_bars, - ascii=True if platform.system() == "Windows" else None, - desc=desc, - ) - else: - return times - - def get_run_time(self, animations: Iterable[Animation]) -> float: - return max([animation.get_run_time() for animation in animations]) - - def get_animation_time_progression( - self, animations: Iterable[Animation] - ) -> list[float] | np.ndarray | ProgressDisplay: - animations = list(animations) - run_time = self.get_run_time(animations) - description = f"{self.num_plays} {animations[0]}" - if len(animations) > 1: - description += ", etc." - time_progression = self.manager.get_time_progression(run_time) - return time_progression - def get_wait_time_progression( self, duration: float, stop_condition: Callable[[], bool] | None = None ) -> list[float] | np.ndarray | ProgressDisplay: @@ -662,23 +562,13 @@ def pre_play(self): # Doesn't exist in Main # if not self.skip_animations: # self.file_writer.begin_animation() - if self.window: - self.real_animation_start_time = time.time() - self.virtual_animation_start_time = self.time - self.refresh_static_mobjects() - self.manager.begin() def post_play(self): # if not self.skip_animations: # self.manager.file_writer.end_animation() - if self.skip_animations and self.window is not None: - # Show some quick frames along the way - self.update_frame(dt=0, ignore_skipping=True) - self.num_plays += 1 - self.manager.finish() def refresh_static_mobjects(self) -> None: # self.camera.refresh_static_mobjects() @@ -689,20 +579,14 @@ def begin_animations(self, animations: Iterable[Animation]) -> None: animation.begin() self.process_buffer(animation.buffer) - def progress_through_animations(self, animations: Iterable[Animation]) -> None: - last_t = 0 - for t in self.get_animation_time_progression(animations): - dt = t - last_t - last_t = t - for animation in animations: - animation.update_mobjects(dt) - alpha = t / animation.get_run_time() - animation.interpolate(alpha) - if animation.apply_buffer: - self.process_buffer(animation.buffer) - animation.apply_buffer = False - self.update_frame(dt) - self.emit_frame() + def _update_animations(self, animations: Iterable[Animation], t: float, dt: float): + for animation in animations: + animation.update_mobjects(dt) + alpha = t / animation.get_run_time() + animation.interpolate(alpha) + if animation.apply_buffer: + self.process_buffer(animation.buffer) + animation.apply_buffer = False def finish_animations(self, animations: Iterable[Animation]) -> None: for animation in animations: @@ -710,9 +594,9 @@ def finish_animations(self, animations: Iterable[Animation]) -> None: self.process_buffer(animation.buffer) if self.skip_animations: - self.update_mobjects(self.get_run_time(animations)) + self._update_mobjects(self.manager._calc_runtime(animations)) else: - self.update_mobjects(0) + self._update_mobjects(0) def play( self, @@ -727,46 +611,40 @@ def play( animations = [prepare_animation(x) for x in proto_animations] for anim in animations: anim.update_rate_info(run_time, rate_func, lag_ratio) - self.pre_play() - self.begin_animations(animations) - self.progress_through_animations(animations) - self.finish_animations(animations) - self.post_play() + + # NOTE: Should be changed at some point with the 2 pass rendering system 21.06.2024 + self.manager._play(*animations) def wait( self, duration: float = DEFAULT_WAIT_TIME, - stop_condition: Callable[[], bool] = None, - note: str = None, + stop_condition: Callable[[], bool] | None = None, + note: str | None = None, ignore_presenter_mode: bool = False, ): - self.pre_play() - self.update_mobjects(dt=0) # Any problems with this? - if ( - self.presenter_mode - and not self.skip_animations - and not ignore_presenter_mode - ): - if note: - logger.info(note) - self.hold_loop() - else: - time_progression = self.get_wait_time_progression(duration, stop_condition) - last_t = 0 - for t in time_progression: - dt = t - last_t - last_t = t - self.update_frame(dt) - self.emit_frame() - if stop_condition is not None and stop_condition(): - break - self.refresh_static_mobjects() - self.post_play() - - def hold_loop(self): - while self.hold_on_wait: - self.update_frame(dt=1 / self.camera.fps) - self.hold_on_wait = True + self.manager._wait(duration, stop_condition=stop_condition) + # self.pre_play() + # self.update_mobjects(dt=0) # Any problems with this? + # if ( + # self.presenter_mode + # and not self.skip_animations + # and not ignore_presenter_mode + # ): + # if note: + # logger.info(note) + # self.hold_loop() + # else: + # time_progression = self.get_wait_time_progression(duration, stop_condition) + # last_t = 0 + # for t in time_progression: + # dt = t - last_t + # last_t = t + # self.update_frame(dt) + # self.emit_frame() + # if stop_condition is not None and stop_condition(): + # break + # self.refresh_static_mobjects() + # self.post_play() def wait_until(self, stop_condition: Callable[[], bool], max_time: float = 60): self.wait(max_time, stop_condition=stop_condition) @@ -995,8 +873,8 @@ def __init__(self, scene: Scene, ignore: list[Mobject] | None = None) -> None: self.mobjects_to_copies[mob] = mob.copy() @property - def mobjects(self) -> list[Mobject]: - return self.mobjects_to_copies + def mobjects(self) -> Sequence[Mobject]: + return tuple(self.mobjects_to_copies.keys()) def __eq__(self, state: Any) -> bool: return isinstance(state, SceneState) and all( @@ -1007,6 +885,9 @@ def __eq__(self, state: Any) -> bool: ) ) + def __repr__(self) -> str: + return f"{type(self).__name__} of {len(self.mobjects_to_copies)} Mobjects" + def mobjects_match(self, state: SceneState): return self.mobjects_to_copies == state.mobjects_to_copies @@ -1023,7 +904,3 @@ def restore_scene(self, scene: Scene): scene.mobjects = [ mob.become(mob_copy) for mob, mob_copy in self.mobjects_to_copies.items() ] - - -class EndScene(Exception): - pass diff --git a/poetry.lock b/poetry.lock index e17c7c7619..c0291c7374 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiofiles" version = "22.1.0" description = "File support for asyncio." -category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ @@ -16,7 +15,6 @@ files = [ name = "aiosqlite" version = "0.19.0" description = "asyncio bridge to the standard sqlite3 module" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -32,7 +30,6 @@ docs = ["sphinx (==6.1.3)", "sphinx-mdinclude (==0.5.3)"] name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -44,7 +41,6 @@ files = [ name = "anyio" version = "3.7.1" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -66,7 +62,6 @@ trio = ["trio (<0.22)"] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "main" optional = false python-versions = "*" files = [ @@ -78,7 +73,6 @@ files = [ name = "argon2-cffi" version = "21.3.0" description = "The secure Argon2 password hashing algorithm." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -98,7 +92,6 @@ tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] name = "argon2-cffi-bindings" version = "21.2.0" description = "Low-level CFFI bindings for Argon2" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -136,7 +129,6 @@ tests = ["pytest"] name = "arrow" version = "1.2.3" description = "Better dates & times for Python" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -151,7 +143,6 @@ python-dateutil = ">=2.7.0" name = "astor" version = "0.8.1" description = "Read/rewrite/write Python ASTs" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ @@ -163,7 +154,6 @@ files = [ name = "astroid" version = "2.15.6" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -183,7 +173,6 @@ wrapt = [ name = "asttokens" version = "2.2.1" description = "Annotate AST trees with source code positions" -category = "main" optional = false python-versions = "*" files = [ @@ -201,7 +190,6 @@ test = ["astroid", "pytest"] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -220,7 +208,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "babel" version = "2.12.1" description = "Internationalization utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -235,7 +222,6 @@ pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "main" optional = false python-versions = "*" files = [ @@ -247,7 +233,6 @@ files = [ name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "main" optional = false python-versions = ">=3.6.0" files = [ @@ -266,7 +251,6 @@ lxml = ["lxml"] name = "black" version = "23.7.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -313,7 +297,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "bleach" version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -332,7 +315,6 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -344,7 +326,6 @@ files = [ name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = "*" files = [ @@ -421,7 +402,6 @@ pycparser = "*" name = "cfgv" version = "3.3.1" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.6.1" files = [ @@ -433,7 +413,6 @@ files = [ name = "charset-normalizer" version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -518,7 +497,6 @@ files = [ name = "click" version = "8.1.6" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -533,7 +511,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "click-default-group" version = "1.2.2" description = "Extends click.Group to invoke a command without explicit subcommand name" -category = "main" optional = false python-versions = "*" files = [ @@ -547,7 +524,6 @@ click = "*" name = "cloup" version = "0.13.1" description = "Adds features to Click: option groups, constraints, subcommand sections and help themes." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -563,7 +539,6 @@ typing-extensions = {version = "*", markers = "python_version <= \"3.8\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -575,7 +550,6 @@ files = [ name = "comm" version = "0.1.3" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -595,7 +569,6 @@ typing = ["mypy (>=0.990)"] name = "commonmark" version = "0.9.1" description = "Python parser for the CommonMark Markdown spec" -category = "dev" optional = false python-versions = "*" files = [ @@ -610,7 +583,6 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] name = "contourpy" version = "1.1.0" description = "Python library for calculating contours of 2D quadrilateral grids" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -621,6 +593,7 @@ files = [ {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, @@ -629,6 +602,7 @@ files = [ {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, @@ -637,6 +611,7 @@ files = [ {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, @@ -645,6 +620,7 @@ files = [ {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, @@ -669,7 +645,6 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] name = "coverage" version = "7.2.7" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -745,7 +720,6 @@ toml = ["tomli"] name = "cryptography" version = "41.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -791,7 +765,6 @@ test-randomorder = ["pytest-randomly"] name = "cycler" version = "0.11.0" description = "Composable style cycles" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -803,7 +776,6 @@ files = [ name = "cython" version = "3.0.0" description = "The Cython compiler for writing C extensions in the Python language." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -871,7 +843,6 @@ files = [ name = "data-science-types" version = "0.2.23" description = "Type stubs for Python machine learning libraries" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -886,7 +857,6 @@ dev = ["black", "flake8", "flake8-pyi", "matplotlib", "mypy (==0.770)", "numpy", name = "dearpygui" version = "1.9.1" description = "DearPyGui: A simple Python GUI Toolkit" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -914,7 +884,6 @@ files = [ name = "debugpy" version = "1.6.7" description = "An implementation of the Debug Adapter Protocol for Python" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -942,7 +911,6 @@ files = [ name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -954,7 +922,6 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -966,7 +933,6 @@ files = [ name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -984,7 +950,6 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] name = "dill" version = "0.3.7" description = "serialize all of Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -999,7 +964,6 @@ graph = ["objgraph (>=1.7.2)"] name = "distlib" version = "0.3.7" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ @@ -1011,7 +975,6 @@ files = [ name = "docutils" version = "0.17.1" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1023,7 +986,6 @@ files = [ name = "entrypoints" version = "0.4" description = "Discover and load entry points from installed packages." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -1035,7 +997,6 @@ files = [ name = "exceptiongroup" version = "1.1.2" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1050,7 +1011,6 @@ test = ["pytest (>=6)"] name = "execnet" version = "2.0.2" description = "execnet: rapid multi-Python deployment" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1065,7 +1025,6 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] name = "executing" version = "1.2.0" description = "Get the currently executing AST node of a frame, and other information" -category = "main" optional = false python-versions = "*" files = [ @@ -1080,7 +1039,6 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] name = "fastjsonschema" version = "2.18.0" description = "Fastest Python implementation of JSON schema" -category = "main" optional = true python-versions = "*" files = [ @@ -1095,7 +1053,6 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc name = "filelock" version = "3.12.2" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1111,7 +1068,6 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p name = "flake8" version = "3.9.2" description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -1128,7 +1084,6 @@ pyflakes = ">=2.3.0,<2.4.0" name = "flake8-bugbear" version = "21.11.29" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1147,7 +1102,6 @@ dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit"] name = "flake8-builtins" version = "1.5.3" description = "Check for python builtins being used as variables or parameters." -category = "dev" optional = false python-versions = "*" files = [ @@ -1165,7 +1119,6 @@ test = ["coverage", "coveralls", "mock", "pytest", "pytest-cov"] name = "flake8-comprehensions" version = "3.14.0" description = "A flake8 plugin to help you write better list/set/dict comprehensions." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1180,7 +1133,6 @@ flake8 = ">=3.0,<3.2.0 || >3.2.0" name = "flake8-docstrings" version = "1.7.0" description = "Extension for flake8 which uses pydocstyle to check docstrings" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1196,7 +1148,6 @@ pydocstyle = ">=2.1" name = "flake8-plugin-utils" version = "1.3.3" description = "The package provides base classes and utils for flake8 plugin writing" -category = "dev" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -1208,7 +1159,6 @@ files = [ name = "flake8-pytest-style" version = "1.7.2" description = "A flake8 plugin checking common style issues or inconsistencies with pytest-based tests." -category = "dev" optional = false python-versions = ">=3.7.2,<4.0.0" files = [ @@ -1223,7 +1173,6 @@ flake8-plugin-utils = ">=1.3.2,<2.0.0" name = "flake8-rst-docstrings" version = "0.2.7" description = "Python docstring reStructuredText (RST) validator" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1240,7 +1189,6 @@ restructuredtext-lint = "*" name = "flake8-simplify" version = "0.14.6" description = "flake8 plugin which checks for code that can be simplified" -category = "dev" optional = false python-versions = ">=3.6.1" files = [ @@ -1256,7 +1204,6 @@ flake8 = ">=3.7" name = "fonttools" version = "4.41.1" description = "Tools to manipulate font files" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1314,7 +1261,6 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] name = "fqdn" version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" -category = "main" optional = true python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" files = [ @@ -1326,7 +1272,6 @@ files = [ name = "furo" version = "2022.9.29" description = "A clean customisable Sphinx documentation theme." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1344,7 +1289,6 @@ sphinx-basic-ng = "*" name = "gitdb" version = "4.0.10" description = "Git Object Database" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1359,7 +1303,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.32" description = "GitPython is a Python library used to interact with Git repositories" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1374,7 +1317,6 @@ gitdb = ">=4.0.1,<5" name = "glcontext" version = "2.4.0" description = "Portable OpenGL Context" -category = "main" optional = false python-versions = "*" files = [ @@ -1443,7 +1385,6 @@ files = [ name = "identify" version = "2.5.26" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1458,7 +1399,6 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1470,7 +1410,6 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1482,7 +1421,6 @@ files = [ name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1502,7 +1440,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "importlib-resources" version = "6.0.0" description = "Read resources from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1521,7 +1458,6 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1533,7 +1469,6 @@ files = [ name = "ipykernel" version = "6.25.0" description = "IPython Kernel for Jupyter" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1547,7 +1482,7 @@ comm = ">=0.1.1" debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" @@ -1567,7 +1502,6 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" name = "ipython" version = "8.12.2" description = "IPython: Productive Interactive Computing" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1607,7 +1541,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "ipython-genutils" version = "0.2.0" description = "Vestigial utilities from IPython" -category = "main" optional = true python-versions = "*" files = [ @@ -1619,7 +1552,6 @@ files = [ name = "isoduration" version = "20.11.0" description = "Operations with ISO 8601 durations" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1634,7 +1566,6 @@ arrow = ">=0.15.0" name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -1652,7 +1583,6 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "isosurfaces" version = "0.1.0" description = "Construct isolines/isosurfaces over a 2D/3D scalar field defined by a function (not a uniform grid)" -category = "main" optional = false python-versions = "*" files = [ @@ -1667,7 +1597,6 @@ numpy = "*" name = "jedi" version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1687,7 +1616,6 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1705,7 +1633,6 @@ i18n = ["Babel (>=2.7)"] name = "json5" version = "0.9.14" description = "A Python implementation of the JSON5 data format." -category = "main" optional = true python-versions = "*" files = [ @@ -1720,7 +1647,6 @@ dev = ["hypothesis"] name = "jsonpointer" version = "2.4" description = "Identify specific nodes in a JSON document (RFC 6901)" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ @@ -1732,7 +1658,6 @@ files = [ name = "jsonschema" version = "4.18.4" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1764,7 +1689,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.7.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1780,7 +1704,6 @@ referencing = ">=0.28.0" name = "jupyter-client" version = "7.4.9" description = "Jupyter protocol implementation and client libraries" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1805,7 +1728,6 @@ test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-com name = "jupyter-core" version = "5.3.1" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1826,7 +1748,6 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "jupyter-events" version = "0.7.0" description = "Jupyter Event System library" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1852,7 +1773,6 @@ test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "p name = "jupyter-server" version = "2.7.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1865,7 +1785,7 @@ anyio = ">=3.1.0" argon2-cffi = "*" jinja2 = "*" jupyter-client = ">=7.4.4" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" jupyter-events = ">=0.6.0" jupyter-server-terminals = "*" nbconvert = ">=6.4.4" @@ -1889,7 +1809,6 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-sc name = "jupyter-server-fileid" version = "0.9.0" description = "" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1909,7 +1828,6 @@ test = ["jupyter-server[test] (>=1.15,<3)", "pytest", "pytest-cov"] name = "jupyter-server-terminals" version = "0.4.4" description = "A Jupyter Server Extension Providing Terminals." -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -1929,7 +1847,6 @@ test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", name = "jupyter-server-ydoc" version = "0.8.0" description = "A Jupyter Server Extension Providing Y Documents." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1949,7 +1866,6 @@ test = ["coverage", "jupyter-server[test] (>=2.0.0a0)", "pytest (>=7.0)", "pytes name = "jupyter-ydoc" version = "0.2.5" description = "Document structures for collaborative editing using Ypy" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1969,7 +1885,6 @@ test = ["pre-commit", "pytest", "pytest-asyncio", "websockets (>=10.0)", "ypy-we name = "jupyterlab" version = "3.6.5" description = "JupyterLab computational environment" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -1998,7 +1913,6 @@ test = ["check-manifest", "coverage", "jupyterlab-server[test]", "pre-commit", " name = "jupyterlab-pygments" version = "0.2.2" description = "Pygments theme using JupyterLab CSS variables" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2010,7 +1924,6 @@ files = [ name = "jupyterlab-server" version = "2.24.0" description = "A set of server components for JupyterLab and JupyterLab like applications." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2037,7 +1950,6 @@ test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-valida name = "kiwisolver" version = "1.4.4" description = "A fast implementation of the Cassowary constraint solver" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2115,7 +2027,6 @@ files = [ name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2161,7 +2072,6 @@ files = [ name = "manimpango" version = "0.4.3" description = "Bindings for Pango for using with Manim." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2187,7 +2097,6 @@ files = [ name = "mapbox-earcut" version = "1.0.1" description = "Python bindings for the mapbox earcut C++ polygon triangulation library." -category = "main" optional = false python-versions = "*" files = [ @@ -2207,6 +2116,14 @@ files = [ {file = "mapbox_earcut-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9af9369266bf0ca32f4d401152217c46c699392513f22639c6b1be32bde9c1cc"}, {file = "mapbox_earcut-1.0.1-cp311-cp311-win32.whl", hash = "sha256:ff9a13be4364625697b0e0e04ba6a0f77300148b871bba0a85bfa67e972e85c4"}, {file = "mapbox_earcut-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e736557539c74fa969e866889c2b0149fc12668f35e3ae33667d837ff2880d3"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fe92174410e4120022393013705d77cb856ead5bdf6c81bec614a70df4feb5d"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:082f70a865c6164a60af039aa1c377073901cf1f94fd37b1c5610dfbae2a7369"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43d268ece49d0c9e22cb4f92cd54c2cc64f71bf1c5e10800c189880d923e1292"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7748f1730fd36dd1fcf0809d8f872d7e1ddaa945f66a6a466ad37ef3c552ae93"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5a82d10c8dec2a0bd9a6a6c90aca7044017c8dad79f7e209fd0667826f842325"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:01b292588cd3f6bad7d76ee31c004ed1b557a92bbd9602a72d2be15513b755be"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fce236ddc3a56ea7260acc94601a832c260e6ac5619374bb2cec2e73e7414ff0"}, + {file = "mapbox_earcut-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:1ce86407353b4f09f5778c436518bbbc6f258f46c5736446f25074fe3d3a3bd8"}, {file = "mapbox_earcut-1.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:aa6111a18efacb79c081f3d3cdd7d25d0585bb0e9f28896b207ebe1d56efa40e"}, {file = "mapbox_earcut-1.0.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2911829d1e6e5e1282fbe2840fadf578f606580f02ed436346c2d51c92f810b"}, {file = "mapbox_earcut-1.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ff909a7b8405a923abedd701b53633c997cc2b5dc9d5b78462f51c25ec2c33"}, @@ -2262,7 +2179,6 @@ test = ["pytest"] name = "markdown-it-py" version = "2.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2287,7 +2203,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2311,6 +2226,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2347,7 +2272,6 @@ files = [ name = "matplotlib" version = "3.7.2" description = "Python plotting package" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2405,13 +2329,11 @@ packaging = ">=20.0" pillow = ">=6.2.0" pyparsing = ">=2.3.1,<3.1" python-dateutil = ">=2.7" -setuptools_scm = ">=7" [[package]] name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -2426,7 +2348,6 @@ traitlets = "*" name = "mccabe" version = "0.6.1" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = "*" files = [ @@ -2438,7 +2359,6 @@ files = [ name = "mdit-py-plugins" version = "0.3.5" description = "Collection of plugins for markdown-it-py" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2458,7 +2378,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2470,7 +2389,6 @@ files = [ name = "mistune" version = "3.0.1" description = "A sane and fast Markdown parser with useful plugins and renderers" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2482,7 +2400,6 @@ files = [ name = "moderngl" version = "5.8.2" description = "ModernGL: High performance rendering for Python 3" -category = "main" optional = false python-versions = "*" files = [ @@ -2545,7 +2462,6 @@ glcontext = ">=2.3.6,<3" name = "moderngl-window" version = "2.4.4" description = "A cross platform helper library for ModernGL making window creation and resource loading simple" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2574,7 +2490,6 @@ trimesh = ["scipy (>=1.3.2)", "trimesh (>=3.2.6,<4)"] name = "multipledispatch" version = "1.0.0" description = "Multiple dispatch" -category = "main" optional = false python-versions = "*" files = [ @@ -2586,7 +2501,6 @@ files = [ name = "mypy" version = "0.931" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2625,7 +2539,6 @@ python2 = ["typed-ast (>=1.4.0,<2)"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2637,7 +2550,6 @@ files = [ name = "myst-parser" version = "0.17.2" description = "An extended commonmark compliant parser, with bridges to docutils & sphinx." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2664,7 +2576,6 @@ testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest name = "nbclassic" version = "1.0.0" description = "Jupyter Notebook as a Jupyter Server extension." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2700,7 +2611,6 @@ test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-jupyter", "pytest-p name = "nbclient" version = "0.8.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "main" optional = true python-versions = ">=3.8.0" files = [ @@ -2710,7 +2620,7 @@ files = [ [package.dependencies] jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" nbformat = ">=5.1" traitlets = ">=5.4" @@ -2723,7 +2633,6 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= name = "nbconvert" version = "7.7.3" description = "Converting Jupyter Notebooks" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2762,7 +2671,6 @@ webpdf = ["playwright"] name = "nbformat" version = "5.9.2" description = "The Jupyter Notebook format" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2784,7 +2692,6 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] name = "nest-asyncio" version = "1.5.7" description = "Patch asyncio to allow nested event loops" -category = "main" optional = true python-versions = ">=3.5" files = [ @@ -2796,7 +2703,6 @@ files = [ name = "networkx" version = "2.8.8" description = "Python package for creating and manipulating graphs and networks" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2815,7 +2721,6 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ @@ -2830,7 +2735,6 @@ setuptools = "*" name = "notebook" version = "6.5.5" description = "A web-based notebook environment for interactive computing" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2865,7 +2769,6 @@ test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixs name = "notebook-shim" version = "0.2.3" description = "A shim layer for notebook traits and config" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -2883,7 +2786,6 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" name = "numpy" version = "1.24.4" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2921,7 +2823,6 @@ files = [ name = "overrides" version = "7.3.1" description = "A decorator to automatically detect mismatch when overriding a method." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -2933,7 +2834,6 @@ files = [ name = "packaging" version = "23.1" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2945,7 +2845,6 @@ files = [ name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2957,7 +2856,6 @@ files = [ name = "parso" version = "0.8.3" description = "A Python Parser" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2973,7 +2871,6 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "pathspec" version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2985,7 +2882,6 @@ files = [ name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "main" optional = false python-versions = "*" files = [ @@ -3000,7 +2896,6 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "main" optional = false python-versions = "*" files = [ @@ -3012,7 +2907,6 @@ files = [ name = "pillow" version = "9.5.0" description = "Python Imaging Library (Fork)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3092,7 +2986,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -3104,7 +2997,6 @@ files = [ name = "platformdirs" version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3120,7 +3012,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pluggy" version = "1.2.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3136,7 +3027,6 @@ testing = ["pytest", "pytest-benchmark"] name = "pre-commit" version = "2.21.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3155,7 +3045,6 @@ virtualenv = ">=20.10.0" name = "prometheus-client" version = "0.17.1" description = "Python client for the Prometheus monitoring system." -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -3170,8 +3059,7 @@ twisted = ["twisted"] name = "prompt-toolkit" version = "3.0.39" description = "Library for building powerful interactive command lines in Python" -category = "main" -optional = true +optional = false python-versions = ">=3.7.0" files = [ {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, @@ -3185,7 +3073,6 @@ wcwidth = "*" name = "psutil" version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3212,7 +3099,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "psutil-wheels" version = "5.8.0" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3238,7 +3124,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "unittest2", "wmi"] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "main" optional = false python-versions = "*" files = [ @@ -3250,7 +3135,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "main" optional = false python-versions = "*" files = [ @@ -3265,7 +3149,6 @@ tests = ["pytest"] name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -3277,7 +3160,6 @@ files = [ name = "pycairo" version = "1.24.0" description = "Python interface for cairo" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3298,7 +3180,6 @@ files = [ name = "pycodestyle" version = "2.7.0" description = "Python style guide checker" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3310,7 +3191,6 @@ files = [ name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3322,7 +3202,6 @@ files = [ name = "pydocstyle" version = "6.3.0" description = "Python docstring style checker" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3340,7 +3219,6 @@ toml = ["tomli (>=1.2.3)"] name = "pydub" version = "0.25.1" description = "Manipulate audio with an simple and easy high level interface" -category = "main" optional = false python-versions = "*" files = [ @@ -3352,7 +3230,6 @@ files = [ name = "pyflakes" version = "2.3.1" description = "passive checker of Python programs" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3364,7 +3241,6 @@ files = [ name = "pygithub" version = "1.59.0" description = "Use the full Github API v3" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3382,7 +3258,6 @@ requests = ">=2.14.0" name = "pyglet" version = "2.0.9" description = "Cross-platform windowing and multimedia library" -category = "main" optional = false python-versions = "*" files = [ @@ -3394,7 +3269,6 @@ files = [ name = "pygments" version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3409,7 +3283,6 @@ plugins = ["importlib-metadata"] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3430,7 +3303,6 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pylint" version = "2.17.5" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -3460,7 +3332,6 @@ testutils = ["gitpython (>3)"] name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3480,14 +3351,13 @@ files = [ cffi = ">=1.4.1" [package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx_rtd_theme"] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pyobjc-core" version = "9.2" description = "Python<->ObjC Interoperability Module" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3505,7 +3375,6 @@ files = [ name = "pyobjc-framework-cocoa" version = "9.2" description = "Wrappers for the Cocoa frameworks on macOS" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3526,7 +3395,6 @@ pyobjc-core = ">=9.2" name = "pyopengl" version = "3.1.6" description = "Standard OpenGL bindings for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -3539,7 +3407,6 @@ files = [ name = "pyparsing" version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" optional = false python-versions = ">=3.6.8" files = [ @@ -3554,7 +3421,6 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pyrr" version = "0.10.3" description = "3D mathematical functions using NumPy" -category = "main" optional = false python-versions = "*" files = [ @@ -3570,7 +3436,6 @@ numpy = "*" name = "pytest" version = "7.4.0" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3593,7 +3458,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "3.0.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3612,7 +3476,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-forked" version = "1.6.0" description = "run tests in isolated forked subprocesses" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3628,7 +3491,6 @@ pytest = ">=3.10" name = "pytest-xdist" version = "2.5.0" description = "pytest xdist plugin for distributed testing and loop-on-failing modes" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3650,7 +3512,6 @@ testing = ["filelock"] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -3665,7 +3526,6 @@ six = ">=1.5" name = "python-json-logger" version = "2.0.7" description = "A python library adding a json log formatter" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -3677,7 +3537,6 @@ files = [ name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -3689,7 +3548,6 @@ files = [ name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "main" optional = true python-versions = "*" files = [ @@ -3713,7 +3571,6 @@ files = [ name = "pywinpty" version = "2.0.11" description = "Pseudo terminal support for Windows from Python." -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -3728,7 +3585,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3750,6 +3606,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -3788,7 +3645,6 @@ files = [ name = "pyzmq" version = "24.0.1" description = "Python bindings for 0MQ" -category = "main" optional = true python-versions = ">=3.6" files = [ @@ -3876,7 +3732,6 @@ py = {version = "*", markers = "implementation_name == \"pypy\""} name = "recommonmark" version = "0.7.1" description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." -category = "dev" optional = false python-versions = "*" files = [ @@ -3893,7 +3748,6 @@ sphinx = ">=1.3.1" name = "referencing" version = "0.30.0" description = "JSON Referencing + Python" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -3909,7 +3763,6 @@ rpds-py = ">=0.7.0" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3931,7 +3784,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "restructuredtext-lint" version = "1.4.0" description = "reStructuredText linter" -category = "dev" optional = false python-versions = "*" files = [ @@ -3945,7 +3797,6 @@ docutils = ">=0.11,<1.0" name = "rfc3339-validator" version = "0.1.4" description = "A pure python RFC3339 validator" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -3960,7 +3811,6 @@ six = "*" name = "rfc3986-validator" version = "0.1.1" description = "Pure python rfc3986 validator" -category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -3972,7 +3822,6 @@ files = [ name = "rich" version = "13.5.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -3992,7 +3841,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rpds-py" version = "0.9.2" description = "Python bindings to Rust's persistent data structures (rpds)" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -4099,7 +3947,6 @@ files = [ name = "scipy" version = "1.10.1" description = "Fundamental algorithms for scientific computing in Python" -category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ @@ -4138,7 +3985,6 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo name = "screeninfo" version = "0.8.1" description = "Fetch location and size of physical screens." -category = "main" optional = false python-versions = ">=3.6.2,<4.0.0" files = [ @@ -4154,7 +4000,6 @@ pyobjc-framework-Cocoa = {version = "*", markers = "sys_platform == \"darwin\""} name = "send2trash" version = "1.8.2" description = "Send file to trash natively under Mac OS X, Windows and Linux" -category = "main" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -4171,7 +4016,6 @@ win32 = ["pywin32"] name = "setuptools" version = "68.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4184,33 +4028,10 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] -[[package]] -name = "setuptools-scm" -version = "7.1.0" -description = "the blessed package to manage your versions by scm tags" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setuptools_scm-7.1.0-py3-none-any.whl", hash = "sha256:73988b6d848709e2af142aa48c986ea29592bbcfca5375678064708205253d8e"}, - {file = "setuptools_scm-7.1.0.tar.gz", hash = "sha256:6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27"}, -] - -[package.dependencies] -packaging = ">=20.0" -setuptools = "*" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} -typing-extensions = "*" - -[package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] - [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4222,7 +4043,6 @@ files = [ name = "skia-pathops" version = "0.7.4" description = "Python access to operations on paths using the Skia library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4278,7 +4098,6 @@ testing = ["coverage", "pytest", "pytest-randomly", "pytest-xdist"] name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -4290,7 +4109,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4302,7 +4120,6 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -4314,7 +4131,6 @@ files = [ name = "soupsieve" version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4326,7 +4142,6 @@ files = [ name = "sphinx" version = "4.5.0" description = "Python documentation generator" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -4362,7 +4177,6 @@ test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] name = "sphinx-basic-ng" version = "1.0.0b2" description = "A modern skeleton for Sphinx themes." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4380,7 +4194,6 @@ docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-ta name = "sphinx-copybutton" version = "0.4.0" description = "Add a copy button to each of your code cells." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -4399,7 +4212,6 @@ rtd = ["ipython", "sphinx", "sphinx-book-theme"] name = "sphinxcontrib-applehelp" version = "1.0.4" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4415,7 +4227,6 @@ test = ["pytest"] name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -4431,7 +4242,6 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4447,7 +4257,6 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -4462,7 +4271,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-programoutput" version = "0.17" description = "Sphinx extension to include program output" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -4477,7 +4285,6 @@ Sphinx = ">=1.7.0" name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -4493,7 +4300,6 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -4509,7 +4315,6 @@ test = ["pytest"] name = "sphinxext-opengraph" version = "0.8.2" description = "Sphinx Extension to enable OGP support" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4525,7 +4330,6 @@ sphinx = ">=4.0" name = "srt" version = "3.5.3" description = "A tiny library for parsing, modifying, and composing SRT files." -category = "main" optional = false python-versions = ">=2.7" files = [ @@ -4536,7 +4340,6 @@ files = [ name = "stack-data" version = "0.6.2" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "main" optional = false python-versions = "*" files = [ @@ -4556,7 +4359,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "svgelements" version = "1.9.5" description = "Svg Elements Parsing" -category = "main" optional = false python-versions = "*" files = [ @@ -4568,7 +4370,6 @@ files = [ name = "terminado" version = "0.17.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4589,7 +4390,6 @@ test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4608,7 +4408,6 @@ test = ["flake8", "isort", "pytest"] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4620,7 +4419,6 @@ files = [ name = "tomlkit" version = "0.12.1" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4632,7 +4430,6 @@ files = [ name = "tornado" version = "6.3.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" optional = true python-versions = ">= 3.8" files = [ @@ -4653,7 +4450,6 @@ files = [ name = "tqdm" version = "4.65.0" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4674,7 +4470,6 @@ telegram = ["requests"] name = "traitlets" version = "5.9.0" description = "Traitlets Python configuration system" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4690,7 +4485,6 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] name = "types-decorator" version = "0.1.7" description = "Typing stubs for decorator" -category = "dev" optional = false python-versions = "*" files = [ @@ -4702,7 +4496,6 @@ files = [ name = "types-docutils" version = "0.20.0.1" description = "Typing stubs for docutils" -category = "dev" optional = false python-versions = "*" files = [ @@ -4714,7 +4507,6 @@ files = [ name = "types-pillow" version = "8.3.11" description = "Typing stubs for Pillow" -category = "dev" optional = false python-versions = "*" files = [ @@ -4726,7 +4518,6 @@ files = [ name = "types-protobuf" version = "3.20.4.6" description = "Typing stubs for protobuf" -category = "dev" optional = false python-versions = "*" files = [ @@ -4738,7 +4529,6 @@ files = [ name = "types-pygments" version = "2.15.0.2" description = "Typing stubs for Pygments" -category = "dev" optional = false python-versions = "*" files = [ @@ -4754,7 +4544,6 @@ types-setuptools = "*" name = "types-requests" version = "2.31.0.2" description = "Typing stubs for requests" -category = "dev" optional = false python-versions = "*" files = [ @@ -4769,7 +4558,6 @@ types-urllib3 = "*" name = "types-setuptools" version = "57.4.18" description = "Typing stubs for setuptools" -category = "dev" optional = false python-versions = "*" files = [ @@ -4781,7 +4569,6 @@ files = [ name = "types-urllib3" version = "1.26.25.14" description = "Typing stubs for urllib3" -category = "dev" optional = false python-versions = "*" files = [ @@ -4793,7 +4580,6 @@ files = [ name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4805,7 +4591,6 @@ files = [ name = "uri-template" version = "1.3.0" description = "RFC 6570 URI Template Processor" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4820,7 +4605,6 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake name = "urllib3" version = "2.0.4" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4838,7 +4622,6 @@ zstd = ["zstandard (>=0.18.0)"] name = "virtualenv" version = "20.24.2" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4859,7 +4642,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess name = "watchdog" version = "2.3.1" description = "Filesystem events monitoring" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4900,7 +4682,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" optional = false python-versions = "*" files = [ @@ -4912,7 +4693,6 @@ files = [ name = "webcolors" version = "1.13" description = "A library for working with the color formats defined by HTML and CSS." -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4928,7 +4708,6 @@ tests = ["pytest", "pytest-cov"] name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "main" optional = true python-versions = "*" files = [ @@ -4940,7 +4719,6 @@ files = [ name = "websocket-client" version = "1.6.1" description = "WebSocket client for Python with low level API options" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -4957,7 +4735,6 @@ test = ["websockets"] name = "wrapt" version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -5042,7 +4819,6 @@ files = [ name = "y-py" version = "0.6.0" description = "Python bindings for the Y-CRDT built from yrs (Rust)" -category = "main" optional = true python-versions = "*" files = [ @@ -5118,7 +4894,6 @@ files = [ name = "ypy-websocket" version = "0.8.4" description = "WebSocket connector for Ypy" -category = "main" optional = true python-versions = ">=3.7" files = [ @@ -5138,7 +4913,6 @@ test = ["mypy", "pre-commit", "pytest", "pytest-asyncio", "websockets (>=10.0)"] name = "zipp" version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -5157,4 +4931,4 @@ jupyterlab = ["jupyterlab", "notebook"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "4599b550efe5d668ee87521ebfb4d39f8329153c119c40cf1dad302498d25e55" +content-hash = "c0d844e1977d8f6e870d0da318527817cce0c59f06ef4bd0378611c361b5142f" From 08264dcf76cb78ccbe9b7a991be4dace03e65e57 Mon Sep 17 00:00:00 2001 From: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:51:37 -0400 Subject: [PATCH 063/106] Merge with main (#3815) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix a typo in deep_dive.rst (#3377) * Several GitHub actions updates (#3397) * Bump docker/login-action from 2 to 3 Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Bump docker/setup-buildx-action from 2 to 3 Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Bump docker/build-push-action from 4 to 5 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4 to 5. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v4...v5) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Bump docker/setup-qemu-action from 2 to 3 Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * rtd: enable htmlzip build (#3355) also, bump python to 3.11 fixes https://github.com/ManimCommunity/manim/issues/3342 * fix(docs): Remove extra curly bracket in LaTeX math expression to fix issue #3330 (#3389) * Bug fix: Use np.isclose for float equality in number line elongated ticks (#3392) * use np.isclose for float equality in number line elongated ticks * use offsets relative to x_min to tell if we need to elongate a tick * forgot to subtract to create list of offsets * add test for elongated ticks float equality * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Remove unused import --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Updated several dependencies (#3399) * updated lockfile * ran poetry update again * pyproject.toml: update manimpango version (#3405) Co-authored-by: Benjamin Hackl * Added docs for functions in `mobject_update_utils` (#3325) * Added docs for functions in mobject_update_utils * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Updated docstring of always_shift Co-authored-by: Benjamin Hackl * Added period to sentence. Co-authored-by: Benjamin Hackl * Updated parameter description in always_redraw Co-authored-by: Benjamin Hackl * Update always_rotate description Co-authored-by: Benjamin Hackl * Finished parameters in always_redraw Co-authored-by: Benjamin Hackl * Changed comment in always_shift Co-authored-by: Benjamin Hackl * update always_shift description Co-authored-by: Benjamin Hackl * used normalize from manim.utils.space_ops * fixed indentation in always_redraw * added type-hints * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Benjamin Hackl * Fix tests to run on Cairo 1.18.0 (#3416) * Add a script to build and install cairo * Update gui tests for cairo 1.18.0 * update script to set env vars * Make the script run with plain python * Prefer the recently built one in pkg-config * Skip the built if it's windows * CI: build and install latest cairo * CI: only run when cache is missed * Disable compiling tests while building cairo * update poetry lock file * Display the cairo version when running pytest * fixup * tests: skip graphical test when cairo is old * fix the path to find the pkgconfig files on linux * set the LD_LIBRARY_PATH too only then it'll work on linux * fixup * small fixup * Move the script inside `.github/scripts` folder * Make the minimum cairo version a constant * Seperate setting env vars to a sperate step this seem to have broken when cache is hit * Fix: Fixed a bug in regards to empty inputs in AddTextLetterByLetter class. (#3404) * Misc: Just a class to test out some functions * Fix: Fixed a bug in AddTextLetterByLetter class * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix: Adjusted changes according to Ben's comments * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix: Removed imports * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Feat: Adjusted changes to AddTextLetterByLetter * Feat: Added test_creation * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Benjamin Hackl * Introduce new workflow creating a downloadable version of the documentation (#3417) * Revert "rtd: enable htmlzip build (#3355)" This reverts commit 571f79be2cf0eff8819aa5d0492d3542b76e5ab3. * use python3.11 to build docs * upgrade python version used in release publish workflow * new workflow for building downloadable docs * change event trigger for testing * sudo apt * rename release job; build html in poetry env * set GITHUB_PATH instead of PATH * introduce additional step * use correct binary path * forgot microtype * fonts-roboto + actually compress files correctly * fix asset path * Update .github/workflows/release-publish-documentation.yml Co-authored-by: Naveen M K * pull_request -> workflow_dispatch * Update .github/workflows/release-publish-documentation.yml --------- Co-authored-by: Naveen M K * Fix incorrect submobject count of multi-part Tex/MathTex mobjects by stopping them from adding empty submobjects (#3423) * do not add a VectorizedPoint as a submobject if SingleStringMathTex renders to empty SVG * test new behavior * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update tests/module/mobject/text/test_texmobject.py * Update tests/module/mobject/text/test_texmobject.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * CI: fix caching of cairo (#3419) I forgot to change the path after moving around the file. * Fix CSV reader adding empty lists in rendering summary (#3430) * Fix CSV reader adding empty files Fixes issue #3311 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fix None check order in _tree_layout (#3421) * Fix None check order in _tree_layout * add tests to test_graph.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Bump teatimeguest/setup-texlive-action from 2 to 3 (#3431) Bumps [teatimeguest/setup-texlive-action](https://github.com/teatimeguest/setup-texlive-action) from 2 to 3. - [Release notes](https://github.com/teatimeguest/setup-texlive-action/releases) - [Commits](https://github.com/teatimeguest/setup-texlive-action/compare/v2...v3) --- updated-dependencies: - dependency-name: teatimeguest/setup-texlive-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * bump dependencies -- see #3241 (#3433) * Fix Typing (#3086) * first draft of color class + starting library conversion * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * changed everything to Manim color todo: figure out circular dependency in utils * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * first working draft of new color version * resolving conflicts * resolving conflicts * resolving conflicts * resolving conflicts * resolving conflicts * changed default internal value of ManimColor to np.ndarray[float] * starting to fix tests * fixed more tests and changed precision of manim color * removed premature color conversion * fixed some more tests * final test changes * fix doctests * fix for 3.8 * fixing ManimColor string representation * removing some unneccesary conversions * moved community constants to manim_colors.py and added more color standards * Added typing.py and typed bezier.py, core.py, constants.py fully * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fixed codeql complaints * add type ignore for np.allclose * fixed import in three_dimensions * added ignore for F401 back again in flake * added typings to coordinate_systems.py * Few improvements to `graphing/coordinate_systems.py` * added some typings to mobject/geometry/line.py * updated typings for mobject/geometry/line.py * Add missing imports to `line.py` * added typings to three_dimensions.py * Use `FunctionOverride` for animation overrides Fix type signature of `set_color_by_gradient` * Remove `TYPE_CHECKING` check Doc is failing * Revert "Remove `TYPE_CHECKING` check" Fails due to circular import * Use `Self` in `coordinate_systems.py` * Typehinted mobject.py and updated manim.typing.py * Typed VMobject * Type-hinted manim.mobject.geometry * math.cos->np.cos, etc & fixed incorrect typehints * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix missing annotations import * TypeAlias fix in typing.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add ignore errors again to mypy because commits are not possible like this * Fix last typing issues * Update docs * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Only type check manim * Try fixing pre-commit * fix merge * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix compat * Fix compat again * Fix imports compat * Use union syntax * Use union syntax * Fix reduce_across_dimension * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Various test and merge fixes * Doc fixes * Last doc fix * Revert usage of np over math * Bump numpy version * Remove obsolete duplicate example * Fixed Incorrect Typehint in manim.constants * Fix docstring typo * More fixes Use mypy.ini instead of .mypy.ini Fix more docstrings Improve types in utils and constants * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * docs fixes * Add internal aliases * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix compat * line lengths in .rst file, formatting, typos * add docstring for space_ops:cross2d * add some more arrow tip typings (in a non-circular import causing way) * yes, this can be deleted * fix formatting of example * added docstring to bezier::inverse_interpolation * added docstring + test for bezier::match_interpolate * some improvements in coordinate_systems * Vector -> Vector3 * replaced np.ndarray with more appropriate type hints * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Apply feedback * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * revert to previous (new) version * fix doctest * fix ReST errors --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Alex Lembcke Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> Co-authored-by: JasonGrace2282 Co-authored-by: Benjamin Hackl * fix: issue with ImageMobject bounding box (#3340) * fix: fix an issue with ImageMobject bounding box A missing point resulted in smaller bounding box causing issues it to be smaller when the object is rotated. Added the missing fourth point to ImageMobject points and altered call from camera. Filled in docstring that used to propagate from superclass, saying that ImageMobject has no points. * add a test to check that rotating an image to and from doesn't change it * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: Václav Blažej Co-authored-by: Naveen M K Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * chore(deps): add Python 3.12 support (#3395) * chore(deps): add Python 3.11 and 3.12 support chore(deps): update lock file chore(deps): remove colour fix(deps): force NumPy version fix(deps): relax constraints chore(deps): update lock file * fix(deps): make poetry happy * fix(ci): skia pathops on 3.12 * fix(test): doctest skip * disable python 3.8 pipeline * removed get_parameters, replaced by direct call to inspect * black --------- Co-authored-by: Benjamin Hackl * Added ability to remove non-svg LaTeX files (#3322) * Added ability to remove latex junk (default True) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fixed tests (hopefully), and whitelisted .tex * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * reverted weird changes from merge * See previous commit message * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fixed logs-too-long test * Fixed log output * Fixed typo ;) * deleted unused variable * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * moved latex deletion to tex_file_writing.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * removed changes in scene files * Added caching based on LaTeX expression .svg * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Deleted unused function in delete_old_tex * make if condition more readable Co-authored-by: Benjamin Hackl * cleaned up svg file check * changed blacklist -> whitelist for file endings * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Reverted docstring change * Updated delete_non_svg files docstring * Changed list to a set * Update manim/_config/utils.py * Update manim/cli/render/global_options.py * added one test for the no_latex_cleanup config option --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Benjamin Hackl Co-authored-by: Tristan Schulz * feat: DecimalNumber() - added spacing between values and unit (#3366) * feat: DecimalNumber() - added spacing between values and unit * Update manim/mobject/text/numbers.py Co-authored-by: Benjamin Hackl * Update manim/mobject/text/numbers.py Co-authored-by: Benjamin Hackl * Update manim/mobject/text/numbers.py Co-authored-by: Benjamin Hackl * Update manim/mobject/text/numbers.py Co-authored-by: Benjamin Hackl * Update manim/mobject/text/numbers.py Co-authored-by: Benjamin Hackl * Update manim/mobject/text/numbers.py Co-authored-by: Benjamin Hackl * Update manim/mobject/text/numbers.py Co-authored-by: Benjamin Hackl --------- Co-authored-by: Tristan Schulz Co-authored-by: Benjamin Hackl * Add option to run examples directly with binder (#3427) * Add option to run examples directly with binder The minified JS is from https://github.com/naveen521kk/manim-binder * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * slight style changes * update the js file to fix on chrome Signed-off-by: Naveen M K * show the run button as an cursor * make the video to be 100% of the width * Update manim/utils/docbuild/manim_directive.py Co-authored-by: Benjamin Hackl * Add a "Make interactive" button instead of "Run" button Clicking on the "Make interactive" button show the code-editor and "run" button * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * update margin for run interactive button --------- Signed-off-by: Naveen M K Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Benjamin Hackl * Prepare v0.18.0 (#3439) * generated changelog and bumped version * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * changed some PR descriptions in the changelog * fix some docbuild warnings * fixed a reference that became ambiguous * copyedit pass of changelog * some more changelog polishing * bump release date * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * updated release date --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fixed wrong path in action building downloadable docs (#3450) * fixed wrong path in action building downloadable docs * fix second occurrence of wrong path * Allow accessing ghost vectors in :class:`.LinearTransformationScene` (#3435) * Fix CSV reader adding empty files Fixes issue #3311 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added LinearTransformationScene.ghost_vectors * Added test and prevented empty VGroups as ghost vectors * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fixed typo in example * Added ability to join together multiple renders * Revert "Added ability to join together multiple renders" (wrong branch) This reverts commit dee29c390f433bb3964c13b2f6ccc991c18db925. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Add type hints to `_config` (#3440) * Add type hints to `_config` * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix call issues * Fix wrong value being used * Fix test * Fix wrong value being set * lint * Few type fixes --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fix Idicate docs typo (#3461) * Update indication.py (#3477) reading docs, im sure oppising isnt a word * Optimized `get_unit_normal()` and replaced `np.cross()` with custom `cross()` in `manim.utils.space_ops` (#3494) * Added cross and optimized get_unit_normal in manim.utils.space_ops * Added missing border case to new get_unit_normal where one vector is nonzero * Updated test_threed.py::test_Sphere test data * Update dependency constraints, fix deprecation warnings (#3376) * WIP: Update metadata * Finish removing upper bounds Drop requests dependency, use urllib instead order depencencies * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix issues on 3.12 * Order dev dependencies * Update most dev deps, update lint config * Add missing import * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * trigger CI * More deprecation fixes * Missing argument * Deprecation fixes, again * Use older xdist to fix test flakyness --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * fix 360° to 180° in quickstart tutorial (#3498) * Update Docker base image to python3.12-slim (#3458) (#3459) * Update Docker base image to python3.12-slim (#3458) * Update docker/Dockerfile --------- Co-authored-by: Melody Griesen Co-authored-by: Benjamin Hackl * fix line_join to joint_type in example_scenes/basic.py (#3510) * fix typo in docstring for DtUpdater example: line -> square (#3509) * Implement caching of fonts list to improve runtime performance (#3316) * Implement caching of fonts list to improve runtime performance * Fix small use_svg_cache kwargs error * replaced font list with LRU cache * Removed deprecated new command (#3512) Co-authored-by: Naveen M K * Added `cap_style` feature to `VMobject` (#3516) * Added cap_style feature to VMobject * Added an example to `set_cap_style` method * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Unsplitted line 2501 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added graphical test for cap_style * Added vmobject_cap_styles.npz for testing cap_styles * Removed # noqa comments from vectorized_mobject.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * feat(cli): optionally hide version splash (#3329) * feat(cli): optionally hide version splash As discussed in #3326, this PR proposes a new optional flag to hide the version splash when manim command in launched. Additionally, the splash print is now inly executed when the CLI is executed, not on module import. After looking at the current documentation, it does not seem to change anything. I only saw that you documented a version splash for when the CLI is used, but not when the module is imported. So removing it should not break the api docs. In the future, users can still have version information with `import manim; print(manim.__version__)`. Closes #3326 * chore(tests): make tests pass --------- Co-authored-by: Tristan Schulz * Reformatting the `--save_sections` output to have the format `__` (#3499) * Worked on issue 3471, fixing rendered file names to inherit section name * Modified file name to include section number and name * Modified tests for file names to include number and name, in order to pass --------- Co-authored-by: Tristan Schulz * Explain ``.Transform`` vs ``.ReplacementTransform`` in quickstart examples (#3500) * Explained ReplacementTransform vs Transform * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added section explaining Transform vs ReplacementTransform * Added a->b->c example * Clarified explanation * Fixed Typo * Fixed missing colon * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Tristan Schulz * Fix formatting building blocks (#3515) * Fix formatting building blocks * Fix formatting building blocks --------- Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> * Bump jupyter-server from 2.9.1 to 2.11.2 (#3497) Bumps [jupyter-server](https://github.com/jupyter-server/jupyter_server) from 2.9.1 to 2.11.2. - [Release notes](https://github.com/jupyter-server/jupyter_server/releases) - [Changelog](https://github.com/jupyter-server/jupyter_server/blob/main/CHANGELOG.md) - [Commits](https://github.com/jupyter-server/jupyter_server/compare/v2.9.1...v2.11.2) --- updated-dependencies: - dependency-name: jupyter-server dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Account for dtype in the pixel array so the maximum value stays correct in the invert function (#3493) * fix(lib): fix This fixes an issue where the `invert` argument would only work for `uint8` dtypes. Now the `max` value is updated according to the pixel array dtype. Maybe we should add unit tests for that, but haven't found an obvious place to put unit tests. * chore(ci): add basic test * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix(ci): wrong attr name * Update tests/module/mobject/test_image.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Benjamin Hackl * Added `grid_lines` attribute to `Rectangle` to add individual styling to the grid lines (#3428) * Added 'grid_line_stroke_width' parameter in Rectangle * Added 'grid_lines' (VGroup) attribute to 'Rectangle' class --------- Co-authored-by: Tristan Schulz * Fix rectangle grid properties (#3082) (#3513) * Import for both vertical and horizontal gridlines in * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: Tristan Schulz Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fix animations with zero runtime length to give a useful error instead of a broken pipe (#3491) * Fix animation group not erroring when instantiated with an empty list * Move error messages into Animation.begin() * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update manim/animation/animation.py * Update manim/animation/composition.py * Update manim/animation/animation.py Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> * fixed the stroke width issue with single color in streamlines (#3436) * fixed the stroke width issue with single color in streamlines * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added test for streamlines * Added test for streamlines --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: MrDiver * Add Documentation to `.to_edge` and `to_corner` (#3408) * Added docstrings and example renders to Mobject.to_corner() and Mobject.to_edge * Added docstrings and example renders to Mobject.to_corner() and Mobject.to_edge * Update manim/mobject/mobject.py * Update manim/mobject/mobject.py * Update manim/mobject/mobject.py * Update manim/mobject/mobject.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update manim/mobject/mobject.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: Tristan Schulz Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Adding the ability to pass lists and generators to .play() (#3365) * adding the ability to pass lists and generators to .play() * fix for _AnimationBuilder * Changed handling of generators to accept lists of generators and normal arguments at the same time * Animation group handles generators * Refactored into own function for reusability * Fix typing * Fix typing --------- Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> * follow-up to #3491, made errors more consistent. fixes #3527 * chore(docs): add some words about Cairo 1.18 (#3530) * chore(docs): add some words about Cairo 1.18 Closes #3521 * fix(docs): typo * Update testing.rst * Update testing.rst * Fix formatting of ``MoveAlongPath`` docs (#3541) * Remove wag method from Mobject * Fixed MoveAlongPath * Revert remove wag Created a new branch with the wrong base, sorry ;) * Fixed Animate Type-hint (#3543) * Remove wag method from Mobject (#3539) Co-authored-by: Francisco Manríquez Novoa <49853152+chopan050@users.noreply.github.com> * Fix typo of `get_y_axis_label` docstring (#3547) * Finish TODO's in ``contributing/typings.rst`` (#3545) * Updated typing docs * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added link for protocols * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added object vs Any * Fix Typo * Rephrase TypeVar Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * Compare between tuple vs list Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * typing -> collections.abc Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * typing -> collections.abc Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * change method to attr Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * clarify object typehint Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * Fix code typo Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * Added if TYPE_CHECKING section * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix reST for inline code * Elaborate on if TYPE_CHECKING Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * functions -> collections Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> * Fix use of `Mobject`'s deprecated `get_*()` and `set_*()` methods in Cairo tests (#3549) * Fix Deprecation warnings in cairo tests * Fix animation/specialized.py * add note in docstring of ManimColor about class constructors (#3554) * Added support for Manim type aliases in Sphinx docs + Added new TypeAliases (#3484) * Updated manim.typing and included TypeAliases in docs.source.conf * Added Vector2 and reorganized manim_type_aliases * Fixed __all__ exports for __all__ of manim * Update manim/cli/render/global_options.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Draft of new typing docs and new autotyping directive * Changed vertical bars to Unions * Updated poetry.lock * Created custom file parser for manim.typing * Got reST parser going * Updated autotyping and parsing * Update parsing * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added code_block toggle * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added typings to directives * Renamed Tuple to tuple in manim.typings * Added missing docs for type aliases * Fixed exponent typo in ManimInt * Hyperlinks to types work - removed Module Attributes section * Removed Unused Import Remove ``import re`` * Added freeglut-devel to workflows for Linux Hopefully (?) fix the GLU import error * Fix package name * Add support for Type Aliases section in every module - Renaming of Vector types * Add/fix docs for directive, parser and others * Fixed alias typo in module_parsing * Fix decode/import bugs, fix minor details in docs * Added missing docs for utils.docbuild and utils.testing * Sort alphabetically entries in utilities_misc.rst * Address review comments, add notes about Vector and hyperlinks inside definition blocks --------- Co-authored-by: MrDiver Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: JasonGrace2282 * Improve documentation section about contributing to docs (#3555) * Improve section in docs about contributing to docs * Add note about doc build command depending on the OS * Improve section in docs about contributing to docs * Add note about doc build command depending on the OS * Fix wrong toctree path in docs/source/contributing/docs.rst * Add helpful hints to `VGroup.add()` error message (#3561) * Improve VGroup creation error message * Use .__name__ for the type Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> --------- Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> * exception add if new_rings is none (#3574) * exception add if new_rings is none * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fix typing of `Animation` (#3568) * Add 'to be used in the future' TODOs to ManimFrame (#3553) * Refactor `TexTemplate` (#3520) * Refactor `TexTemplate` * Add tests, refactor some things * Fixed Some tests * Move typing imports * Fix remaining tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: JasonGrace2282 Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Bump github/codeql-action from 2 to 3 (#3567) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/upload-artifact from 3 to 4 (#3566) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/setup-python from 4 to 5 (#3565) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * updated several packages (pillow, jupyterlab, notebook, jupyterlab-lsp, jinja2, gitpython) (#3593) * Removed -s / --save_last_frame flag from CLI arguments (#3528) * Remove -s flag * Make help text more verbose * fix write_subcaption_file error when using opengl renderer (#3546) * fix write_subcaption_file error when using opengl renderer * Update manim/scene/scene_file_writer.py --------- Co-authored-by: Benjamin Hackl * Update docker.rst to use bash from the PATH (#3582) * fix typo in value_tracker.py (#3594) * fix `get_arc_center()` returning reference of point (#3599) * Add ref_class (#3598) * Fix typehint (#3592) * Update ci.yml (#3611) * fix type hint of indication.py (#3613) * Revert vector type aliases to NumPy ndarrays (#3595) * Improve handling of specified font name (#3429) Co-authored-by: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Co-authored-by: JasonGrace2282 The proposed fix does two things : * If the specified font is 'sans-serif' : change it to 'sans' as this is the name used in the list of fonts * if the font name is not in the list of fonts, automatically check if the capitalized version of the font exists in the list of fonts. If not, print a warning to the user. * Remove support for dynamic plugin imports (#3524) * Remove call to deprecated `pkg_resources` * Remove support for dynamic plugin imports, update plugin utilities * fix affected tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * more fixes * Last fix * Fix import * Update docs --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Jason Villanueva * Run poetry lock --no-update (#3621) * Update jupyter.rst (#3630) Pinpoint IPython==8.21.0 for Google Colab, because more recent versions are incompatible with their runtime. * Fix Vector3 -> Vector3D in contributing docs (#3639) * Bump black from 23.12.1 to 24.3.0 (#3649) Bumps [black](https://github.com/psf/black) from 23.12.1 to 24.3.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/23.12.1...24.3.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump cryptography from 42.0.0 to 42.0.4 (#3629) Bumps [cryptography](https://github.com/pyca/cryptography) from 42.0.0 to 42.0.4. - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/42.0.0...42.0.4) --- updated-dependencies: - dependency-name: cryptography dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Code Cleanup: removing unused imports and global variables (#3620) * Remove unused import * More security fixes * Remove unused global variable * More fixes * Revert change (actual fix would require some rewrite) * Add exception for edge case to satisfy warning * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Stuff * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fixing the behavior of `.become` to not modify target mobject via side effects fix color linking (#3508) * Copied ndarray for rgbas when interpolating * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * changing .become to copy the target mobject * change tests and test data to reflect .become new behavior * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update tests/test_graphical_units/test_mobjects.py * removed unused copy_submobject kwarg * added doctests and improved documentation * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Benjamin Hackl * Added some examples for `Mobject`/`VMobject` methods (#3641) * Add examples to mobject+vmobject methods * Add missing import * Separate whitespace to point_from_proportion * Fixes! * Changed example of Mobject.get_color * Remove unneccessary import * Add in import * Fix typehint of `Vector` direction parameter (#3640) * Fix typehint of Vector * Change from Vector to Point in typehint In `TipableVMobject._pointify` it converts a 3D list of the form [x, y, z] to a Vector3D. Therefore the direction parameter can take lists, not just numpy arrays. * Fix bug in :class:`.VMobjectFromSVGPath` (#3677) * Fixes #3676 * Update manim/mobject/svg/svg_mobject.py Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Fixed problem and added test --------- Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Flake8 rule C901 is about McCabe code complexity (#3673) * Flake8 rule C901 is about McCabe code complexity It is not about flake8-comprehensions. * max-complexity = 29 * Fix broken link to Poetry's installation guide in the first time contributors page (#3692) * Fix minor grammatical errors found in the index page of the documentation (#3690) * Fix some minor grammatical errors in the index page of the docs * Fix grammar * Undo uneccessary change in phrasing * fix(LICENSE): update year (#3689) * Remove deprecated parameters and animations (#3688) * Remove deprecated parameters/animations * Remove test * Remove test data * Attempted fix for windows cp1252 encoding failure (#3687) * Attempt to fix windows test * Revert "Attempt to fix windows test" This reverts commit e31c2077cd15ed83f81974c2cc8729f093731da3. * try a different fix * maybe both fixes together? * try adding in CI * Update ci.yml * Update logger_utils.py * maybe needs a dash? * try utf8 again * Remove legacy_windows * try changing test * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Try decoding after capturing bytes output * Nicer fix * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix typo (#3696) * Docs: fix out-dated CLI option in Manim's Output Settings (#3674) * Docs: fix out-dated CLI option in Manim's Output Settings * Docs: more fluent English Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Docs: break lines * Docs: more fluent English * Docs: remove a space Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> --------- Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * only do actions if try succeeded (#3694) * Mention pixi in installation guide (#3678) * Mention pixi in installation guide * Update docs/source/installation/conda.rst Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Benjamin Hackl * Add note --------- Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Co-authored-by: Benjamin Hackl * Fix successive calls of :meth:`.LinearTransformationScene.apply_matrix` (#3675) * docs: improve installation FAQ's * I have potentially resolved the issue when in LinearTransformationScene between two animations of transforming space we invoke the self.wait() * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * added another solutions in comments, added tests and removed wrong files from git * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * yeah , i forgot to save the file xd * fixed the test, removed the comments my in changed file * fix test and speed up test time for test_apply_matrix * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fixed the test, removed the comments my in changed file * fixed the test * Revert "docs: improve installation FAQ's" This reverts commit e53a1c8d6f14b77f389f79126f77bbcc48e6f869. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: JasonGrace2282 Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Bump actions/cache from 3 to 4 (#3607) Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Bump FedericoCarboni/setup-ffmpeg from 2 to 3 (#3608) Bumps [FedericoCarboni/setup-ffmpeg](https://github.com/federicocarboni/setup-ffmpeg) from 2 to 3. - [Release notes](https://github.com/federicocarboni/setup-ffmpeg/releases) - [Commits](https://github.com/federicocarboni/setup-ffmpeg/compare/v2...v3) --- updated-dependencies: - dependency-name: FedericoCarboni/setup-ffmpeg dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ssciwr/setup-mesa-dist-win from 1 to 2 (#3609) Bumps [ssciwr/setup-mesa-dist-win](https://github.com/ssciwr/setup-mesa-dist-win) from 1 to 2. - [Release notes](https://github.com/ssciwr/setup-mesa-dist-win/releases) - [Commits](https://github.com/ssciwr/setup-mesa-dist-win/compare/v1...v2) --- updated-dependencies: - dependency-name: ssciwr/setup-mesa-dist-win dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs: update typing guidelines (#3704) * Update typing guidelines * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix formatting * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update documentation and typings for `ParametricFunction` (#3703) * Update documentation and typings for ParametricFunction * Use manim tyings Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * fix typings * a few doc fixes * Update manim/mobject/graphing/functions.py Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * update typings * remove extraneous line * update example code * add line back for comptibility * import TYPE_CHECKING --------- Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * fix(copyright): automate copyright updating for docs (#3708) * Fix some typehints in mobject.py (#3668) * refactor(mobject): fix some typehints * Move typing_extensions import under `if TYPE_CHECKING` * Change from using `def animate(self: T ,...) -> T` to `def animate(self, ...) -> Self` as stated in PEP 673 * Fix incorrect usage of `T` in a method * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * move updaters type alias into TYPE_CHECKING * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Bump idna from 3.6 to 3.7 (#3693) Bumps [idna](https://github.com/kjd/idna) from 3.6 to 3.7. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.6...v3.7) --- updated-dependencies: - dependency-name: idna dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pillow from 10.2.0 to 10.3.0 (#3672) Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.2.0 to 10.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/10.2.0...10.3.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix typo (#3721) * Fixed `Mobject.put_start_and_end_on` with same start and end point (#3718) * fix put_start_and_end_on() at the same point * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * [pre-commit.ci] pre-commit autoupdate (#3332) * [pre-commit.ci] pre-commit autoupdate updates: - [github.com/pre-commit/pre-commit-hooks: v4.4.0 → v4.6.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.4.0...v4.6.0) - [github.com/pycqa/isort: 5.12.0 → 5.13.2](https://github.com/pycqa/isort/compare/5.12.0...5.13.2) - [github.com/asottile/pyupgrade: v3.10.1 → v3.15.2](https://github.com/asottile/pyupgrade/compare/v3.10.1...v3.15.2) - [github.com/psf/black: 23.7.0 → 24.4.0](https://github.com/psf/black/compare/23.7.0...24.4.0) - [github.com/asottile/blacken-docs: 1.15.0 → 1.16.0](https://github.com/asottile/blacken-docs/compare/1.15.0...1.16.0) - [github.com/PyCQA/flake8: 6.1.0 → 7.0.0](https://github.com/PyCQA/flake8/compare/6.1.0...7.0.0) - [github.com/pre-commit/mirrors-mypy: v1.5.1 → v1.9.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.5.1...v1.9.0) - [github.com/codespell-project/codespell: v2.2.5 → v2.2.6](https://github.com/codespell-project/codespell/compare/v2.2.5...v2.2.6) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * make smoothererstep readable again, avoid overlong line * zoom_value more readable * fix blacken-docs touching .github * fix codespell setup, remove unnecessary file, fix some typos * flake8: ignore E704, triggered by overload * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update docs/source/tutorials/quickstart.rst * more flake fixes * try to make blacken-docs happy --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Benjamin Hackl * fix(autoaliasattr): search for type aliases under if TYPE_CHECKING (#3671) * build(deps): read-the-docs sphinx (#3720) * Fix issue where SpiralIn doesn't show elements. (#3589) * Set SpiralIn to use fill_opacity 1 if not set * Create SpiralIn control data * Create test for SpiralIn * Fix spiralin to separate fill and stroke opacity * resolve opacity issue * fix test data --------- Co-authored-by: Benjamin Hackl * Clean Graph layouts and increase flexibility (#3434) * allow user-defined layout functions for Graph + fixup type annotations * only pass relevant args * write tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * change_layout forward root_vertex and partitions - deduplicated layout code in __init__ and change_layout - fixed change_layout backwards compatibility * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * add test for change_layout * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix copy/paste error * fix * fixup types for CodeQL * static type the Layout Names * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix dynamic union type for Python 3.9 * add example scenes to LayoutFunction protocol documentation * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Replace references to np.ndarray with standard Manim types * Label NxGraph as a TypeAlias * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Tristan Schulz Co-authored-by: Benjamin Hackl * Follow-up to graph layout cleanup: improvements for tests and typing (#3728) * suggestions from review on #3434 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Update coordinate_systems.py (#3730) small change * build(ci): change from macos-latest to macos-13 (#3729) * Add ``--preview_command`` cli flag (#3615) * Add preview_command cli flag * Edit help for --preview_command * Change back from subprocess.run * Remove old comment * Bug with timg stopped happening with sp.run * Fix docstring * Revert "Fix docstring" This reverts commit d2c00fc24dc46586f994237f1d2758528b78d6a3. * Actually fix docstring * Change help for option Co-authored-by: Benjamin Hackl --------- Co-authored-by: Benjamin Hackl * AnimationGroup: optimized interpolate() and fixed alpha bug on finish() (#3542) * Optimized AnimationGroup computation of start-end times with lag ratio * Added extra comment for init_run_time * Added full path to imports in composition.py * Optimized AnimationGroup.interpolate * Fixed final bugs * Removed accidental print * Final fix to AnimationGroup.interpolate * Fixed animations being skipped unintentionally * Addressed requested changes --------- Co-authored-by: Benjamin Hackl * Fixed ```get_anchors()``` Return Type Inconsistency (#3214) * changed return type of get_anchors() * Ensured consistency with OpenGLVMobject * Fixed CodeQl, updated docstring * Update manim/mobject/types/vectorized_mobject.py Co-authored-by: Benjamin Hackl * Update manim/mobject/opengl/opengl_vectorized_mobject.py Co-authored-by: Benjamin Hackl * fixed typo, t -> e * fixed doctest --------- Co-authored-by: Tristan Schulz Co-authored-by: Benjamin Hackl Co-authored-by: Francisco Manríquez Novoa <49853152+chopan050@users.noreply.github.com> * fixed [""] being set as loaded plugins (#3734) * Prepare new release: v0.18.1 (#3719) * add note about changelog in changelog.rst * bump version * Update CITATION.cff * feat: Add three animations that together simulate a typing animation (#3612) * feat: Add animations that together simulate typing AddTextLetterByLetterWithCursor RemoveTextLetterByLetterWithCursor Blink * Revert "feat: Add animations that together simulate typing" This reverts commit 5fe256880d9ca8e5a1ffe4ff58f71731a45ae2a5. * Revert "Revert "feat: Add animations that together simulate typing"" This reverts commit 6a8244a157f25df5b783a12eed5e26bf1e326421. * Add new animations to __all__ * Temporarily remove docs example * Modify "Blink" and add docstring examples back in To avoid 0-second animations, which fail docstring test * Address requested changes Fix imports Remove redundant constructor arguments Improve names * Shorten names * Fix release documentation building (#3737) * [pre-commit.ci] pre-commit autoupdate (#3739) updates: - [github.com/psf/black: 24.4.0 → 24.4.2](https://github.com/psf/black/compare/24.4.0...24.4.2) - [github.com/pre-commit/mirrors-mypy: v1.9.0 → v1.10.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.9.0...v1.10.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Fixes #3744 (#3745) Co-authored-by: Andrzej Nagórko <> * Bump tqdm from 4.66.1 to 4.66.3 (#3746) Bumps [tqdm](https://github.com/tqdm/tqdm) from 4.66.1 to 4.66.3. - [Release notes](https://github.com/tqdm/tqdm/releases) - [Commits](https://github.com/tqdm/tqdm/compare/v4.66.1...v4.66.3) --- updated-dependencies: - dependency-name: tqdm dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump jinja2 from 3.1.3 to 3.1.4 (#3750) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.3...3.1.4) --- updated-dependencies: - dependency-name: jinja2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add typehints to `manim.utils.iterables` (#3751) * typehint iterables * organize typing hints * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * remove any * Add overloads for tuplify * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Remove example * feedback * Make TypeVars accessible at runtime * Add hints for zip Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> * typing -> collections.abc Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> * try to make mypy happy * zip[tuple[T, ...]] instead of zip[T] --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> * Let `SceneFileWriter` access `ffmpeg` via `av` instead of via external process (#3501) * added av as a dependency * make partial movie files use av instead of piping to external ffmpeg * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * opengl rendering: use av for movie files * no need to check for ffmpeg executable * refactor: *_movie_pipe -> *_partial_movie_stream * improve (oneline) documentation * pass more options to partial movie file rendering * move ffmpeg verbosity settings to config; renamed option dict * replaced call to ffmpeg in combine_files by using av Co-authored-by: Jérome Eertmans * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * there was one examples saved as a gif? * chore(deps): re-order av * chore(lib): simplify `write_frame` method Reduces the overall code complexity * chore(lib): add audio * fix(lib): same issue for conversion * fix(lib): webm export * fix(lib): transparent export Though the output video is weird * try(lib): fix gif + TODOs * chore(deps): lower dep crit * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * feat(lib): add support for GIF * fix(ci): rewrite tests * fix * chore(ci): prevent calling concat on empty list * add missing dot * fix(ci): update frame comparison ? * fix(log): add handler to libav logger * chore: add TODO * fix(lib): concat issue * Revert "fix(ci): update frame comparison ?" This reverts commit 904cfb46ae8db7dfac01036671991cf81a7823de. * fix(ci): make it pass tests * chore(lib/docs/ci): remove FFMPEG entirely This removes any reference to FFMPEG, except in translation files * added av as a dependency * make partial movie files use av instead of piping to external ffmpeg * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * opengl rendering: use av for movie files * no need to check for ffmpeg executable * refactor: *_movie_pipe -> *_partial_movie_stream * improve (oneline) documentation * pass more options to partial movie file rendering * move ffmpeg verbosity settings to config; renamed option dict * replaced call to ffmpeg in combine_files by using av Co-authored-by: Jérome Eertmans * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * there was one examples saved as a gif? * chore(deps): re-order av * chore(lib): simplify `write_frame` method Reduces the overall code complexity * chore(lib): add audio * fix(lib): same issue for conversion * fix(lib): webm export * fix(lib): transparent export Though the output video is weird * try(lib): fix gif + TODOs * chore(deps): lower dep crit * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * feat(lib): add support for GIF * fix(ci): rewrite tests * fix * chore(ci): prevent calling concat on empty list * add missing dot * fix(ci): update frame comparison ? * fix(log): add handler to libav logger * chore: add TODO * fix(lib): concat issue * Revert "fix(ci): update frame comparison ?" This reverts commit 904cfb46ae8db7dfac01036671991cf81a7823de. * fix(ci): make it pass tests * chore(lib/docs/ci): remove FFMPEG entirely This removes any reference to FFMPEG, except in translation files * chore(deps): update lockfile * chore(lib): rewrite ffprobe * fix typo * slightly more aggressive removal of ffmpeg in docs; minor language changes * fix gif output stream dimensions * minor style change * fix encoding of (transparent) mov files * fixed metadata / comment * set frame rate for --format=gif in output_stream * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * more video tests for different render settings, also test pix_fmt * improve default bitrate setting via crf * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * parametrized format/transparency rendering test * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * context managers for (some) av.open * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update manim/utils/commands.py Co-authored-by: Jérome Eertmans * fixed segfault * update test data involving implicit functions (output improved!) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * explicity set pix_fmt for transparent webms * special-special case extracting frame from vp9-encoded file with transparency * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix transparent gifs, more special casing in parametrized video format test * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * run tests on macos-latest again * removed old control data * Revert "run tests on macos-latest again" This reverts commit f50efa4b887f4596f8193dcaa4f0796b479a8113. * added sound to codec test; fixed issue with sound track in gif (disabled) and webm (now via opus) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * manual wav -> ogg transcoding * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fixed f-string * refactored codec test, split out gif * check for non-zero audio samples * more cleanup * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * remove ffmpeg from readthedocs apt_packages * round up run_time if positive and shorter than current frame rate * added more run_time tests * black * improve implementation of test * removed some unused imports * improve wording of logged warning Co-authored-by: Jérome Eertmans * move run_time checks from Animation.begin to Scene.get_run_time * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * remove unused import * flake: PT012 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Jérome Eertmans * Use --py39-plus in pre-commit (#3761) * Use --py39-plus in pre-commit * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix indication.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Optimized `manim.utils.bezier.is_closed()` (#3768) * Optimized manim.utils.bezier.is_closed() * oops, that shouldn't have been there * Slightly optimized is_closed() even more * Added doctest for is_closed() * Created and optimized Bézier splitting functions such as `partial_bezier_points()` in `manim.utils.bezier` (#3766) * Optimized manim.utils.partial_bezier_points() * Added split_bezier, subdivide_bezier and bezier_remap, and tests * Use bezier_remap() in VMobject and OpenGLVMobject() * Note that partial_bezier_points is similar to calling split_bezier twice * Bump requests to 2.32.0 (#3776) updated-dependencies: - dependency-name: requests dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix assertions and improve error messages when adding submobjects (#3756) * Optimized AnimationGroup computation of start-end times with lag ratio * Added extra comment for init_run_time * Added full path to imports in composition.py * Optimized AnimationGroup.interpolate * Fixed final bugs * Removed accidental print * Final fix to AnimationGroup.interpolate * Fixed animations being skipped unintentionally * Fix and improve Mobject assertions when adding submobjects * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update examples in Mobject.add() and OpenGLMobject.add() docstrings * overriden -> overridden * Joined string in OpenGLMobject error message * Address requested changes * OpenGLVMObjects -> OpenGLVMobjects * Use tuplify in VGroup.__setitem__() --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Add pyproject for ruff formatting (#3777) * Add pyproject for ruff * add black config back * Make only formatting * rearrange isort to undo diff * poetry lock * Feedback * style Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> --------- Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> * pre-commit change to ruff (#3779) * pre-commit change to ruff * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fixes * astral-sh ruff bump --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Ignore Ruff format in git blame (#3781) * Fixed `there_and_back_with_pause()` rate function behaviour with different `pause_ratio` values (#3778) Co-authored-by: Francisco Manríquez Novoa <49853152+chopan050@users.noreply.github.com> * Optimize VMobject methods which append to points (#3765) * Add `@` shorthand for `CoordinateSystem` methods `coords_to_point` (`c2p`) and `point_to_coords` (`p2c`) (#3754) * Add shorthand for axes * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add spacing Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> * Convert CoordinateSystem example, and add to NumberLine * Add doctest for NumberLine * Add test * Fix typehint for c2p Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> Co-authored-by: Francisco Manríquez Novoa <49853152+chopan050@users.noreply.github.com> * [pre-commit.ci] pre-commit autoupdate (#3784) * [pre-commit.ci] pre-commit autoupdate updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.4 → v0.4.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.4...v0.4.5) - [github.com/codespell-project/codespell: v2.2.6 → v2.3.0](https://github.com/codespell-project/codespell/compare/v2.2.6...v2.3.0) * Fix typo --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: JasonGrace2282 * [pre-commit.ci] pre-commit autoupdate (#3794) updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.5 → v0.4.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.5...v0.4.7) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Add Ruff Lint (#3780) Adds Ruff Linting to CI, and replaces isort in the pre-commit config with Ruff's isort rules. Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> * Replace Pyupgrade with Ruff rule (#3795) * Add config for pyupgrade * Fix pyupgrade errors * Unsafe-fixes * Nicer way of formatting Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Revert "Nicer way of formatting" This reverts commit 48013f4a30341f3933a11acfa68d898b7a654cf5. --------- Co-authored-by: Victorien <65306057+Viicos@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Bump tornado from 6.4 to 6.4.1 (#3796) Bumps [tornado](https://github.com/tornadoweb/tornado) from 6.4 to 6.4.1. - [Changelog](https://github.com/tornadoweb/tornado/blob/master/docs/releases.rst) - [Commits](https://github.com/tornadoweb/tornado/compare/v6.4.0...v6.4.1) --- updated-dependencies: - dependency-name: tornado dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update opengl_vectorized_mobject.py (#3790) The "insert_n_curves_to_point_list" function requires the "points" argument to be a numpy array, since it calls the "get_bezier_tuples_from_points" function, which requires "points" to be a numpy array because it has the "return points.reshape((-1, nppc, 3))" statement. Ordinary lists do not have a "reshape" method. So we need to convert "sp1" and "sp2" to numpy arrays before calling the "insert_n_curves_to_point_list" function. Co-authored-by: Francisco Manríquez Novoa <49853152+chopan050@users.noreply.github.com> * [pre-commit.ci] pre-commit autoupdate (#3801) updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.7 → v0.4.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.7...v0.4.8) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Add typings to `OpenGLMobject` (#3803) * Add typings to OpenGLMobject * Import typing_extensions * Add explicit returns to inner functions in .arrange_in_grid() * Add quotes to parameters in ValueError * Add some more typings * Address requested changes * Type apply_over_attr_arrays with TypeVar * Fix use of TypeVar * Add Vector3D typing in set_x, set_y and set_z * fix: importing manim should not trigger pygments.styles.get_all_styles (#3797) * fix: importing manim should not trigger pygments.styles.get_all_styles Removed the Code.styles_list attribute. Rewrote the documentation to say that a list of all styles can be generated by calling list(pygments.styles.get_all_styles()). The example in the docstring of Code was rewritten to use an explicit code style name. * fix: small change to documentation * Added potential class method to get available code styles. * Adding typehints to newly-added attributes. Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * Removing unnecessary lines. Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> --------- Co-authored-by: adeshpande <110117391+JasonGrace2282@users.noreply.github.com> * [pre-commit.ci] pre-commit autoupdate (#3809) updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.8 → v0.4.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.8...v0.4.9) - [github.com/PyCQA/flake8: 7.0.0 → 7.1.0](https://github.com/PyCQA/flake8/compare/7.0.0...7.1.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Bump urllib3 from 2.2.1 to 2.2.2 (#3810) Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.2.1 to 2.2.2. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.2.1...2.2.2) --- updated-dependencies: - dependency-name: urllib3 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update macos packages (#3812) * Fixed infinite loop in OpenGL `BackgroundRectangle.get_color()` (#3732) Co-authored-by: Francisco Manríquez Novoa <49853152+chopan050@users.noreply.github.com> * Some fixes for interpolation --------- Signed-off-by: dependabot[bot] Signed-off-by: Naveen M K Co-authored-by: Holly and Prosper <45610532+rongpenl@users.noreply.github.com> Co-authored-by: Benjamin Hackl Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Naveen M K Co-authored-by: Anousheh Moonen <141789878+u7481690@users.noreply.github.com> Co-authored-by: Narahari Rao Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Immanuel-Alvaro-Bhirawa <127812163+Immanuel-Alvaro-Bhirawa@users.noreply.github.com> Co-authored-by: Nikhil Iyer Co-authored-by: Harald Schilly Co-authored-by: Tristan Schulz Co-authored-by: Alex Lembcke Co-authored-by: Viicos <65306057+Viicos@users.noreply.github.com> Co-authored-by: Václav Blažej <6208643+vaclavblazej@users.noreply.github.com> Co-authored-by: Václav Blažej Co-authored-by: Jérome Eertmans Co-authored-by: Uwe Zimmermann Co-authored-by: Lawrence Qupty <80665382+Lawqup@users.noreply.github.com> Co-authored-by: JosephD <46393716+jcep@users.noreply.github.com> Co-authored-by: Francisco Manríquez Novoa <49853152+chopan050@users.noreply.github.com> Co-authored-by: szchixy Co-authored-by: Melody Griesen Co-authored-by: Melody Griesen Co-authored-by: yuan Co-authored-by: Benjamín Ubilla <118409119+MathItYT@users.noreply.github.com> Co-authored-by: Doaa Muhammad <126016494+doaamuham@users.noreply.github.com> Co-authored-by: Robin Dimasin Co-authored-by: Paul Uhlenbruck <48606747+pauluhlenbruck@users.noreply.github.com> Co-authored-by: Yash Mundada Co-authored-by: TheMathematicFanatic <63360493+TheMathematicFanatic@users.noreply.github.com> Co-authored-by: Václav Volhejn <8401624+vvolhejn@users.noreply.github.com> Co-authored-by: Hydromel Victor Doledji Co-authored-by: Dan Davison Co-authored-by: Greg Rupp Co-authored-by: NotWearingPants <26556598+NotWearingPants@users.noreply.github.com> Co-authored-by: Sparsh Goenka <43041139+sparshg@users.noreply.github.com> Co-authored-by: Said Taghadouini <84044788+staghado@users.noreply.github.com> Co-authored-by: Jason Villanueva Co-authored-by: Abulafia <44573666+abul4fia@users.noreply.github.com> Co-authored-by: Christian Clauss Co-authored-by: Chin Zhe Ning <108804868+biinnnggggg@users.noreply.github.com> Co-authored-by: HairlessVillager <64526732+HairlessVillager@users.noreply.github.com> Co-authored-by: Pavel Zwerschke Co-authored-by: Sir James Clark Maxwell <71722499+SirJamesClarkMaxwell@users.noreply.github.com> Co-authored-by: Daniel Zhu Co-authored-by: Stefano Ottolenghi Co-authored-by: MontroyJosh <122334909+MontroyJosh@users.noreply.github.com> Co-authored-by: Greg Rupp Co-authored-by: Amirreza A <45117218+amrear@users.noreply.github.com> Co-authored-by: Jinchu Li <63861808+JinchuLi2002@users.noreply.github.com> Co-authored-by: VPC <111203113+VinhPhmCng@users.noreply.github.com> Co-authored-by: anagorko <3418166+anagorko@users.noreply.github.com> Co-authored-by: jkjkil4 <52841865+jkjkil4@users.noreply.github.com> Co-authored-by: yang-tsao Co-authored-by: Eddie Ruiz Co-authored-by: Cameron Burdgick <156892808+camburd2@users.noreply.github.com> --- .codespell_ignorelines | 1 - .codespell_ignorewords | 5 + .codespellrc | 6 +- .flake8 | 15 +- .git-blame-ignore-revs | 2 + .github/ISSUE_TEMPLATE/bug_report.md | 9 - .github/ISSUE_TEMPLATE/installation_issue.md | 9 - .github/manimdependency.json | 10 +- .github/scripts/ci_build_cairo.py | 209 + .github/workflows/cffconvert.yml | 2 +- .github/workflows/ci.yml | 49 +- .github/workflows/codeql.yml | 8 +- .github/workflows/publish-docker.yml | 16 +- .github/workflows/python-publish.yml | 10 +- .../release-publish-documentation.yml | 85 + .gitignore | 3 + .mypy.ini | 91 - .pre-commit-config.yaml | 44 +- .readthedocs.yml | 3 +- CITATION.cff | 4 +- LICENSE.community | 2 +- conftest.py | 8 +- docker/Dockerfile | 3 +- manim/cli/new/__init__.py => docs/html | 0 docs/i18n/gettext/tutorials/quickstart.pot | 2 +- docs/requirements.txt | 2 +- docs/skip-manim | 0 docs/source/_static/custom.css | 19 + docs/source/_static/manim-binder.min.js | 3 + .../_static/manim-binder.min.js.LICENSE.txt | 6 + docs/source/_static/manim-binder.min.js.map | 1 + docs/source/_templates/autosummary/module.rst | 13 +- docs/source/changelog.rst | 5 + docs/source/changelog/0.18.0-changelog.rst | 294 ++ docs/source/changelog/0.9.0-changelog.rst | 2 +- docs/source/conf.py | 16 +- docs/source/contributing.rst | 8 +- docs/source/contributing/development.rst | 13 +- docs/source/contributing/docs.rst | 83 + .../contributing/{ => docs}/admonitions.rst | 0 .../contributing/{ => docs}/docstrings.rst | 3 +- .../contributing/{ => docs}/examples.rst | 0 .../contributing/{ => docs}/references.rst | 0 docs/source/contributing/docs/typings.rst | 148 + .../contributing/internationalization.rst | 2 +- docs/source/contributing/testing.rst | 18 + docs/source/contributing/typings.rst | 103 - docs/source/examples.rst | 2 +- docs/source/guides/add_voiceovers.rst | 1 + docs/source/guides/deep_dive.rst | 20 +- docs/source/guides/using_text.rst | 2 +- docs/source/index.rst | 4 +- docs/source/installation.rst | 21 +- docs/source/installation/conda.rst | 13 +- docs/source/installation/docker.rst | 2 +- docs/source/installation/jupyter.rst | 4 +- docs/source/installation/linux.rst | 19 +- docs/source/installation/macos.rst | 4 +- docs/source/installation/windows.rst | 86 +- docs/source/plugins.rst | 32 +- .../source/reference_index/utilities_misc.rst | 10 +- docs/source/tutorials/building_blocks.rst | 18 +- docs/source/tutorials/output_and_config.rst | 33 +- docs/source/tutorials/quickstart.rst | 63 +- example_scenes/basic.py | 6 +- example_scenes/new_test_new.py | 10 +- example_scenes/opengl.py | 2 +- example_scenes/test_new.py | 9 +- manim/__init__.py | 9 +- manim/__main__.py | 28 +- manim/_config/__init__.py | 10 +- manim/_config/cli_colors.py | 23 +- manim/_config/default.cfg | 4 +- manim/_config/logger_utils.py | 22 +- manim/_config/utils.py | 1086 ++-- manim/animation/animation.py | 9 +- manim/animation/changing.py | 3 +- manim/animation/composition.py | 118 +- manim/animation/creation.py | 213 +- manim/animation/fading.py | 3 +- manim/animation/indication.py | 123 +- manim/animation/movement.py | 3 +- manim/animation/protocol.py | 18 +- manim/animation/rotation.py | 5 +- manim/animation/scene_buffer.py | 2 + manim/animation/specialized.py | 5 +- manim/animation/speedmodifier.py | 15 +- manim/animation/transform.py | 9 +- manim/animation/transform_matching_parts.py | 3 +- .../updaters/mobject_update_utils.py | 116 +- manim/camera/camera.py | 5 +- manim/cli/cfg/group.py | 26 +- manim/cli/checkhealth/checks.py | 42 +- manim/cli/checkhealth/commands.py | 2 + manim/cli/default_group.py | 20 +- manim/cli/init/commands.py | 5 +- manim/cli/new/group.py | 189 - manim/cli/plugins/commands.py | 3 + manim/cli/render/commands.py | 47 +- manim/cli/render/ease_of_access_options.py | 7 +- manim/cli/render/global_options.py | 22 +- manim/cli/render/output_options.py | 11 +- manim/cli/render/render_options.py | 26 +- manim/constants.py | 152 +- manim/event_handler/__init__.py | 2 + manim/event_handler/event_type.py | 2 + manim/gui/gui.py | 2 + manim/mobject/geometry/arc.py | 201 +- manim/mobject/geometry/boolean_ops.py | 36 +- manim/mobject/geometry/line.py | 123 +- manim/mobject/geometry/polygram.py | 61 +- manim/mobject/geometry/shape_matchers.py | 33 +- manim/mobject/geometry/tips.py | 68 +- manim/mobject/graph.py | 497 +- manim/mobject/graphing/coordinate_systems.py | 271 +- manim/mobject/graphing/functions.py | 25 +- manim/mobject/graphing/number_line.py | 29 +- manim/mobject/graphing/probability.py | 2 +- manim/mobject/graphing/scale.py | 9 +- manim/mobject/matrix.py | 2 +- manim/mobject/mobject.py | 803 +-- manim/mobject/opengl/opengl_compatibility.py | 2 + manim/mobject/opengl/opengl_geometry.py | 27 +- manim/mobject/opengl/opengl_image_mobject.py | 2 + manim/mobject/opengl/opengl_mobject.py | 39 +- .../opengl/opengl_point_cloud_mobject.py | 2 + manim/mobject/opengl/opengl_surface.py | 5 +- .../mobject/opengl/opengl_three_dimensions.py | 2 + .../opengl/opengl_vectorized_mobject.py | 13 +- manim/mobject/opengl/shader.py | 4 +- manim/mobject/svg/brace.py | 4 +- manim/mobject/svg/svg_mobject.py | 22 +- manim/mobject/table.py | 4 +- manim/mobject/text/code_mobject.py | 27 +- manim/mobject/text/numbers.py | 55 +- manim/mobject/text/tex_mobject.py | 12 +- manim/mobject/text/text_mobject.py | 86 +- manim/mobject/three_d/three_d_utils.py | 21 +- manim/mobject/three_d/three_dimensions.py | 70 +- manim/mobject/types/image_mobject.py | 9 +- manim/mobject/types/point_cloud_mobject.py | 2 + manim/mobject/types/vectorized_mobject.py | 27 +- manim/mobject/value_tracker.py | 6 +- manim/mobject/vector_field.py | 7 +- manim/plugins/__init__.py | 16 +- manim/plugins/import_plugins.py | 43 - manim/plugins/plugins_flags.py | 16 +- manim/renderer/buffers/buffer.py | 2 + manim/renderer/cairo_renderer.py | 18 +- manim/renderer/opengl_file_writer.py | 4 - manim/renderer/opengl_renderer.py | 301 -- manim/renderer/opengl_renderer_window.py | 4 +- manim/renderer/opengl_shader_program.py | 2 + manim/renderer/render_manager.py | 3 +- manim/renderer/renderer.py | 29 +- manim/renderer/shader_wrapper.py | 2 + manim/scene/scene.py | 10 +- manim/scene/scene_file_writer.py | 933 ++-- manim/scene/section.py | 2 + manim/scene/vector_space_scene.py | 33 +- manim/typing.py | 633 +++ manim/utils/bezier.py | 1247 ++++- manim/utils/caching.py | 2 + manim/utils/color/AS2700.py | 2 + manim/utils/color/BS381.py | 3 + manim/utils/color/X11.py | 3 + manim/utils/color/XKCD.py | 3 + manim/utils/color/__init__.py | 4 +- manim/utils/color/core.py | 182 +- manim/utils/color/manim_colors.py | 166 +- manim/utils/commands.py | 51 +- manim/utils/debug.py | 1 - manim/utils/deprecation.py | 68 +- manim/utils/docbuild/__init__.py | 17 + .../utils/docbuild/autoaliasattr_directive.py | 198 + manim/utils/docbuild/autocolor_directive.py | 15 +- manim/utils/docbuild/manim_directive.py | 63 +- manim/utils/docbuild/module_parsing.py | 198 + manim/utils/exceptions.py | 6 + manim/utils/family.py | 4 +- manim/utils/family_ops.py | 5 + manim/utils/file_ops.py | 12 +- manim/utils/hashing.py | 2 + manim/utils/ipython_magic.py | 5 +- manim/utils/iterables.py | 280 +- manim/utils/module_ops.py | 3 +- manim/utils/opengl.py | 14 + manim/utils/parameter_parsing.py | 32 + manim/utils/paths.py | 32 +- manim/utils/rate_functions.py | 16 +- manim/utils/simple_functions.py | 20 - manim/utils/space_ops.py | 150 +- manim/utils/testing/__init__.py | 17 + manim/utils/testing/_test_class_makers.py | 6 +- manim/utils/testing/frames_comparison.py | 21 +- manim/utils/tex.py | 320 +- manim/utils/tex_file_writing.py | 33 +- manim/utils/tex_templates.py | 1 + mypy.ini | 145 + poetry.lock | 4629 ++++++++--------- pyproject.toml | 204 +- scripts/dev_changelog.py | 12 +- scripts/extract_frames.py | 2 + .../logs_data/bad_tex_scene_BadTex.txt | 4 +- .../videos_data/InputFileViaCfg.json | 3 +- .../SceneWithDisabledSections.json | 3 +- .../videos_data/SceneWithEnabledSections.json | 10 +- .../SceneWithMultipleCallsWithNFlag.json | 3 +- .../SceneWithMultiplePlayCallsWithNFlag.json | 3 +- .../SceneWithMultipleWaitCallsWithNFlag.json | 3 +- .../videos_data/SceneWithSections.json | 38 +- .../videos_data/SceneWithSkipAnimations.json | 24 +- .../SquareToCircleWithDefaultValues.json | 3 +- .../videos_data/SquareToCircleWithlFlag.json | 3 +- tests/experimental/test_vmobject_init.py | 2 - tests/helpers/graphical_units.py | 1 - tests/interface/test_commands.py | 51 +- tests/miscellaneous/test_version.py | 4 +- tests/module/animation/test_animation.py | 34 + tests/module/animation/test_composition.py | 12 +- tests/module/animation/test_creation.py | 34 + .../mobject/geometry/test_unit_geometry.py | 4 +- .../graphing/test_coordinate_system.py | 27 +- .../mobject/graphing/test_number_line.py | 9 +- tests/module/mobject/graphing/test_ticks.py | 23 + tests/module/mobject/mobject/test_mobject.py | 19 +- tests/module/mobject/svg/test_svg_mobject.py | 68 + tests/module/mobject/test_graph.py | 78 + tests/module/mobject/test_image.py | 14 + tests/module/mobject/text/test_markup.py | 4 +- tests/module/mobject/text/test_texmobject.py | 44 +- .../module/mobject/text/test_text_mobject.py | 20 + .../types/vectorized_mobject/test_stroke.py | 15 + .../test_vectorized_mobject.py | 122 +- tests/module/utils/_split_matrices.py | 215 + tests/module/utils/_subdivision_matrices.py | 167 + tests/module/utils/test_bezier.py | 97 + tests/module/utils/test_deprecation.py | 8 +- tests/module/utils/test_space_ops.py | 2 +- tests/module/utils/test_tex.py | 118 + tests/opengl/test_color_opengl.py | 30 +- tests/opengl/test_composition_opengl.py | 2 +- tests/opengl/test_coordinate_system_opengl.py | 16 +- tests/opengl/test_markup_opengl.py | 4 +- tests/opengl/test_opengl_mobject.py | 23 +- .../opengl/test_opengl_vectorized_mobject.py | 122 +- tests/opengl/test_texmobject_opengl.py | 6 +- tests/test_config.py | 4 +- .../control_data/boolean_ops/difference.npz | Bin 9511 -> 9419 bytes .../control_data/boolean_ops/exclusion.npz | Bin 11305 -> 11214 bytes .../control_data/boolean_ops/intersection.npz | Bin 9204 -> 9122 bytes .../boolean_ops/intersection_3_mobjects.npz | Bin 9288 -> 9254 bytes .../control_data/boolean_ops/union.npz | Bin 8653 -> 8617 bytes .../control_data/brace/arcBrace.npz | Bin 4371 -> 4371 bytes .../control_data/brace/braceTip.npz | Bin 8708 -> 8708 bytes .../control_data/brace/brace_sharpness.npz | Bin 9270 -> 9270 bytes ...group_is_passing_remover_to_animations.npz | Bin 1845 -> 1845 bytes ...sing_remover_to_nested_animationgroups.npz | Bin 1845 -> 1845 bytes .../coordinate_system/implicit_graph.npz | Bin 9938 -> 9602 bytes .../coordinate_system/line_graph.npz | Bin 11642 -> 11642 bytes .../coordinate_system/number_plane.npz | Bin 10291 -> 10291 bytes .../coordinate_system/number_plane_log.npz | Bin 11956 -> 11956 bytes .../coordinate_system/plot_log_x_axis.npz | Bin 6666 -> 6668 bytes .../plot_log_x_axis_vectorized.npz | Bin 6666 -> 6668 bytes .../coordinate_system/plot_surface.npz | Bin 205738 -> 205863 bytes .../plot_surface_colorscale.npz | Bin 164268 -> 164343 bytes .../creation/DrawBorderThenFill.npz | Bin 7784 -> 7784 bytes .../control_data/creation/FadeIn.npz | Bin 5151 -> 5151 bytes .../control_data/creation/FadeOut.npz | Bin 5151 -> 5151 bytes .../control_data/creation/GrowFromCenter.npz | Bin 4070 -> 4070 bytes .../control_data/creation/GrowFromEdge.npz | Bin 4132 -> 4132 bytes .../control_data/creation/GrowFromPoint.npz | Bin 4162 -> 4162 bytes .../control_data/creation/ShrinkToCenter.npz | Bin 4068 -> 4068 bytes .../creation/SpinInFromNothing.npz | Bin 8139 -> 8170 bytes .../control_data/creation/SpiralIn.npz | Bin 0 -> 12527 bytes .../creation/bring_to_back_introducer.npz | Bin 9305 -> 5857 bytes .../control_data/creation/create.npz | Bin 4257 -> 4257 bytes .../control_data/creation/uncreate.npz | Bin 4256 -> 4256 bytes .../creation/uncreate_rate_func.npz | Bin 4129 -> 4129 bytes .../creation/z_index_introducer.npz | Bin 31972 -> 18959 bytes .../control_data/functions/FunctionGraph.npz | Bin 6410 -> 6386 bytes .../functions/ImplicitFunction.npz | Bin 14084 -> 13525 bytes .../control_data/geometry/Angle.npz | Bin 2311 -> 2290 bytes .../control_data/geometry/AngledArrowTip.npz | Bin 2300 -> 2300 bytes .../control_data/geometry/AnnotationDot.npz | Bin 2250 -> 2210 bytes .../control_data/geometry/AnnularSector.npz | Bin 3895 -> 3895 bytes .../control_data/geometry/Annulus.npz | Bin 9026 -> 9026 bytes .../control_data/geometry/Arc.npz | Bin 3028 -> 3022 bytes .../geometry/ArcBetweenPoints.npz | Bin 3041 -> 3035 bytes .../control_data/geometry/Arrange.npz | Bin 2767 -> 2767 bytes .../control_data/geometry/Circle.npz | Bin 6017 -> 5962 bytes .../control_data/geometry/CirclePoints.npz | Bin 8368 -> 8314 bytes .../control_data/geometry/Coordinates.npz | Bin 3948 -> 3948 bytes .../control_data/geometry/CurvedArrow.npz | Bin 2943 -> 2946 bytes .../geometry/CurvedArrowCustomTip.npz | Bin 5028 -> 5033 bytes .../geometry/CustomDoubleArrow.npz | Bin 2929 -> 2907 bytes .../control_data/geometry/DashedVMobject.npz | Bin 5933 -> 5958 bytes .../control_data/geometry/Dot.npz | Bin 1997 -> 1997 bytes .../control_data/geometry/DoubleArrow.npz | Bin 2057 -> 2057 bytes .../control_data/geometry/Elbow.npz | Bin 1915 -> 1915 bytes .../control_data/geometry/Ellipse.npz | Bin 4579 -> 4538 bytes .../control_data/geometry/LabeledArrow.npz | Bin 2884 -> 2884 bytes .../control_data/geometry/LabeledLine.npz | Bin 2669 -> 2669 bytes .../control_data/geometry/Line.npz | Bin 2049 -> 2049 bytes .../control_data/geometry/Polygon.npz | Bin 2794 -> 2794 bytes .../control_data/geometry/Polygram.npz | Bin 11918 -> 11927 bytes .../control_data/geometry/Rectangle.npz | Bin 2496 -> 2496 bytes .../control_data/geometry/RegularPolygram.npz | Bin 13693 -> 13655 bytes .../control_data/geometry/RightAngle.npz | Bin 1942 -> 1942 bytes .../geometry/RoundedRectangle.npz | Bin 4422 -> 4410 bytes .../control_data/geometry/Sector.npz | Bin 2577 -> 2577 bytes .../control_data/geometry/Star.npz | Bin 9023 -> 9012 bytes .../control_data/geometry/Vector.npz | Bin 2070 -> 2070 bytes .../control_data/geometry/ZIndex.npz | Bin 45161 -> 45174 bytes .../geometry/three_points_Angle.npz | Bin 7060 -> 7072 bytes .../control_data/img_and_svg/Arcs01.npz | Bin 7845 -> 7897 bytes .../control_data/img_and_svg/Arcs02.npz | Bin 26869 -> 7905 bytes .../img_and_svg/BrachistochroneCurve.npz | Bin 4174 -> 4179 bytes .../img_and_svg/ContiguousUSMap.npz | Bin 50524 -> 50458 bytes .../img_and_svg/CubicAndLineto.npz | Bin 2962 -> 2962 bytes .../control_data/img_and_svg/CubicPath.npz | Bin 3229 -> 3229 bytes .../control_data/img_and_svg/DesmosGraph1.npz | Bin 8570 -> 8592 bytes .../control_data/img_and_svg/HalfEllipse.npz | Bin 6412 -> 6395 bytes .../control_data/img_and_svg/Heart.npz | Bin 4327 -> 4327 bytes .../img_and_svg/ImageInterpolation.npz | Bin 28166 -> 28166 bytes .../control_data/img_and_svg/ImageMobject.npz | Bin 706260 -> 706260 bytes .../control_data/img_and_svg/Inheritance.npz | Bin 2718 -> 2718 bytes .../control_data/img_and_svg/Line.npz | Bin 2199 -> 2199 bytes .../control_data/img_and_svg/ManimLogo.npz | Bin 9433 -> 9437 bytes .../img_and_svg/MatrixTransform.npz | Bin 2452 -> 2452 bytes .../img_and_svg/MultiPartPath.npz | Bin 2385 -> 2385 bytes .../img_and_svg/MultipleTransform.npz | Bin 3131 -> 3132 bytes .../control_data/img_and_svg/Penrose.npz | Bin 6903 -> 6903 bytes .../img_and_svg/PixelizedText.npz | Bin 4378 -> 4378 bytes .../img_and_svg/QuadraticPath.npz | Bin 4679 -> 4679 bytes .../control_data/img_and_svg/Rhomboid.npz | Bin 5762 -> 5650 bytes .../img_and_svg/RotateTransform.npz | Bin 4289 -> 4289 bytes .../img_and_svg/ScaleTransform.npz | Bin 5899 -> 5899 bytes .../img_and_svg/SingleUSState.npz | Bin 4047 -> 4047 bytes .../img_and_svg/SkewXTransform.npz | Bin 3365 -> 3365 bytes .../img_and_svg/SkewYTransform.npz | Bin 2958 -> 2958 bytes .../control_data/img_and_svg/SmoothCurves.npz | Bin 5650 -> 5658 bytes .../img_and_svg/TranslateTransform.npz | Bin 2579 -> 2579 bytes .../control_data/img_and_svg/UKFlag.npz | Bin 8355 -> 8355 bytes .../img_and_svg/UseTagInheritance.npz | Bin 15729 -> 15758 bytes .../control_data/img_and_svg/VideoIcon.npz | Bin 3973 -> 3973 bytes .../img_and_svg/WatchTheDecimals.npz | Bin 1845 -> 1845 bytes .../control_data/img_and_svg/WeightSVG.npz | Bin 8054 -> 2526 bytes .../img_and_svg/path_multiple_moves.npz | Bin 12363 -> 12356 bytes .../control_data/indication/ApplyWave.npz | Bin 16196 -> 16111 bytes .../control_data/indication/Circumscribe.npz | Bin 10033 -> 6341 bytes .../control_data/indication/Flash.npz | Bin 5836 -> 5836 bytes .../control_data/indication/FocusOn.npz | Bin 16343 -> 16343 bytes .../control_data/indication/Indicate.npz | Bin 5522 -> 5522 bytes .../indication/ShowCreationThenFadeOut.npz | Bin 9879 -> 0 bytes .../indication/ShowPassingFlash.npz | Bin 5184 -> 5184 bytes .../control_data/indication/Wiggle.npz | Bin 14527 -> 14587 bytes .../control_data/logo/banner.npz | Bin 41218 -> 41212 bytes .../control_data/mobjects/PointCloudDot.npz | Bin 5364 -> 5364 bytes .../control_data/mobjects/become.npz | Bin 6411 -> 6446 bytes .../mobjects/become_no_color_linking.npz | Bin 0 -> 9600 bytes .../control_data/mobjects/match_style.npz | Bin 9115 -> 9089 bytes .../mobjects/vmobject_cap_styles.npz | Bin 0 -> 3783 bytes .../mobjects/vmobject_joint_types.npz | Bin 2915 -> 2915 bytes .../modifier_methods/Gradient.npz | Bin 4959 -> 4955 bytes .../modifier_methods/GradientRotation.npz | Bin 4989 -> 4971 bytes .../control_data/movements/Homotopy.npz | Bin 16337 -> 16160 bytes .../control_data/movements/MoveAlongPath.npz | Bin 3520 -> 3520 bytes .../control_data/movements/MoveTo.npz | Bin 5484 -> 5484 bytes .../control_data/movements/PhaseFlow.npz | Bin 6092 -> 6092 bytes .../control_data/movements/Rotate.npz | Bin 12703 -> 12752 bytes .../control_data/movements/Shift.npz | Bin 5452 -> 5452 bytes .../numbers/set_value_with_updaters.npz | Bin 11759 -> 11759 bytes .../control_data/opengl/FixedMobjects3D.npz | Bin 1845 -> 1845 bytes .../control_data/plot/axes.npz | Bin 4665 -> 4664 bytes .../plot/axis_tip_custom_width_height.npz | Bin 5795 -> 5795 bytes .../plot/axis_tip_default_width_height.npz | Bin 4925 -> 4923 bytes .../control_data/plot/custom_coordinates.npz | Bin 4128 -> 4128 bytes .../control_data/plot/get_area.npz | Bin 28752 -> 28750 bytes ...area_with_boundary_and_few_plot_points.npz | Bin 5393 -> 5395 bytes .../control_data/plot/get_axis_labels.npz | Bin 5385 -> 5381 bytes .../control_data/plot/get_graph_label.npz | Bin 12720 -> 12724 bytes .../control_data/plot/get_lines_to_point.npz | Bin 7092 -> 6993 bytes ...emann_rectangles_use_vectorized[False].npz | Bin 18863 -> 18817 bytes ...iemann_rectangles_use_vectorized[True].npz | Bin 18863 -> 18817 bytes .../control_data/plot/get_x_axis_label.npz | Bin 4465 -> 4461 bytes .../control_data/plot/get_y_axis_label.npz | Bin 4612 -> 4610 bytes .../control_data/plot/get_z_axis_label.npz | Bin 15244 -> 15240 bytes .../control_data/plot/log_scaling_graph.npz | Bin 14905 -> 14916 bytes ...derivative_graph_use_vectorized[False].npz | Bin 31734 -> 31795 bytes ..._derivative_graph_use_vectorized[True].npz | Bin 31734 -> 31795 bytes .../plot_functions_use_vectorized[False].npz | Bin 10390 -> 10414 bytes .../plot_functions_use_vectorized[True].npz | Bin 10390 -> 10414 bytes .../control_data/plot/plot_line_graph.npz | Bin 12889 -> 12768 bytes .../plot/plot_use_vectorized[False].npz | Bin 13525 -> 13544 bytes .../plot/plot_use_vectorized[True].npz | Bin 13525 -> 13544 bytes .../control_data/plot/polar_graph.npz | Bin 86651 -> 86593 bytes .../control_data/plot/t_label.npz | Bin 10115 -> 10347 bytes .../control_data/polyhedra/Dodecahedron.npz | Bin 8321 -> 8312 bytes .../control_data/polyhedra/Icosahedron.npz | Bin 7085 -> 7066 bytes .../control_data/polyhedra/Octahedron.npz | Bin 3434 -> 3438 bytes .../control_data/polyhedra/Tetrahedron.npz | Bin 3123 -> 3101 bytes .../probability/advanced_customization.npz | Bin 11762 -> 11762 bytes .../change_bar_values_negative.npz | Bin 9693 -> 9693 bytes .../change_bar_values_some_vals.npz | Bin 9336 -> 9336 bytes .../probability/default_chart.npz | Bin 12093 -> 12093 bytes .../probability/get_bar_labels.npz | Bin 12062 -> 12062 bytes .../probability/label_constructor.npz | Bin 13801 -> 13801 bytes .../probability/negative_values.npz | Bin 12419 -> 12419 bytes .../control_data/specialized/Broadcast.npz | Bin 28868 -> 28784 bytes .../control_data/speed/SpeedModifier.npz | Bin 19400 -> 19400 bytes .../control_data/tables/DecimalTable.npz | Bin 22313 -> 22313 bytes .../control_data/tables/IntegerTable.npz | Bin 15493 -> 15493 bytes .../control_data/tables/MathTable.npz | Bin 3927 -> 3927 bytes .../control_data/tables/MobjectTable.npz | Bin 7067 -> 6905 bytes .../control_data/tables/Table.npz | Bin 10467 -> 10467 bytes .../tex_mobject/color_inheritance.npz | Bin 10504 -> 10504 bytes .../tex_mobject/set_opacity_by_tex.npz | Bin 3526 -> 3526 bytes .../threed/AddFixedInFrameMobjects.npz | Bin 5396 -> 5396 bytes .../control_data/threed/AmbientCameraMove.npz | Bin 7582 -> 7582 bytes .../control_data/threed/Arrow3D.npz | Bin 2519 -> 2495 bytes .../control_data/threed/Axes.npz | Bin 3880 -> 3873 bytes .../control_data/threed/CameraMove.npz | Bin 5580 -> 5580 bytes .../control_data/threed/CameraMoveAxes.npz | Bin 17623 -> 17629 bytes .../control_data/threed/Cone.npz | Bin 25859 -> 25831 bytes .../control_data/threed/Cube.npz | Bin 3057 -> 3057 bytes .../control_data/threed/Cylinder.npz | Bin 5044 -> 5046 bytes .../control_data/threed/Dot3D.npz | Bin 2074 -> 2071 bytes .../control_data/threed/Line3D.npz | Bin 7371 -> 7359 bytes .../control_data/threed/MovingVertices.npz | Bin 8701 -> 8701 bytes .../control_data/threed/Sphere.npz | Bin 24809 -> 24817 bytes .../control_data/threed/SurfaceColorscale.npz | Bin 122822 -> 122747 bytes .../control_data/threed/Torus.npz | Bin 117615 -> 117528 bytes .../control_data/threed/Y_Direction.npz | Bin 88891 -> 88858 bytes .../transform/AnimationBuilder.npz | Bin 15077 -> 15014 bytes .../transform/ApplyComplexFunction.npz | Bin 5495 -> 5495 bytes .../control_data/transform/ApplyFunction.npz | Bin 3575 -> 3577 bytes .../control_data/transform/ApplyMatrix.npz | Bin 19542 -> 19578 bytes .../transform/ApplyPointwiseFunction.npz | Bin 10617 -> 10617 bytes .../transform/ClockwiseTransform.npz | Bin 16705 -> 16701 bytes .../transform/CounterclockwiseTransform.npz | Bin 13399 -> 13436 bytes .../control_data/transform/CyclicReplace.npz | Bin 18791 -> 18747 bytes .../control_data/transform/FadeInAndOut.npz | Bin 15750 -> 15750 bytes .../control_data/transform/FadeToColort.npz | Bin 5543 -> 5543 bytes .../control_data/transform/FadeTransform.npz | Bin 12969 -> 12961 bytes .../transform/FadeTransformPieces.npz | Bin 26755 -> 26702 bytes ...ransform_TargetIsEmpty_FadesOutInPlace.npz | Bin 4233 -> 4233 bytes .../control_data/transform/FullRotation.npz | Bin 30995 -> 30960 bytes .../transform/MatchPointsScene.npz | Bin 2504 -> 2504 bytes .../control_data/transform/MoveToTarget.npz | Bin 5494 -> 5494 bytes .../transform/ReplacementTransform.npz | Bin 23941 -> 14749 bytes .../control_data/transform/Restore.npz | Bin 40860 -> 40804 bytes .../control_data/transform/ScaleInPlace.npz | Bin 4315 -> 4315 bytes .../control_data/transform/ShrinkToCenter.npz | Bin 4068 -> 4068 bytes .../control_data/transform/Transform.npz | Bin 14882 -> 14896 bytes .../transform/TransformFromCopy.npz | Bin 14882 -> 14896 bytes .../TransformWithConflictingPaths.npz | Bin 4213 -> 4213 bytes .../transform/TransformWithPathArcCenters.npz | Bin 4253 -> 4253 bytes .../transform/TransformWithPathFunc.npz | Bin 4213 -> 4213 bytes .../TransformMatchingDisplaysCorrect.npz | Bin 32994 -> 28723 bytes .../TransformMatchingLeavesOneObject.npz | Bin 5687 -> 5610 bytes .../TransformMatchingTex.npz | Bin 8568 -> 8565 bytes ...ormMatchingTex_FadeTransformMismatches.npz | Bin 8570 -> 8572 bytes ..._FadeTransformMismatches_NothingToFade.npz | Bin 7046 -> 7046 bytes ...ansformMatchingTex_TransformMismatches.npz | Bin 8528 -> 8530 bytes .../updaters/LastFrameWhenCleared.npz | Bin 10533 -> 6582 bytes .../updaters/UpdateSceneDuringAnimation.npz | Bin 10857 -> 10839 bytes .../control_data/updaters/Updater.npz | Bin 6112 -> 6112 bytes .../control_data/updaters/ValueTracker.npz | Bin 2002 -> 2002 bytes .../utils/pixel_error_threshold.npz | Bin 32115 -> 1845 bytes .../vector_scene/vector_to_coords.npz | Bin 235257 -> 151213 bytes .../img_svg_resources/A.svg | 13 + tests/test_graphical_units/test_axes.py | 5 +- tests/test_graphical_units/test_creation.py | 8 + .../test_graphical_units/test_img_and_svg.py | 17 + tests/test_graphical_units/test_indication.py | 7 - tests/test_graphical_units/test_mobjects.py | 40 +- .../test_graphical_units/test_tex_mobject.py | 2 - tests/test_graphical_units/test_text.py | 4 +- .../test_graphical_units/test_vector_scene.py | 12 +- tests/test_linear_transformation_scene.py | 24 + tests/test_logging/test_logging.py | 6 +- tests/test_plugins/simple_scenes.py | 14 - tests/test_plugins/test_plugins.py | 114 - .../opengl/test_cli_flags_opengl.py | 4 +- .../opengl/test_play_logic_opengl.py | 1 + tests/test_scene_rendering/simple_scenes.py | 2 + tests/test_scene_rendering/test_cli_flags.py | 4 +- .../test_scene_rendering/test_file_writer.py | 142 +- 489 files changed, 12155 insertions(+), 6699 deletions(-) delete mode 100644 .codespell_ignorelines create mode 100644 .codespell_ignorewords create mode 100644 .git-blame-ignore-revs create mode 100644 .github/scripts/ci_build_cairo.py create mode 100644 .github/workflows/release-publish-documentation.yml delete mode 100644 .mypy.ini rename manim/cli/new/__init__.py => docs/html (100%) create mode 100644 docs/skip-manim create mode 100644 docs/source/_static/manim-binder.min.js create mode 100644 docs/source/_static/manim-binder.min.js.LICENSE.txt create mode 100644 docs/source/_static/manim-binder.min.js.map create mode 100644 docs/source/changelog/0.18.0-changelog.rst create mode 100644 docs/source/contributing/docs.rst rename docs/source/contributing/{ => docs}/admonitions.rst (100%) rename docs/source/contributing/{ => docs}/docstrings.rst (99%) rename docs/source/contributing/{ => docs}/examples.rst (100%) rename docs/source/contributing/{ => docs}/references.rst (100%) create mode 100644 docs/source/contributing/docs/typings.rst delete mode 100644 docs/source/contributing/typings.rst delete mode 100644 manim/cli/new/group.py delete mode 100644 manim/plugins/import_plugins.py create mode 100644 manim/typing.py create mode 100644 manim/utils/docbuild/autoaliasattr_directive.py create mode 100644 manim/utils/docbuild/module_parsing.py create mode 100644 manim/utils/parameter_parsing.py create mode 100644 mypy.ini create mode 100644 tests/module/animation/test_animation.py create mode 100644 tests/module/animation/test_creation.py create mode 100644 tests/module/mobject/test_image.py create mode 100644 tests/module/utils/_split_matrices.py create mode 100644 tests/module/utils/_subdivision_matrices.py create mode 100644 tests/module/utils/test_bezier.py create mode 100644 tests/module/utils/test_tex.py create mode 100644 tests/test_graphical_units/control_data/creation/SpiralIn.npz delete mode 100644 tests/test_graphical_units/control_data/indication/ShowCreationThenFadeOut.npz create mode 100644 tests/test_graphical_units/control_data/mobjects/become_no_color_linking.npz create mode 100644 tests/test_graphical_units/control_data/mobjects/vmobject_cap_styles.npz create mode 100644 tests/test_graphical_units/img_svg_resources/A.svg create mode 100644 tests/test_linear_transformation_scene.py diff --git a/.codespell_ignorelines b/.codespell_ignorelines deleted file mode 100644 index ae00dfdf8e..0000000000 --- a/.codespell_ignorelines +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.codespell_ignorewords b/.codespell_ignorewords new file mode 100644 index 0000000000..b03acdedca --- /dev/null +++ b/.codespell_ignorewords @@ -0,0 +1,5 @@ + nam + sherif + falsy + medias + strager diff --git a/.codespellrc b/.codespellrc index bbc928a1bb..ca31db7e0e 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,4 +1,4 @@ [codespell] -exclude-file=.codespell_ignorelines -check-hidden=True -ignore-words-list = nam,sherif,falsy +check-hidden = True +skip = .git,*.js,*.js.map,*.css,*.css.map,*.html,*.po,*.pot,poetry.lock,*.log,*.svg +ignore-words = .codespell_ignorewords diff --git a/.flake8 b/.flake8 index 8d4f3309b0..b80d86a0fd 100644 --- a/.flake8 +++ b/.flake8 @@ -1,7 +1,8 @@ [flake8] # Exclude the grpc generated code -exclude = ./manim/grpc/gen/* -max-complexity = 15 +exclude = ./manim/grpc/gen/*, __pycache__,.git, +per-file-ignores = __init__.py:F401 +max-complexity = 29 max-line-length = 88 statistics = True # Prevents some flake8-rst-docstrings errors @@ -9,7 +10,7 @@ rst-roles = attr,class,func,meth,mod,obj,ref,doc,exc rst-directives = manim, SEEALSO, seealso docstring-convention=numpy -select = A,A00,B,B9,C4,C90,D,E,F,F,PT,RST,SIM,W +select = A,A00,B,B9,C4,C90,D,E,F,F,PT,RST,SIM,W,F401 # General Compatibility extend-ignore = E203, W503, D202, D212, D213, D404 @@ -17,6 +18,9 @@ extend-ignore = E203, W503, D202, D212, D213, D404 # Misc F401, F403, F405, F841, E501, E731, E402, F811, F821, + # multiple statements on one line (overload) + E704, + # Plug-in: flake8-builtins A001, A002, A003, @@ -26,9 +30,6 @@ extend-ignore = E203, W503, D202, D212, D213, D404 # Plug-in: flake8-simplify SIM105, SIM106, SIM119, - # Plug-in: flake8-comprehensions - C901 - # Plug-in: flake8-pytest-style PT001, PT004, PT006, PT011, PT018, PT022, PT023, @@ -40,4 +41,4 @@ extend-ignore = E203, W503, D202, D212, D213, D404 # Plug-in: flake8-rst-docstrings RST201, RST203, RST210, RST212, RST213, RST215, - RST301, RST303, + RST301, RST303, RST499 diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000000..bfe85b8cae --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# Switched to ruff format: +24025b60d57301b0a59754c38d77bccd8ed69feb diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a3fb7d05ed..f575567e6f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -70,14 +70,5 @@ PASTE HERE -
FFMPEG - -Output of `ffmpeg -version`: - -``` -PASTE HERE -``` -
- ## Additional comments diff --git a/.github/ISSUE_TEMPLATE/installation_issue.md b/.github/ISSUE_TEMPLATE/installation_issue.md index 02d16b78ea..6a720f0f49 100644 --- a/.github/ISSUE_TEMPLATE/installation_issue.md +++ b/.github/ISSUE_TEMPLATE/installation_issue.md @@ -53,14 +53,5 @@ PASTE HERE -
FFMPEG - -Output of `ffmpeg -version`: - -``` -PASTE HERE -``` -
- ## Additional comments diff --git a/.github/manimdependency.json b/.github/manimdependency.json index 32e62e7ecf..93827c1502 100644 --- a/.github/manimdependency.json +++ b/.github/manimdependency.json @@ -4,7 +4,10 @@ "standalone", "preview", "doublestroke", - "ms", + "count1to", + "multitoc", + "prelim2e", + "ragged2e", "everysel", "setspace", "rsfs", @@ -29,7 +32,10 @@ "standalone", "preview", "doublestroke", - "ms", + "count1to", + "multitoc", + "prelim2e", + "ragged2e", "everysel", "setspace", "rsfs", diff --git a/.github/scripts/ci_build_cairo.py b/.github/scripts/ci_build_cairo.py new file mode 100644 index 0000000000..469db7b452 --- /dev/null +++ b/.github/scripts/ci_build_cairo.py @@ -0,0 +1,209 @@ +# Logic is as follows: +# 1. Download cairo source code: https://cairographics.org/releases/cairo-.tar.xz +# 2. Verify the downloaded file using the sha256sums file: https://cairographics.org/releases/cairo-.tar.xz.sha256sum +# 3. Extract the downloaded file. +# 4. Create a virtual environment and install meson and ninja. +# 5. Run meson build in the extracted directory. Also, set required prefix. +# 6. Run meson compile -C build. +# 7. Run meson install -C build. + +import hashlib +import logging +import os +import subprocess +import sys +import tarfile +import tempfile +import typing +import urllib.request +from contextlib import contextmanager +from pathlib import Path +from sys import stdout + +CAIRO_VERSION = "1.18.0" +CAIRO_URL = f"https://cairographics.org/releases/cairo-{CAIRO_VERSION}.tar.xz" +CAIRO_SHA256_URL = f"{CAIRO_URL}.sha256sum" + +VENV_NAME = "meson-venv" +BUILD_DIR = "build" +INSTALL_PREFIX = Path(__file__).parent.parent.parent / "third_party" / "cairo" + +logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") +logger = logging.getLogger(__name__) + + +def is_ci(): + return os.getenv("CI", None) is not None + + +def download_file(url, path): + logger.info(f"Downloading {url} to {path}") + block_size = 1024 * 1024 + with urllib.request.urlopen(url) as response, open(path, "wb") as file: + while True: + data = response.read(block_size) + if not data: + break + file.write(data) + + +def verify_sha256sum(path, sha256sum): + with open(path, "rb") as file: + file_hash = hashlib.sha256(file.read()).hexdigest() + if file_hash != sha256sum: + raise Exception("SHA256SUM does not match") + + +def extract_tar_xz(path, directory): + with tarfile.open(path) as file: + file.extractall(directory) + + +def run_command(command, cwd=None, env=None): + process = subprocess.Popen(command, cwd=cwd, env=env) + process.communicate() + if process.returncode != 0: + raise Exception("Command failed") + + +@contextmanager +def gha_group(title: str) -> typing.Generator: + if not is_ci(): + yield + return + print(f"\n::group::{title}") + stdout.flush() + try: + yield + finally: + print("::endgroup::") + stdout.flush() + + +def set_env_var_gha(name: str, value: str) -> None: + if not is_ci(): + return + env_file = os.getenv("GITHUB_ENV", None) + if env_file is None: + return + with open(env_file, "a") as file: + file.write(f"{name}={value}\n") + stdout.flush() + + +def get_ld_library_path(prefix: Path) -> str: + # given a prefix, the ld library path can be found at + # /lib/* or sometimes just /lib + # this function returns the path to the ld library path + + # first, check if the ld library path exists at /lib/* + ld_library_paths = list(prefix.glob("lib/*")) + if len(ld_library_paths) == 1: + return ld_library_paths[0].absolute().as_posix() + + # if the ld library path does not exist at /lib/*, + # return /lib + ld_library_path = prefix / "lib" + if ld_library_path.exists(): + return ld_library_path.absolute().as_posix() + return "" + + +def main(): + if sys.platform == "win32": + logger.info("Skipping build on windows") + return + + with tempfile.TemporaryDirectory() as tmpdir: + with gha_group("Downloading and Extracting Cairo"): + logger.info(f"Downloading cairo version {CAIRO_VERSION}") + download_file(CAIRO_URL, os.path.join(tmpdir, "cairo.tar.xz")) + + logger.info("Downloading cairo sha256sum") + download_file(CAIRO_SHA256_URL, os.path.join(tmpdir, "cairo.sha256sum")) + + logger.info("Verifying cairo sha256sum") + with open(os.path.join(tmpdir, "cairo.sha256sum")) as file: + sha256sum = file.read().split()[0] + verify_sha256sum(os.path.join(tmpdir, "cairo.tar.xz"), sha256sum) + + logger.info("Extracting cairo") + extract_tar_xz(os.path.join(tmpdir, "cairo.tar.xz"), tmpdir) + + with gha_group("Installing meson and ninja"): + logger.info("Creating virtual environment") + run_command([sys.executable, "-m", "venv", os.path.join(tmpdir, VENV_NAME)]) + + logger.info("Installing meson and ninja") + run_command( + [ + os.path.join(tmpdir, VENV_NAME, "bin", "pip"), + "install", + "meson", + "ninja", + ] + ) + + env_vars = { + # add the venv bin directory to PATH so that meson can find ninja + "PATH": f"{os.path.join(tmpdir, VENV_NAME, 'bin')}{os.pathsep}{os.environ['PATH']}", + } + + with gha_group("Building and Installing Cairo"): + logger.info("Running meson setup") + run_command( + [ + os.path.join(tmpdir, VENV_NAME, "bin", "meson"), + "setup", + BUILD_DIR, + f"--prefix={INSTALL_PREFIX.absolute().as_posix()}", + "--buildtype=release", + "-Dtests=disabled", + ], + cwd=os.path.join(tmpdir, f"cairo-{CAIRO_VERSION}"), + env=env_vars, + ) + + logger.info("Running meson compile") + run_command( + [ + os.path.join(tmpdir, VENV_NAME, "bin", "meson"), + "compile", + "-C", + BUILD_DIR, + ], + cwd=os.path.join(tmpdir, f"cairo-{CAIRO_VERSION}"), + env=env_vars, + ) + + logger.info("Running meson install") + run_command( + [ + os.path.join(tmpdir, VENV_NAME, "bin", "meson"), + "install", + "-C", + BUILD_DIR, + ], + cwd=os.path.join(tmpdir, f"cairo-{CAIRO_VERSION}"), + env=env_vars, + ) + + logger.info(f"Successfully built cairo and installed it to {INSTALL_PREFIX}") + + +if __name__ == "__main__": + if "--set-env-vars" in sys.argv: + with gha_group("Setting environment variables"): + # append the pkgconfig directory to PKG_CONFIG_PATH + set_env_var_gha( + "PKG_CONFIG_PATH", + f"{Path(get_ld_library_path(INSTALL_PREFIX), 'pkgconfig').as_posix()}{os.pathsep}" + f'{os.getenv("PKG_CONFIG_PATH", "")}', + ) + set_env_var_gha( + "LD_LIBRARY_PATH", + f"{get_ld_library_path(INSTALL_PREFIX)}{os.pathsep}" + f'{os.getenv("LD_LIBRARY_PATH", "")}', + ) + sys.exit(0) + main() diff --git a/.github/workflows/cffconvert.yml b/.github/workflows/cffconvert.yml index 6851c52d38..7144363717 100644 --- a/.github/workflows/cffconvert.yml +++ b/.github/workflows/cffconvert.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out a copy of the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Check whether the citation metadata from CITATION.cff is valid uses: citation-file-format/cffconvert-github-action@2.0.0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c234a6e885..ba58ac5ca2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,23 +18,24 @@ jobs: env: DISPLAY: :0 PYTEST_ADDOPTS: "--color=yes" # colors in pytest + PYTHONIOENCODING: "utf8" strategy: fail-fast: false matrix: - os: [ubuntu-22.04, macos-latest, windows-latest] - python: ["3.8", "3.9", "3.10", "3.11"] + os: [ubuntu-22.04, macos-13, windows-latest] + python: ["3.9", "3.10", "3.11", "3.12"] steps: - name: Checkout the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Poetry run: | - pipx install "poetry==1.5.*" + pipx install "poetry==1.7.*" poetry config virtualenvs.prefer-active-python true - name: Setup Python ${{ matrix.python }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} cache: "poetry" @@ -50,22 +51,16 @@ jobs: run: | echo "date=$(/bin/date -u "+%m%w%Y")" >> $GITHUB_OUTPUT - - name: Install and cache ffmpeg (all OS) - uses: FedericoCarboni/setup-ffmpeg@v2 - with: - token: ${{ secrets.GITHUB_TOKEN }} - id: setup-ffmpeg - - name: Install system dependencies (Linux) if: runner.os == 'Linux' uses: awalsh128/cache-apt-pkgs-action@latest with: - packages: python3-opengl libpango1.0-dev xvfb + packages: python3-opengl libpango1.0-dev xvfb freeglut3-dev version: 1.0 - name: Install Texlive (Linux) if: runner.os == 'Linux' - uses: teatimeguest/setup-texlive-action@v2 + uses: teatimeguest/setup-texlive-action@v3 with: cache: true packages: scheme-basic fontspec inputenc fontenc tipa mathrsfs calligra xcolor standalone preview doublestroke ms everysel setspace rsfs relsize ragged2e fundus-calligra microtype wasysym physics dvisvgm jknapltx wasy cm-super babel-english gnu-freefont mathastext cbfonts-fd xetex @@ -76,8 +71,24 @@ jobs: # start xvfb in background sudo /usr/bin/Xvfb $DISPLAY -screen 0 1280x1024x24 & + - name: Setup Cairo Cache + uses: actions/cache@v4 + id: cache-cairo + if: runner.os == 'Linux' || runner.os == 'macOS' + with: + path: ${{ github.workspace }}/third_party + key: ${{ runner.os }}-dependencies-cairo-${{ hashFiles('.github/scripts/ci_build_cairo.py') }} + + - name: Build and install Cairo (Linux and macOS) + if: (runner.os == 'Linux' || runner.os == 'macOS') && steps.cache-cairo.outputs.cache-hit != 'true' + run: python .github/scripts/ci_build_cairo.py + + - name: Set env vars for Cairo (Linux and macOS) + if: runner.os == 'Linux' || runner.os == 'macOS' + run: python .github/scripts/ci_build_cairo.py --set-env-vars + - name: Setup macOS cache - uses: actions/cache@v3 + uses: actions/cache@v4 id: cache-macos if: runner.os == 'macOS' with: @@ -103,10 +114,6 @@ jobs: export PATH="$oriPath" echo "Completed TinyTeX" - - name: Install cairo (MacOS) - if: runner.os == 'macOS' - run: brew install cairo - - name: Add macOS dependencies to PATH if: runner.os == 'macOS' shell: bash @@ -118,12 +125,12 @@ jobs: - name: Setup Windows cache id: cache-windows if: runner.os == 'Windows' - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ github.workspace }}\ManimCache key: ${{ runner.os }}-dependencies-tinytex-${{ hashFiles('.github/manimdependency.json') }}-${{ steps.cache-vars.outputs.date }}-1 - - uses: ssciwr/setup-mesa-dist-win@v1 + - uses: ssciwr/setup-mesa-dist-win@v2 - name: Install system dependencies (Windows) if: runner.os == 'Windows' && steps.cache-windows.outputs.cache-hit != 'true' @@ -131,7 +138,7 @@ jobs: $tinyTexPackages = $(python -c "import json;print(' '.join(json.load(open('.github/manimdependency.json'))['windows']['tinytex']))") -Split ' ' $OriPath = $env:PATH echo "Install Tinytex" - Invoke-WebRequest "https://github.com/yihui/tinytex-releases/releases/download/daily/TinyTeX-1.zip" -O "$($env:TMP)\TinyTex.zip" + Invoke-WebRequest "https://github.com/yihui/tinytex-releases/releases/download/daily/TinyTeX-1.zip" -OutFile "$($env:TMP)\TinyTex.zip" Expand-Archive -LiteralPath "$($env:TMP)\TinyTex.zip" -DestinationPath "$($PWD)\ManimCache\LatexWindows" $env:Path = "$($PWD)\ManimCache\LatexWindows\TinyTeX\bin\windows;$($env:PATH)" tlmgr update --self diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 85d892800d..2ba46fee14 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -24,19 +24,19 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} config-file: ./.github/codeql.yml queries: +security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml index fdd67c2a77..c9c7c2cbb2 100644 --- a/.github/workflows/publish-docker.yml +++ b/.github/workflows/publish-docker.yml @@ -13,19 +13,19 @@ jobs: if: github.event_name != 'release' steps: - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: platforms: linux/arm64,linux/amd64 push: true @@ -38,13 +38,13 @@ jobs: if: github.event_name == 'release' steps: - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} @@ -61,7 +61,7 @@ jobs: print(f"tag_name={ref_tag}", file=f) - name: Build and push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: platforms: linux/arm64,linux/amd64 push: true diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 42763dae49..ebc70c8878 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -8,12 +8,12 @@ jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - name: Set up Python 3.8 - uses: actions/setup-python@v4 + - name: Set up Python 3.11 + uses: actions/setup-python@v5 with: - python-version: 3.9 + python-version: 3.11 - name: Install dependencies run: python -m pip install --upgrade poetry @@ -30,7 +30,7 @@ jobs: poetry build - name: Store artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: dist/*.tar.gz name: manim.tar.gz diff --git a/.github/workflows/release-publish-documentation.yml b/.github/workflows/release-publish-documentation.yml new file mode 100644 index 0000000000..24fb60d7de --- /dev/null +++ b/.github/workflows/release-publish-documentation.yml @@ -0,0 +1,85 @@ +name: Publish downloadable documentation + +on: + release: + types: [released] + workflow_dispatch: + +jobs: + build-and-publish-htmldocs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install system dependencies + run: | + sudo apt update && sudo apt install -y \ + pkg-config libcairo-dev libpango1.0-dev wget fonts-roboto + wget -qO- "https://yihui.org/tinytex/install-bin-unix.sh" | sh + echo ${HOME}/.TinyTeX/bin/x86_64-linux >> $GITHUB_PATH + + - name: Install LaTeX and Python dependencies + run: | + tlmgr update --self + tlmgr install \ + babel-english ctex doublestroke dvisvgm frcursive fundus-calligra jknapltx \ + mathastext microtype physics preview ragged2e relsize rsfs setspace standalone \ + wasy wasysym + python -m pip install --upgrade poetry + poetry install + + - name: Build and package documentation + run: | + cd docs/ + poetry run make html + cd build/html/ + tar -czvf ../html-docs.tar.gz * + + - name: Store artifacts + uses: actions/upload-artifact@v4 + with: + path: ${{ github.workspace }}/docs/build/html-docs.tar.gz + name: html-docs.tar.gz + + - name: Install Dependency + run: pip install requests + + - name: Get Upload URL + if: github.event == 'release' + id: create_release + shell: python + env: + access_token: ${{ secrets.GITHUB_TOKEN }} + tag_act: ${{ github.ref }} + run: | + import requests + import os + ref_tag = os.getenv('tag_act').split('/')[-1] + access_token = os.getenv('access_token') + headers = { + "Accept":"application/vnd.github.v3+json", + "Authorization": f"token {access_token}" + } + url = f"https://api.github.com/repos/ManimCommunity/manim/releases/tags/{ref_tag}" + c = requests.get(url,headers=headers) + upload_url=c.json()['upload_url'] + with open(os.getenv('GITHUB_OUTPUT'), 'w') as f: + print(f"upload_url={upload_url}", file=f) + print(f"tag_name={ref_tag[1:]}", file=f) + + - name: Upload Release Asset + if: github.event == 'release' + id: upload-release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ${{ github.workspace }}/docs/build/html-docs.tar.gz + asset_name: manim-htmldocs-${{ steps.create_release.outputs.tag_name }}.tar.gz + asset_content_type: application/gzip diff --git a/.gitignore b/.gitignore index 153717f347..abec5da495 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,6 @@ dist/ /media_dir.txt # ^TODO: Remove the need for this with a proper config file + +# Ignore the built dependencies +third_party/* diff --git a/.mypy.ini b/.mypy.ini deleted file mode 100644 index 48cad442f4..0000000000 --- a/.mypy.ini +++ /dev/null @@ -1,91 +0,0 @@ -[mypy] -show_error_codes = True - -# ignore most files; should be checked once proper types have been implemented -[mypy-manim.__main__] -ignore_errors = True - -[mypy-manim.camera.*] -ignore_errors = True - -[mypy-manim.scene.*] -ignore_errors = True - -[mypy-manim.cli.cfg.*] -ignore_errors = True - -[mypy-manim.mobject.*] -ignore_errors = True - -[mypy-manim._config.*] -ignore_errors = True - -[mypy-manim.utils.*] -ignore_errors = True - -[mypy-manim.utils.color] -ignore_errors = False - -[mypy-manim.animation.*] -ignore_errors = True - -# ---------------- We can't properly type this ------------------------ - -[mypy-manim.grpc.*] -ignore_errors = True - -# ---------------- Stubless imported Modules -------------------------- - -# We should be able to create stubs for this or type hint it -[mypy-manimpango] -ignore_missing_imports = True - -# Has stubs in 3.8 -[mypy-numpy] -ignore_missing_imports = True - -# Has stubs in 3.8 -[mypy-pydub] -ignore_missing_imports = True - -[mypy-matplotlib] -ignore_missing_imports = True - -[mypy-scipy.*] -ignore_missing_imports = True - -[mypy-networkx] -ignore_missing_imports = True - -[mypy-git] -ignore_missing_imports = True - -[mypy-moderngl.*] -ignore_missing_imports = True - -[mypy-moderngl_window.*] -ignore_missing_imports = True - -[mypy-colour] -ignore_missing_imports = True - -[mypy-dearpygui.*] -ignore_missing_imports = True - -[mypy-screeninfo] -ignore_missing_imports = True - -[mypy-IPython.*] -ignore_missing_imports = True - -[mypy-watchdog.*] -ignore_missing_imports = True - -[mypy-tqdm] -ignore_missing_imports = True - -[mypy-mapbox_earcut] -ignore_missing_imports = True - -[mypy-click_default_group] -ignore_missing_imports = True diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 225996766b..10c390c721 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ fail_fast: false exclude: ^(manim/grpc/gen/|docs/i18n/) repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.6.0 hooks: - id: check-ast name: Validate Python @@ -12,39 +12,22 @@ repos: - id: end-of-file-fixer - id: check-toml name: Validate Poetry - - repo: https://github.com/pycqa/isort - rev: 5.12.0 - hooks: - - id: isort - name: isort (python) - - id: isort - name: isort (cython) - types: [cython] - - id: isort - name: isort (pyi) - types: [pyi] - - repo: https://github.com/asottile/pyupgrade - rev: v3.10.1 - hooks: - - id: pyupgrade - name: Update code to new python versions - args: [--py37-plus] - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 hooks: - id: python-check-blanket-noqa name: Precision flake ignores - - repo: https://github.com/psf/black - rev: 23.7.0 - hooks: - - id: black - - repo: https://github.com/asottile/blacken-docs - rev: 1.15.0 - hooks: - - id: blacken-docs - additional_dependencies: [black==22.3.0] + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.4.9 + hooks: + - id: ruff + name: ruff lint + types: [python] + args: [--exit-non-zero-on-fix] + - id: ruff-format + types: [python] - repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 + rev: 7.1.0 hooks: - id: flake8 additional_dependencies: @@ -58,7 +41,7 @@ repos: flake8-simplify==0.14.1, ] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.4.1 + rev: v1.10.0 hooks: - id: mypy additional_dependencies: @@ -69,9 +52,10 @@ repos: types-requests, types-setuptools, ] + files: ^manim/ - repo: https://github.com/codespell-project/codespell - rev: v2.2.5 + rev: v2.3.0 hooks: - id: codespell files: ^.*\.(py|md|rst)$ diff --git a/.readthedocs.yml b/.readthedocs.yml index 836b4eb423..c102102858 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -3,11 +3,10 @@ build: os: ubuntu-22.04 tools: - python: "3.10" + python: "3.11" apt_packages: - libpango1.0-dev - - ffmpeg - graphviz python: diff --git a/CITATION.cff b/CITATION.cff index d7a2e0f6a5..9bce914e14 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -4,10 +4,10 @@ authors: - name: "The Manim Community Developers" cff-version: "1.2.0" -date-released: 2023-04-06 +date-released: 2024-04-28 license: MIT message: "We acknowledge the importance of good software to support research, and we note that research becomes more valuable when it is communicated effectively. To demonstrate the value of Manim, we ask that you cite Manim in your work." title: Manim – Mathematical Animation Framework url: "https://www.manim.community/" -version: "v0.17.3" +version: "v0.18.1" ... diff --git a/LICENSE.community b/LICENSE.community index 8e35bc50b2..c1c149f1eb 100644 --- a/LICENSE.community +++ b/LICENSE.community @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021, the Manim Community Developers +Copyright (c) 2024, the Manim Community Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/conftest.py b/conftest.py index da37e19ba5..683bd2bc05 100644 --- a/conftest.py +++ b/conftest.py @@ -5,12 +5,7 @@ from __future__ import annotations -try: - # https://github.com/moderngl/moderngl/issues/517 - import readline # required to prevent a segfault on Python 3.10 -except ModuleNotFoundError: # windows - pass - +import cairo import moderngl # If it is running Doctest the current directory @@ -39,6 +34,7 @@ def pytest_report_header(config): info = ctx.info ctx.release() return ( + f"\nCairo Version: {cairo.cairo_version()}", "\nOpenGL information", "------------------", f"vendor: {info['GL_VENDOR'].strip()}", diff --git a/docker/Dockerfile b/docker/Dockerfile index 9272106712..b41647e4e8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,8 +1,7 @@ -FROM python:3.8-slim +FROM python:3.11-slim RUN apt-get update -qq \ && apt-get install --no-install-recommends -y \ - ffmpeg \ build-essential \ gcc \ cmake \ diff --git a/manim/cli/new/__init__.py b/docs/html similarity index 100% rename from manim/cli/new/__init__.py rename to docs/html diff --git a/docs/i18n/gettext/tutorials/quickstart.pot b/docs/i18n/gettext/tutorials/quickstart.pot index 1c4f8f0537..04a2c393a7 100644 --- a/docs/i18n/gettext/tutorials/quickstart.pot +++ b/docs/i18n/gettext/tutorials/quickstart.pot @@ -202,7 +202,7 @@ msgid "This ``Scene`` illustrates the quirks of ``.animate``. When using ``.anim msgstr "" #: ../../source/tutorials/quickstart.rst:344 -msgid "In ``DifferentRotations``, the difference between ``.animate``'s interpretation of rotation and the ``Rotate`` method is far more apparent. The starting and ending states of a ``Mobject`` rotated 360 degrees are the same, so ``.animate`` tries to interpolate two identical objects and the result is the left square. If you find that your own usage of ``.animate`` is causing similar unwanted behavior, consider using conventional animation methods like the right square, which uses ``Rotate``." +msgid "In ``DifferentRotations``, the difference between ``.animate``'s interpretation of rotation and the ``Rotate`` method is far more apparent. The starting and ending states of a ``Mobject`` rotated 180 degrees are the same, so ``.animate`` tries to interpolate two identical objects and the result is the left square. If you find that your own usage of ``.animate`` is causing similar unwanted behavior, consider using conventional animation methods like the right square, which uses ``Rotate``." msgstr "" #: ../../source/tutorials/quickstart.rst:353 diff --git a/docs/requirements.txt b/docs/requirements.txt index 74e954fe80..807fb0d3c4 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ furo myst-parser -sphinx<5.1 +sphinx>=7.3 sphinx-copybutton sphinxext-opengraph diff --git a/docs/skip-manim b/docs/skip-manim new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css index 59e8cb3e35..2b17007fdc 100644 --- a/docs/source/_static/custom.css +++ b/docs/source/_static/custom.css @@ -82,3 +82,22 @@ h4, h5, h6{ .sidebar-tree a.internal.reference { display: table-cell; } + +.manim-binder-button { + text-transform: capitalize; + padding: 10px 20px; + margin: 10px 0; +} + +.manim-binder-wrapper { + background-color: var(--color-code-background); + color: var(--color-code-foreground); +} + +.manim-binder-title { + margin-top: 0; +} + +.manim-binder-button-wrapper { + margin: 0px 10px; +} diff --git a/docs/source/_static/manim-binder.min.js b/docs/source/_static/manim-binder.min.js new file mode 100644 index 0000000000..2e076c9645 --- /dev/null +++ b/docs/source/_static/manim-binder.min.js @@ -0,0 +1,3 @@ +/*! For license information please see manim-binder.min.js.LICENSE.txt */ +(()=>{var __webpack_modules__={5067:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ActivityMonitor=void 0;const n=i(6424);t.ActivityMonitor=class{constructor(e){this._timer=-1,this._timeout=-1,this._isDisposed=!1,this._activityStopped=new n.Signal(this),e.signal.connect(this._onSignalFired,this),this._timeout=e.timeout||1e3}get activityStopped(){return this._activityStopped}get timeout(){return this._timeout}set timeout(e){this._timeout=e}get isDisposed(){return this._isDisposed}dispose(){this._isDisposed||(this._isDisposed=!0,n.Signal.clearData(this))}_onSignalFired(e,t){clearTimeout(this._timer),this._sender=e,this._args=t,this._timer=setTimeout((()=>{this._activityStopped.emit({sender:this._sender,args:this._args})}),this._timeout)}}},4251:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),s(i(5067),t),s(i(6742),t),s(i(5366),t),s(i(6470),t),s(i(5675),t),s(i(5571),t),s(i(1735),t),s(i(1152),t),s(i(5248),t)},6742:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},5366:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MarkdownCodeBlocks=void 0,function(e){e.CODE_BLOCK_MARKER="```";const t=[".markdown",".mdown",".mkdn",".md",".mkd",".mdwn",".mdtxt",".mdtext",".text",".txt",".Rmd"];class i{constructor(e){this.startLine=e,this.code="",this.endLine=-1}}e.MarkdownCodeBlock=i,e.isMarkdown=function(e){return t.indexOf(e)>-1},e.findMarkdownCodeBlocks=function(t){if(!t||""===t)return[];const n=t.split("\n"),s=[];let r=null;for(let t=0;te===t||n&&e===n))},e.isDisabled=function(t){const i=t.indexOf(":");let n="";return-1!==i&&(n=t.slice(0,i)),e.disabled.some((e=>e===t||n&&e===n))}}(Extension=PageConfig.Extension||(PageConfig.Extension={}))})(PageConfig=exports.PageConfig||(exports.PageConfig={}))},5675:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PathExt=void 0;const n=i(2005);!function(e){function t(e){return 0===e.indexOf("/")&&(e=e.slice(1)),e}e.join=function(...e){const i=n.posix.join(...e);return"."===i?"":t(i)},e.basename=function(e,t){return n.posix.basename(e,t)},e.dirname=function(e){const i=t(n.posix.dirname(e));return"."===i?"":i},e.extname=function(e){return n.posix.extname(e)},e.normalize=function(e){return""===e?"":t(n.posix.normalize(e))},e.resolve=function(...e){return t(n.posix.resolve(...e))},e.relative=function(e,i){return t(n.posix.relative(e,i))},e.normalizeExtension=function(e){return e.length>0&&0!==e.indexOf(".")&&(e=`.${e}`),e},e.removeSlash=t}(t.PathExt||(t.PathExt={}))},5571:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.signalToPromise=void 0;const n=i(3911);t.signalToPromise=function(e,t){const i=new n.PromiseDelegate;function s(){e.disconnect(r)}function r(e,t){s(),i.resolve([e,t])}return e.connect(r),(null!=t?t:0)>0&&setTimeout((()=>{s(),i.reject(`Signal not emitted within ${t} ms.`)}),t),i.promise}},1735:(e,t)=>{"use strict";var i;Object.defineProperty(t,"__esModule",{value:!0}),t.Text=void 0,(i=t.Text||(t.Text={})).jsIndexToCharIndex=function(e,t){return e},i.charIndexToJsIndex=function(e,t){return e},i.camelCase=function(e,t=!1){return e.replace(/^(\w)|[\s-_:]+(\w)/g,(function(e,i,n){return n?n.toUpperCase():t?i.toUpperCase():i.toLowerCase()}))},i.titleCase=function(e){return(e||"").toLowerCase().split(" ").map((e=>e.charAt(0).toUpperCase()+e.slice(1))).join(" ")}},1152:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Time=void 0;const i=[{name:"years",milliseconds:31536e6},{name:"months",milliseconds:2592e6},{name:"days",milliseconds:864e5},{name:"hours",milliseconds:36e5},{name:"minutes",milliseconds:6e4},{name:"seconds",milliseconds:1e3}];var n;(n=t.Time||(t.Time={})).formatHuman=function(e){const t=document.documentElement.lang||"en",n=new Intl.RelativeTimeFormat(t,{numeric:"auto"}),s=new Date(e).getTime()-Date.now();for(let e of i){const t=Math.ceil(s/e.milliseconds);if(0!==t)return n.format(t,e.name)}return n.format(0,"seconds")},n.format=function(e){const t=document.documentElement.lang||"en";return new Intl.DateTimeFormat(t,{dateStyle:"short",timeStyle:"short"}).format(new Date(e))}},5248:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.URLExt=void 0;const s=i(2005),r=n(i(2296));!function(e){function t(e){if("undefined"!=typeof document&&document){const t=document.createElement("a");return t.href=e,t}return(0,r.default)(e)}function i(...e){let t=(0,r.default)(e[0],{});const i=""===t.protocol&&t.slashes;i&&(t=(0,r.default)(e[0],"https:"+e[0]));const n=`${i?"":t.protocol}${t.slashes?"//":""}${t.auth}${t.auth?"@":""}${t.host}`,o=s.posix.join(`${n&&"/"!==t.pathname[0]?"/":""}${t.pathname}`,...e.slice(1));return`${n}${"."===o?"":o}`}e.parse=t,e.getHostName=function(e){return(0,r.default)(e).hostname},e.normalize=function(e){return e&&t(e).toString()},e.join=i,e.encodeParts=function(e){return i(...e.split("/").map(encodeURIComponent))},e.objectToQueryString=function(e){const t=Object.keys(e).filter((e=>e.length>0));return t.length?"?"+t.map((t=>{const i=encodeURIComponent(String(e[t]));return t+(i?"="+i:"")})).join("&"):""},e.queryStringToObject=function(e){return e.replace(/^\?/,"").split("&").reduce(((e,t)=>{const[i,n]=t.split("=");return i.length>0&&(e[i]=decodeURIComponent(n||"")),e}),{})},e.isLocal=function(e){const{protocol:i}=t(e);return(!i||0!==e.toLowerCase().indexOf(i))&&0!==e.indexOf("/")}}(t.URLExt||(t.URLExt={}))},7524:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BaseManager=void 0;const n=i(6424),s=i(538);t.BaseManager=class{constructor(e){var t;this._isDisposed=!1,this._disposed=new n.Signal(this),this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:s.ServerConnection.makeSettings()}get disposed(){return this._disposed}get isDisposed(){return this._isDisposed}get isActive(){return!0}dispose(){this.isDisposed||(this._disposed.emit(void 0),n.Signal.clearData(this))}}},4011:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BuildManager=void 0;const n=i(4251),s=i(538);t.BuildManager=class{constructor(e={}){var t;this._url="",this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:s.ServerConnection.makeSettings();const{baseUrl:i,appUrl:r}=this.serverSettings;this._url=n.URLExt.join(i,r,"api/build")}get isAvailable(){return"true"===n.PageConfig.getOption("buildAvailable").toLowerCase()}get shouldCheck(){return"true"===n.PageConfig.getOption("buildCheck").toLowerCase()}getStatus(){const{_url:e,serverSettings:t}=this;return s.ServerConnection.makeRequest(e,{},t).then((e=>{if(200!==e.status)throw new s.ServerConnection.ResponseError(e);return e.json()})).then((e=>{if("string"!=typeof e.status)throw new Error("Invalid data");if("string"!=typeof e.message)throw new Error("Invalid data");return e}))}build(){const{_url:e,serverSettings:t}=this;return s.ServerConnection.makeRequest(e,{method:"POST"},t).then((e=>{if(400===e.status)throw new s.ServerConnection.ResponseError(e,"Build aborted");if(200!==e.status){const t=`Build failed with ${e.status}.\n\n If you are experiencing the build failure after installing an extension (or trying to include previously installed extension after updating JupyterLab) please check the extension repository for new installation instructions as many extensions migrated to the prebuilt extensions system which no longer requires rebuilding JupyterLab (but uses a different installation procedure, typically involving a package manager such as 'pip' or 'conda').\n\n If you specifically intended to install a source extension, please run 'jupyter lab build' on the server for full output.`;throw new s.ServerConnection.ResponseError(e,t)}}))}cancel(){const{_url:e,serverSettings:t}=this;return s.ServerConnection.makeRequest(e,{method:"DELETE"},t).then((e=>{if(204!==e.status)throw new s.ServerConnection.ResponseError(e)}))}}},7302:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConfigWithDefaults=t.ConfigSection=void 0;const n=i(4251),s=i(5247);(t.ConfigSection||(t.ConfigSection={})).create=function(e){const t=new r(e);return t.load().then((()=>t))};class r{constructor(e){var t;this._url="unknown";const i=this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:s.ServerConnection.makeSettings();this._url=n.URLExt.join(i.baseUrl,"api/config",encodeURIComponent(e.name))}get data(){return this._data}async load(){const e=await s.ServerConnection.makeRequest(this._url,{},this.serverSettings);if(200!==e.status)throw await s.ServerConnection.ResponseError.create(e);this._data=await e.json()}async update(e){this._data={...this._data,...e};const t={method:"PATCH",body:JSON.stringify(e)},i=await s.ServerConnection.makeRequest(this._url,t,this.serverSettings);if(200!==i.status)throw await s.ServerConnection.ResponseError.create(i);return this._data=await i.json(),this._data}}t.ConfigWithDefaults=class{constructor(e){var t,i;this._className="",this._section=e.section,this._defaults=null!==(t=e.defaults)&&void 0!==t?t:{},this._className=null!==(i=e.className)&&void 0!==i?i:""}get(e){const t=this._classData();return e in t?t[e]:this._defaults[e]}set(e,t){const i={};if(i[e]=t,this._className){const e={};return e[this._className]=i,this._section.update(e)}return this._section.update(i)}_classData(){const e=this._section.data;return this._className&&this._className in e?e[this._className]:e}}},1708:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Drive=t.ContentsManager=t.Contents=void 0;const o=i(4251),a=i(6424),l=i(5247),h=r(i(3394));var c,d;(d=t.Contents||(t.Contents={})).validateContentsModel=function(e){h.validateContentsModel(e)},d.validateCheckpointModel=function(e){h.validateCheckpointModel(e)},t.ContentsManager=class{constructor(e={}){var t,i;this._isDisposed=!1,this._additionalDrives=new Map,this._fileChanged=new a.Signal(this);const n=this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:l.ServerConnection.makeSettings();this._defaultDrive=null!==(i=e.defaultDrive)&&void 0!==i?i:new u({serverSettings:n}),this._defaultDrive.fileChanged.connect(this._onFileChanged,this)}get fileChanged(){return this._fileChanged}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,a.Signal.clearData(this))}addDrive(e){this._additionalDrives.set(e.name,e),e.fileChanged.connect(this._onFileChanged,this)}getSharedModelFactory(e){var t;const[i]=this._driveForPath(e);return null!==(t=null==i?void 0:i.sharedModelFactory)&&void 0!==t?t:null}localPath(e){const t=e.split("/"),i=t[0].split(":");return 1!==i.length&&this._additionalDrives.has(i[0])?o.PathExt.join(i.slice(1).join(":"),...t.slice(1)):o.PathExt.removeSlash(e)}normalize(e){const t=e.split(":");return 1===t.length?o.PathExt.normalize(e):`${t[0]}:${o.PathExt.normalize(t.slice(1).join(":"))}`}resolvePath(e,t){const i=this.driveName(e),n=this.localPath(e),s=o.PathExt.resolve("/",n,t);return i?`${i}:${s}`:s}driveName(e){const t=e.split("/")[0].split(":");return 1===t.length?"":this._additionalDrives.has(t[0])?t[0]:""}get(e,t){const[i,n]=this._driveForPath(e);return i.get(n,t).then((e=>{const t=[];if("directory"===e.type&&e.content){for(const n of e.content)t.push({...n,path:this._toGlobalPath(i,n.path)});return{...e,path:this._toGlobalPath(i,n),content:t,serverPath:e.path}}return{...e,path:this._toGlobalPath(i,n),serverPath:e.path}}))}getDownloadUrl(e){const[t,i]=this._driveForPath(e);return t.getDownloadUrl(i)}newUntitled(e={}){if(e.path){const t=this.normalize(e.path),[i,n]=this._driveForPath(t);return i.newUntitled({...e,path:n}).then((e=>({...e,path:o.PathExt.join(t,e.name),serverPath:e.path})))}return this._defaultDrive.newUntitled(e)}delete(e){const[t,i]=this._driveForPath(e);return t.delete(i)}rename(e,t){const[i,n]=this._driveForPath(e),[s,r]=this._driveForPath(t);if(i!==s)throw Error("ContentsManager: renaming files must occur within a Drive");return i.rename(n,r).then((e=>({...e,path:this._toGlobalPath(i,r),serverPath:e.path})))}save(e,t={}){const i=this.normalize(e),[n,s]=this._driveForPath(e);return n.save(s,{...t,path:s}).then((e=>({...e,path:i,serverPath:e.path})))}copy(e,t){const[i,n]=this._driveForPath(e),[s,r]=this._driveForPath(t);if(i===s)return i.copy(n,r).then((e=>({...e,path:this._toGlobalPath(i,e.path),serverPath:e.path})));throw Error("Copying files between drives is not currently implemented")}createCheckpoint(e){const[t,i]=this._driveForPath(e);return t.createCheckpoint(i)}listCheckpoints(e){const[t,i]=this._driveForPath(e);return t.listCheckpoints(i)}restoreCheckpoint(e,t){const[i,n]=this._driveForPath(e);return i.restoreCheckpoint(n,t)}deleteCheckpoint(e,t){const[i,n]=this._driveForPath(e);return i.deleteCheckpoint(n,t)}_toGlobalPath(e,t){return e===this._defaultDrive?o.PathExt.removeSlash(t):`${e.name}:${o.PathExt.removeSlash(t)}`}_driveForPath(e){const t=this.driveName(e),i=this.localPath(e);return t?[this._additionalDrives.get(t),i]:[this._defaultDrive,i]}_onFileChanged(e,t){var i,n;if(e===this._defaultDrive)this._fileChanged.emit(t);else{let s=null,r=null;(null===(i=t.newValue)||void 0===i?void 0:i.path)&&(s={...t.newValue,path:this._toGlobalPath(e,t.newValue.path)}),(null===(n=t.oldValue)||void 0===n?void 0:n.path)&&(r={...t.oldValue,path:this._toGlobalPath(e,t.oldValue.path)}),this._fileChanged.emit({type:t.type,newValue:s,oldValue:r})}}};class u{constructor(e={}){var t,i,n;this._isDisposed=!1,this._fileChanged=new a.Signal(this),this.name=null!==(t=e.name)&&void 0!==t?t:"Default",this._apiEndpoint=null!==(i=e.apiEndpoint)&&void 0!==i?i:"api/contents",this.serverSettings=null!==(n=e.serverSettings)&&void 0!==n?n:l.ServerConnection.makeSettings()}get fileChanged(){return this._fileChanged}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,a.Signal.clearData(this))}async get(e,t){let i=this._getUrl(e);if(t){"notebook"===t.type&&delete t.format;const e=t.content?"1":"0",n={...t,content:e};i+=o.URLExt.objectToQueryString(n)}const n=this.serverSettings,s=await l.ServerConnection.makeRequest(i,{},n);if(200!==s.status)throw await l.ServerConnection.ResponseError.create(s);const r=await s.json();return h.validateContentsModel(r),r}getDownloadUrl(e){const t=this.serverSettings.baseUrl;let i=o.URLExt.join(t,"files",o.URLExt.encodeParts(e));const n=document.cookie.match("\\b_xsrf=([^;]*)\\b");if(n){const e=new URL(i);e.searchParams.append("_xsrf",n[1]),i=e.toString()}return Promise.resolve(i)}async newUntitled(e={}){var t;let i="{}";e&&(e.ext&&(e.ext=c.normalizeExtension(e.ext)),i=JSON.stringify(e));const n=this.serverSettings,s=this._getUrl(null!==(t=e.path)&&void 0!==t?t:""),r={method:"POST",body:i},o=await l.ServerConnection.makeRequest(s,r,n);if(201!==o.status)throw await l.ServerConnection.ResponseError.create(o);const a=await o.json();return h.validateContentsModel(a),this._fileChanged.emit({type:"new",oldValue:null,newValue:a}),a}async delete(e){const t=this._getUrl(e),i=this.serverSettings,n=await l.ServerConnection.makeRequest(t,{method:"DELETE"},i);if(204!==n.status)throw await l.ServerConnection.ResponseError.create(n);this._fileChanged.emit({type:"delete",oldValue:{path:e},newValue:null})}async rename(e,t){const i=this.serverSettings,n=this._getUrl(e),s={method:"PATCH",body:JSON.stringify({path:t})},r=await l.ServerConnection.makeRequest(n,s,i);if(200!==r.status)throw await l.ServerConnection.ResponseError.create(r);const o=await r.json();return h.validateContentsModel(o),this._fileChanged.emit({type:"rename",oldValue:{path:e},newValue:o}),o}async save(e,t={}){const i=this.serverSettings,n=this._getUrl(e),s={method:"PUT",body:JSON.stringify(t)},r=await l.ServerConnection.makeRequest(n,s,i);if(200!==r.status&&201!==r.status)throw await l.ServerConnection.ResponseError.create(r);const o=await r.json();return h.validateContentsModel(o),this._fileChanged.emit({type:"save",oldValue:null,newValue:o}),o}async copy(e,t){const i=this.serverSettings,n=this._getUrl(t),s={method:"POST",body:JSON.stringify({copy_from:e})},r=await l.ServerConnection.makeRequest(n,s,i);if(201!==r.status)throw await l.ServerConnection.ResponseError.create(r);const o=await r.json();return h.validateContentsModel(o),this._fileChanged.emit({type:"new",oldValue:null,newValue:o}),o}async createCheckpoint(e){const t=this._getUrl(e,"checkpoints"),i=await l.ServerConnection.makeRequest(t,{method:"POST"},this.serverSettings);if(201!==i.status)throw await l.ServerConnection.ResponseError.create(i);const n=await i.json();return h.validateCheckpointModel(n),n}async listCheckpoints(e){const t=this._getUrl(e,"checkpoints"),i=await l.ServerConnection.makeRequest(t,{},this.serverSettings);if(200!==i.status)throw await l.ServerConnection.ResponseError.create(i);const n=await i.json();if(!Array.isArray(n))throw new Error("Invalid Checkpoint list");for(let e=0;eo.URLExt.encodeParts(e))),i=this.serverSettings.baseUrl;return o.URLExt.join(i,this._apiEndpoint,...t)}}t.Drive=u,function(e){e.normalizeExtension=function(e){return e.length>0&&0!==e.indexOf(".")&&(e=`.${e}`),e}}(c||(c={}))},3394:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateCheckpointModel=t.validateContentsModel=void 0;const n=i(3247);t.validateContentsModel=function(e){(0,n.validateProperty)(e,"name","string"),(0,n.validateProperty)(e,"path","string"),(0,n.validateProperty)(e,"type","string"),(0,n.validateProperty)(e,"created","string"),(0,n.validateProperty)(e,"last_modified","string"),(0,n.validateProperty)(e,"mimetype","object"),(0,n.validateProperty)(e,"content","object"),(0,n.validateProperty)(e,"format","object")},t.validateCheckpointModel=function(e){(0,n.validateProperty)(e,"id","string"),(0,n.validateProperty)(e,"last_modified","string")}},5657:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EventManager=void 0;const n=i(4251),s=i(9044),r=i(6424),o=i(538),a="api/events";t.EventManager=class{constructor(e={}){var t;this._socket=null,this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:o.ServerConnection.makeSettings(),this._poll=new s.Poll({factory:()=>this._subscribe()}),this._stream=new r.Stream(this),this._poll.start()}get isDisposed(){return this._poll.isDisposed}get stream(){return this._stream}dispose(){if(this.isDisposed)return;this._poll.dispose();const e=this._socket;e&&(this._socket=null,e.onopen=()=>{},e.onerror=()=>{},e.onmessage=()=>{},e.onclose=()=>{},e.close()),r.Signal.clearData(this),this._stream.stop()}async emit(e){const{serverSettings:t}=this,{baseUrl:i,token:s}=t,{makeRequest:r,ResponseError:l}=o.ServerConnection,h=n.URLExt.join(i,a)+(s?`?token=${s}`:""),c={body:JSON.stringify(e),method:"POST"},d=await r(h,c,t);if(204!==d.status)throw new l(d)}_subscribe(){return new Promise(((e,t)=>{if(this.isDisposed)return;const{token:i,WebSocket:s,wsUrl:r}=this.serverSettings,o=n.URLExt.join(r,a,"subscribe")+(i?`?token=${encodeURIComponent(i)}`:""),l=this._socket=new s(o),h=this._stream;l.onclose=()=>t(new Error("EventManager socket closed")),l.onmessage=e=>e.data&&h.emit(JSON.parse(e.data))}))}}},5247:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),s(i(7524),t),s(i(7302),t),s(i(1708),t),s(i(5657),t),s(i(5674),t),s(i(3490),t),s(i(7797),t),s(i(538),t),s(i(3561),t),s(i(9188),t),s(i(3185),t),s(i(1014),t),s(i(9090),t),s(i(6624),t)},8341:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.CommHandler=void 0;const o=i(1122),a=r(i(1736));class l extends o.DisposableDelegate{constructor(e,t,i,n){super(n),this._target="",this._id="",this._id=t,this._target=e,this._kernel=i}get commId(){return this._id}get targetName(){return this._target}get onClose(){return this._onClose}set onClose(e){this._onClose=e}get onMsg(){return this._onMsg}set onMsg(e){this._onMsg=e}open(e,t,i=[]){if(this.isDisposed||this._kernel.isDisposed)throw new Error("Cannot open");const n=a.createMessage({msgType:"comm_open",channel:"shell",username:this._kernel.username,session:this._kernel.clientId,content:{comm_id:this._id,target_name:this._target,data:null!=e?e:{}},metadata:t,buffers:i});return this._kernel.sendShellMessage(n,!1,!0)}send(e,t,i=[],n=!0){if(this.isDisposed||this._kernel.isDisposed)throw new Error("Cannot send");const s=a.createMessage({msgType:"comm_msg",channel:"shell",username:this._kernel.username,session:this._kernel.clientId,content:{comm_id:this._id,data:e},metadata:t,buffers:i});return this._kernel.sendShellMessage(s,!1,n)}close(e,t,i=[]){if(this.isDisposed||this._kernel.isDisposed)throw new Error("Cannot close");const n=a.createMessage({msgType:"comm_close",channel:"shell",username:this._kernel.username,session:this._kernel.clientId,content:{comm_id:this._id,data:null!=e?e:{}},metadata:t,buffers:i}),s=this._kernel.sendShellMessage(n,!1,!0),r=this._onClose;return r&&r(a.createMessage({msgType:"comm_close",channel:"iopub",username:this._kernel.username,session:this._kernel.clientId,content:{comm_id:this._id,data:null!=e?e:{}},metadata:t,buffers:i})),this.dispose(),s}}t.CommHandler=l},5306:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.KernelConnection=void 0;const o=i(4251),a=i(3911),l=i(6424),h=i(5247),c=i(8341),d=r(i(1736)),u=i(217),p=i(8206),f=r(i(776)),m=i(3490),g=r(i(9753)),v="_RESTARTING_";class O{constructor(e){var t,i,n,s;this._createSocket=(e=!0)=>{this._errorIfDisposed(),this._clearSocket(),this._updateConnectionStatus("connecting");const t=this.serverSettings,i=o.URLExt.join(t.wsUrl,g.KERNEL_SERVICE_URL,encodeURIComponent(this._id)),n=i.replace(/^((?:\w+:)?\/\/)(?:[^@\/]+@)/,"$1");console.debug(`Starting WebSocket: ${n}`);let s=o.URLExt.join(i,"channels?session_id="+encodeURIComponent(this._clientId));const r=t.token;t.appendToken&&""!==r&&(s+=`&token=${encodeURIComponent(r)}`);const a=e?this._supportedProtocols:[];this._ws=new t.WebSocket(s,a),this._ws.binaryType="arraybuffer";let l=!1;const c=async e=>{var i,n;if(!this._isDisposed){this._reason="",this._model=void 0;try{const i=await g.getKernelModel(this._id,t);this._model=i,"dead"===(null==i?void 0:i.execution_state)?this._updateStatus("dead"):this._onWSClose(e)}catch(t){if(t instanceof h.ServerConnection.NetworkError||503===(null===(i=t.response)||void 0===i?void 0:i.status)||424===(null===(n=t.response)||void 0===n?void 0:n.status)){const t=1e3*b.getRandomIntInclusive(10,30);setTimeout(c,t,e)}else this._reason="Kernel died unexpectedly",this._updateStatus("dead")}}},d=async e=>{l||(l=!0,await c(e))};this._ws.onmessage=this._onWSMessage,this._ws.onopen=this._onWSOpen,this._ws.onclose=d,this._ws.onerror=d},this._onWSOpen=e=>{if(""!==this._ws.protocol&&!this._supportedProtocols.includes(this._ws.protocol))throw console.log("Server selected unknown kernel wire protocol:",this._ws.protocol),this._updateStatus("dead"),new Error(`Unknown kernel wire protocol: ${this._ws.protocol}`);this._selectedProtocol=this._ws.protocol,this._ws.onclose=this._onWSClose,this._ws.onerror=this._onWSClose,this._updateConnectionStatus("connected")},this._onWSMessage=e=>{let t;try{t=(0,p.deserialize)(e.data,this._ws.protocol),f.validateMessage(t)}catch(e){throw e.message=`Kernel message validation error: ${e.message}`,e}this._kernelSession=t.header.session,this._msgChain=this._msgChain.then((()=>this._handleMessage(t))).catch((e=>{e.message.startsWith("Canceled future for ")&&console.error(e)})),this._anyMessage.emit({msg:t,direction:"recv"})},this._onWSClose=e=>{this.isDisposed||this._reconnect()},this._id="",this._name="",this._status="unknown",this._connectionStatus="connecting",this._kernelSession="",this._isDisposed=!1,this._ws=null,this._username="",this._reconnectLimit=7,this._reconnectAttempt=0,this._reconnectTimeout=null,this._supportedProtocols=Object.values(d.supportedKernelWebSocketProtocols),this._selectedProtocol="",this._futures=new Map,this._comms=new Map,this._targetRegistry=Object.create(null),this._info=new a.PromiseDelegate,this._pendingMessages=[],this._statusChanged=new l.Signal(this),this._connectionStatusChanged=new l.Signal(this),this._disposed=new l.Signal(this),this._iopubMessage=new l.Signal(this),this._anyMessage=new l.Signal(this),this._pendingInput=new l.Signal(this),this._unhandledMessage=new l.Signal(this),this._displayIdToParentIds=new Map,this._msgIdToDisplayIds=new Map,this._msgChain=Promise.resolve(),this._hasPendingInput=!1,this._reason="",this._noOp=()=>{},this._name=e.model.name,this._id=e.model.id,this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:h.ServerConnection.makeSettings(),this._clientId=null!==(i=e.clientId)&&void 0!==i?i:a.UUID.uuid4(),this._username=null!==(n=e.username)&&void 0!==n?n:"",this.handleComms=null===(s=e.handleComms)||void 0===s||s,this._createSocket()}get disposed(){return this._disposed}get statusChanged(){return this._statusChanged}get connectionStatusChanged(){return this._connectionStatusChanged}get iopubMessage(){return this._iopubMessage}get unhandledMessage(){return this._unhandledMessage}get model(){return this._model||{id:this.id,name:this.name,reason:this._reason}}get anyMessage(){return this._anyMessage}get pendingInput(){return this._pendingInput}get id(){return this._id}get name(){return this._name}get username(){return this._username}get clientId(){return this._clientId}get status(){return this._status}get connectionStatus(){return this._connectionStatus}get isDisposed(){return this._isDisposed}get info(){return this._info.promise}get spec(){return this._specPromise||(this._specPromise=m.KernelSpecAPI.getSpecs(this.serverSettings).then((e=>e.kernelspecs[this._name]))),this._specPromise}clone(e={}){return new O({model:this.model,username:this.username,serverSettings:this.serverSettings,handleComms:!1,...e})}dispose(){this.isDisposed||(this._isDisposed=!0,this._disposed.emit(),this._updateConnectionStatus("disconnected"),this._clearKernelState(),this._pendingMessages=[],this._clearSocket(),l.Signal.clearData(this))}sendShellMessage(e,t=!1,i=!0){return this._sendKernelShellControl(u.KernelShellFutureHandler,e,t,i)}sendControlMessage(e,t=!1,i=!0){return this._sendKernelShellControl(u.KernelControlFutureHandler,e,t,i)}_sendKernelShellControl(e,t,i=!1,n=!0){this._sendMessage(t),this._anyMessage.emit({msg:t,direction:"send"});const s=new e((()=>{const e=t.header.msg_id;this._futures.delete(e);const i=this._msgIdToDisplayIds.get(e);i&&(i.forEach((t=>{const i=this._displayIdToParentIds.get(t);if(i){const n=i.indexOf(e);if(-1===n)return;1===i.length?this._displayIdToParentIds.delete(t):(i.splice(n,1),this._displayIdToParentIds.set(t,i))}})),this._msgIdToDisplayIds.delete(e))}),t,i,n,this);return this._futures.set(t.header.msg_id,s),s}_sendMessage(e,t=!0){if("dead"===this.status)throw new Error("Kernel is dead");if((""===this._kernelSession||this._kernelSession===v)&&d.isInfoRequestMsg(e)){if("connected"===this.connectionStatus)return void this._ws.send((0,p.serialize)(e,this._ws.protocol));throw new Error("Could not send message: status is not connected")}if(t&&this._pendingMessages.length>0)this._pendingMessages.push(e);else if("connected"===this.connectionStatus&&this._kernelSession!==v)this._ws.send((0,p.serialize)(e,this._ws.protocol));else{if(!t)throw new Error("Could not send message");this._pendingMessages.push(e)}}async interrupt(){if(this.hasPendingInput=!1,"dead"===this.status)throw new Error("Kernel is dead");return g.interruptKernel(this.id,this.serverSettings)}async restart(){if("dead"===this.status)throw new Error("Kernel is dead");this._updateStatus("restarting"),this._clearKernelState(),this._kernelSession=v,await g.restartKernel(this.id,this.serverSettings),await this.reconnect(),this.hasPendingInput=!1}reconnect(){this._errorIfDisposed();const e=new a.PromiseDelegate,t=(i,n)=>{"connected"===n?(e.resolve(),this.connectionStatusChanged.disconnect(t,this)):"disconnected"===n&&(e.reject(new Error("Kernel connection disconnected")),this.connectionStatusChanged.disconnect(t,this))};return this.connectionStatusChanged.connect(t,this),this._reconnectAttempt=0,this._reconnect(),e.promise}async shutdown(){"dead"!==this.status&&await g.shutdownKernel(this.id,this.serverSettings),this.handleShutdown()}handleShutdown(){this._updateStatus("dead"),this.dispose()}async requestKernelInfo(){const e=d.createMessage({msgType:"kernel_info_request",channel:"shell",username:this._username,session:this._clientId,content:{}});let t;try{t=await b.handleShellMessage(this,e)}catch(e){if(this.isDisposed)return;throw e}if(this._errorIfDisposed(),t)return void 0===t.content.status&&(t.content.status="ok"),"ok"!==t.content.status?(this._info.reject("Kernel info reply errored"),t):(this._info.resolve(t.content),this._kernelSession=t.header.session,t)}requestComplete(e){const t=d.createMessage({msgType:"complete_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}requestInspect(e){const t=d.createMessage({msgType:"inspect_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}requestHistory(e){const t=d.createMessage({msgType:"history_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}requestExecute(e,t=!0,i){const n=d.createMessage({msgType:"execute_request",channel:"shell",username:this._username,session:this._clientId,content:{silent:!1,store_history:!0,user_expressions:{},allow_stdin:!0,stop_on_error:!1,...e},metadata:i});return this.sendShellMessage(n,!0,t)}requestDebug(e,t=!0){const i=d.createMessage({msgType:"debug_request",channel:"control",username:this._username,session:this._clientId,content:e});return this.sendControlMessage(i,!0,t)}requestIsComplete(e){const t=d.createMessage({msgType:"is_complete_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}requestCommInfo(e){const t=d.createMessage({msgType:"comm_info_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}sendInputReply(e,t){const i=d.createMessage({msgType:"input_reply",channel:"stdin",username:this._username,session:this._clientId,content:e});i.parent_header=t,this._sendMessage(i),this._anyMessage.emit({msg:i,direction:"send"}),this.hasPendingInput=!1}createComm(e,t=a.UUID.uuid4()){if(!this.handleComms)throw new Error("Comms are disabled on this kernel connection");if(this._comms.has(t))throw new Error("Comm is already created");const i=new c.CommHandler(e,t,this,(()=>{this._unregisterComm(t)}));return this._comms.set(t,i),i}hasComm(e){return this._comms.has(e)}registerCommTarget(e,t){this.handleComms&&(this._targetRegistry[e]=t)}removeCommTarget(e,t){this.handleComms&&(this.isDisposed||this._targetRegistry[e]!==t||delete this._targetRegistry[e])}registerMessageHook(e,t){var i;const n=null===(i=this._futures)||void 0===i?void 0:i.get(e);n&&n.registerMessageHook(t)}removeMessageHook(e,t){var i;const n=null===(i=this._futures)||void 0===i?void 0:i.get(e);n&&n.removeMessageHook(t)}removeInputGuard(){this.hasPendingInput=!1}async _handleDisplayId(e,t){var i,n;const s=t.parent_header.msg_id;let r=this._displayIdToParentIds.get(e);if(r){const e={header:a.JSONExt.deepCopy(t.header),parent_header:a.JSONExt.deepCopy(t.parent_header),metadata:a.JSONExt.deepCopy(t.metadata),content:a.JSONExt.deepCopy(t.content),channel:t.channel,buffers:t.buffers?t.buffers.slice():[]};e.header.msg_type="update_display_data",await Promise.all(r.map((async t=>{const i=this._futures&&this._futures.get(t);i&&await i.handleMsg(e)})))}if("update_display_data"===t.header.msg_type)return!0;r=null!==(i=this._displayIdToParentIds.get(e))&&void 0!==i?i:[],-1===r.indexOf(s)&&r.push(s),this._displayIdToParentIds.set(e,r);const o=null!==(n=this._msgIdToDisplayIds.get(s))&&void 0!==n?n:[];return-1===o.indexOf(s)&&o.push(s),this._msgIdToDisplayIds.set(s,o),!1}_clearSocket(){null!==this._ws&&(this._ws.onopen=this._noOp,this._ws.onclose=this._noOp,this._ws.onerror=this._noOp,this._ws.onmessage=this._noOp,this._ws.close(),this._ws=null)}_updateStatus(e){this._status!==e&&"dead"!==this._status&&(this._status=e,b.logKernelStatus(this),this._statusChanged.emit(e),"dead"===e&&this.dispose())}_sendPending(){for(;"connected"===this.connectionStatus&&this._kernelSession!==v&&this._pendingMessages.length>0;)this._sendMessage(this._pendingMessages[0],!1),this._pendingMessages.shift()}_clearKernelState(){this._kernelSession="",this._pendingMessages=[],this._futures.forEach((e=>{e.dispose()})),this._comms.forEach((e=>{e.dispose()})),this._msgChain=Promise.resolve(),this._futures=new Map,this._comms=new Map,this._displayIdToParentIds.clear(),this._msgIdToDisplayIds.clear()}_assertCurrentMessage(e){if(this._errorIfDisposed(),e.header.session!==this._kernelSession)throw new Error(`Canceling handling of old message: ${e.header.msg_type}`)}async _handleCommOpen(e){this._assertCurrentMessage(e);const t=e.content,i=new c.CommHandler(t.target_name,t.comm_id,this,(()=>{this._unregisterComm(t.comm_id)}));this._comms.set(t.comm_id,i);try{const n=await b.loadObject(t.target_name,t.target_module,this._targetRegistry);await n(i,e)}catch(e){throw i.close(),console.error("Exception opening new comm"),e}}async _handleCommClose(e){this._assertCurrentMessage(e);const t=e.content,i=this._comms.get(t.comm_id);if(!i)return void console.error("Comm not found for comm id "+t.comm_id);this._unregisterComm(i.commId);const n=i.onClose;n&&await n(e),i.dispose()}async _handleCommMsg(e){this._assertCurrentMessage(e);const t=e.content,i=this._comms.get(t.comm_id);if(!i)return;const n=i.onMsg;n&&await n(e)}_unregisterComm(e){this._comms.delete(e)}_updateConnectionStatus(e){if(this._connectionStatus!==e){if(this._connectionStatus=e,"connecting"!==e&&(this._reconnectAttempt=0,clearTimeout(this._reconnectTimeout)),"dead"!==this.status)if("connected"===e){let e=this._kernelSession===v,t=this.requestKernelInfo(),i=!1,n=()=>{i||(i=!0,e&&this._kernelSession===v&&(this._kernelSession=""),clearTimeout(s),this._pendingMessages.length>0&&this._sendPending())};t.then(n);let s=setTimeout(n,3e3)}else this._updateStatus("unknown");this._connectionStatusChanged.emit(e)}}async _handleMessage(e){var t,i;let n=!1;if(e.parent_header&&"iopub"===e.channel&&(d.isDisplayDataMsg(e)||d.isUpdateDisplayDataMsg(e)||d.isExecuteResultMsg(e))){const i=(null!==(t=e.content.transient)&&void 0!==t?t:{}).display_id;i&&(n=await this._handleDisplayId(i,e),this._assertCurrentMessage(e))}if(!n&&e.parent_header){const t=e.parent_header,n=null===(i=this._futures)||void 0===i?void 0:i.get(t.msg_id);if(n)await n.handleMsg(e),this._assertCurrentMessage(e);else{const i=t.session===this.clientId;"iopub"!==e.channel&&i&&this._unhandledMessage.emit(e)}}if("iopub"===e.channel){switch(e.header.msg_type){case"status":{const t=e.content.execution_state;"restarting"===t&&Promise.resolve().then((async()=>{this._updateStatus("autorestarting"),this._clearKernelState(),await this.reconnect()})),this._updateStatus(t);break}case"comm_open":this.handleComms&&await this._handleCommOpen(e);break;case"comm_msg":this.handleComms&&await this._handleCommMsg(e);break;case"comm_close":this.handleComms&&await this._handleCommClose(e)}this.isDisposed||(this._assertCurrentMessage(e),this._iopubMessage.emit(e))}}_reconnect(){if(this._errorIfDisposed(),clearTimeout(this._reconnectTimeout),this._reconnectAttempt{if(t){if("undefined"==typeof requirejs)throw new Error("requirejs not found");requirejs([t],(i=>{void 0===i[e]?s(new Error(`Object '${e}' not found in module '${t}'`)):n(i[e])}),s)}else(null==i?void 0:i[e])?n(i[e]):s(new Error(`Object '${e}' not found in registry`))}))},e.getRandomIntInclusive=function(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e+1))+e}}(b||(b={}))},217:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.KernelShellFutureHandler=t.KernelControlFutureHandler=t.KernelFutureHandler=void 0;const o=i(3911),a=i(1122),l=r(i(1736));class h extends a.DisposableDelegate{constructor(e,t,i,n,s){super(e),this._status=0,this._stdin=c.noOp,this._iopub=c.noOp,this._reply=c.noOp,this._done=new o.PromiseDelegate,this._hooks=new c.HookList,this._disposeOnDone=!0,this._msg=t,i||this._setFlag(c.KernelFutureFlag.GotReply),this._disposeOnDone=n,this._kernel=s}get msg(){return this._msg}get done(){return this._done.promise}get onReply(){return this._reply}set onReply(e){this._reply=e}get onIOPub(){return this._iopub}set onIOPub(e){this._iopub=e}get onStdin(){return this._stdin}set onStdin(e){this._stdin=e}registerMessageHook(e){if(this.isDisposed)throw new Error("Kernel future is disposed");this._hooks.add(e)}removeMessageHook(e){this.isDisposed||this._hooks.remove(e)}sendInputReply(e,t){this._kernel.sendInputReply(e,t)}dispose(){this._stdin=c.noOp,this._iopub=c.noOp,this._reply=c.noOp,this._hooks=null,this._testFlag(c.KernelFutureFlag.IsDone)||(this._done.promise.catch((()=>{})),this._done.reject(new Error(`Canceled future for ${this.msg.header.msg_type} message before replies were done`))),super.dispose()}async handleMsg(e){switch(e.channel){case"control":case"shell":e.channel===this.msg.channel&&e.parent_header.msg_id===this.msg.header.msg_id&&await this._handleReply(e);break;case"stdin":await this._handleStdin(e);break;case"iopub":await this._handleIOPub(e)}}async _handleReply(e){const t=this._reply;t&&await t(e),this._replyMsg=e,this._setFlag(c.KernelFutureFlag.GotReply),this._testFlag(c.KernelFutureFlag.GotIdle)&&this._handleDone()}async _handleStdin(e){this._kernel.hasPendingInput=!0;const t=this._stdin;t&&await t(e)}async _handleIOPub(e){const t=await this._hooks.process(e),i=this._iopub;t&&i&&await i(e),l.isStatusMsg(e)&&"idle"===e.content.execution_state&&(this._setFlag(c.KernelFutureFlag.GotIdle),this._testFlag(c.KernelFutureFlag.GotReply)&&this._handleDone())}_handleDone(){this._testFlag(c.KernelFutureFlag.IsDone)||(this._setFlag(c.KernelFutureFlag.IsDone),this._done.resolve(this._replyMsg),this._disposeOnDone&&this.dispose())}_testFlag(e){return 0!=(this._status&e)}_setFlag(e){this._status|=e}}var c;t.KernelFutureHandler=h,t.KernelControlFutureHandler=class extends h{},t.KernelShellFutureHandler=class extends h{},function(e){e.noOp=()=>{};const t="function"==typeof requestAnimationFrame?requestAnimationFrame:setImmediate;let i;e.HookList=class{constructor(){this._hooks=[]}add(e){this.remove(e),this._hooks.push(e)}remove(e){const t=this._hooks.indexOf(e);t>=0&&(this._hooks[t]=null,this._scheduleCompact())}async process(e){await this._processing;const t=new o.PromiseDelegate;let i;this._processing=t.promise;for(let n=this._hooks.length-1;n>=0;n--){const s=this._hooks[n];if(null!==s){try{i=await s(e)}catch(e){i=!0,console.error(e)}if(!1===i)return t.resolve(void 0),!1}}return t.resolve(void 0),!0}_scheduleCompact(){this._compactScheduled||(this._compactScheduled=!0,t((()=>{this._processing=this._processing.then((()=>{this._compactScheduled=!1,this._compact()}))})))}_compact(){let e=0;for(let t=0,i=this._hooks.length;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2298:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.KernelManager=void 0;const n=i(9044),s=i(6424),r=i(5247),o=i(7524),a=i(9753),l=i(5306);class h extends o.BaseManager{constructor(e={}){var t;super(e),this._isReady=!1,this._kernelConnections=new Set,this._models=new Map,this._runningChanged=new s.Signal(this),this._connectionFailure=new s.Signal(this),this._pollModels=new n.Poll({auto:!1,factory:()=>this.requestRunning(),frequency:{interval:1e4,backoff:!0,max:3e5},name:"@jupyterlab/services:KernelManager#models",standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this._ready=(async()=>{await this._pollModels.start(),await this._pollModels.tick,this._isReady=!0})()}get isReady(){return this._isReady}get ready(){return this._ready}get runningChanged(){return this._runningChanged}get connectionFailure(){return this._connectionFailure}dispose(){this.isDisposed||(this._models.clear(),this._kernelConnections.forEach((e=>e.dispose())),this._pollModels.dispose(),super.dispose())}connectTo(e){var t;const{id:i}=e.model;let n=null===(t=e.handleComms)||void 0===t||t;if(void 0===e.handleComms)for(const e of this._kernelConnections)if(e.id===i&&e.handleComms){n=!1;break}const s=new l.KernelConnection({handleComms:n,...e,serverSettings:this.serverSettings});return this._onStarted(s),this._models.has(i)||this.refreshRunning().catch((()=>{})),s}running(){return this._models.values()}async refreshRunning(){await this._pollModels.refresh(),await this._pollModels.tick}async startNew(e={},t={}){const i=await(0,a.startNew)(e,this.serverSettings);return this.connectTo({...t,model:i})}async shutdown(e){await(0,a.shutdownKernel)(e,this.serverSettings),await this.refreshRunning()}async shutdownAll(){await this.refreshRunning(),await Promise.all([...this._models.keys()].map((e=>(0,a.shutdownKernel)(e,this.serverSettings)))),await this.refreshRunning()}async findById(e){return this._models.has(e)||await this.refreshRunning(),this._models.get(e)}async requestRunning(){var e,t;let i;try{i=await(0,a.listRunning)(this.serverSettings)}catch(i){throw(i instanceof r.ServerConnection.NetworkError||503===(null===(e=i.response)||void 0===e?void 0:e.status)||424===(null===(t=i.response)||void 0===t?void 0:t.status))&&this._connectionFailure.emit(i),i}this.isDisposed||this._models.size===i.length&&i.every((e=>{const t=this._models.get(e.id);return!!t&&t.connections===e.connections&&t.execution_state===e.execution_state&&t.last_activity===e.last_activity&&t.name===e.name&&t.reason===e.reason&&t.traceback===e.traceback}))||(this._models=new Map(i.map((e=>[e.id,e]))),this._kernelConnections.forEach((e=>{this._models.has(e.id)||e.handleShutdown()})),this._runningChanged.emit(i))}_onStarted(e){this._kernelConnections.add(e),e.statusChanged.connect(this._onStatusChanged,this),e.disposed.connect(this._onDisposed,this)}_onDisposed(e){this._kernelConnections.delete(e),this.refreshRunning().catch((()=>{}))}_onStatusChanged(e,t){"dead"===t&&this.refreshRunning().catch((()=>{}))}}t.KernelManager=h,function(e){e.NoopManager=class extends e{constructor(){super(...arguments),this._readyPromise=new Promise((()=>{}))}get isActive(){return!1}get parentReady(){return super.ready}async startNew(e={},t={}){return Promise.reject(new Error("Not implemented in no-op Kernel Manager"))}connectTo(e){throw new Error("Not implemented in no-op Kernel Manager")}async shutdown(e){return Promise.reject(new Error("Not implemented in no-op Kernel Manager"))}get ready(){return this.parentReady.then((()=>this._readyPromise))}async requestRunning(){return Promise.resolve()}}}(h=t.KernelManager||(t.KernelManager={}))},1736:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.supportedKernelWebSocketProtocols=t.isInputReplyMsg=t.isInputRequestMsg=t.isDebugReplyMsg=t.isDebugRequestMsg=t.isExecuteReplyMsg=t.isInfoRequestMsg=t.isCommMsgMsg=t.isCommCloseMsg=t.isCommOpenMsg=t.isDebugEventMsg=t.isClearOutputMsg=t.isStatusMsg=t.isErrorMsg=t.isExecuteResultMsg=t.isExecuteInputMsg=t.isUpdateDisplayDataMsg=t.isDisplayDataMsg=t.isStreamMsg=t.createMessage=void 0;const n=i(3911);t.createMessage=function(e){var t,i,s,r,o;return{buffers:null!==(t=e.buffers)&&void 0!==t?t:[],channel:e.channel,content:e.content,header:{date:(new Date).toISOString(),msg_id:null!==(i=e.msgId)&&void 0!==i?i:n.UUID.uuid4(),msg_type:e.msgType,session:e.session,username:null!==(s=e.username)&&void 0!==s?s:"",version:"5.2"},metadata:null!==(r=e.metadata)&&void 0!==r?r:{},parent_header:null!==(o=e.parentHeader)&&void 0!==o?o:{}}},t.isStreamMsg=function(e){return"stream"===e.header.msg_type},t.isDisplayDataMsg=function(e){return"display_data"===e.header.msg_type},t.isUpdateDisplayDataMsg=function(e){return"update_display_data"===e.header.msg_type},t.isExecuteInputMsg=function(e){return"execute_input"===e.header.msg_type},t.isExecuteResultMsg=function(e){return"execute_result"===e.header.msg_type},t.isErrorMsg=function(e){return"error"===e.header.msg_type},t.isStatusMsg=function(e){return"status"===e.header.msg_type},t.isClearOutputMsg=function(e){return"clear_output"===e.header.msg_type},t.isDebugEventMsg=function(e){return"debug_event"===e.header.msg_type},t.isCommOpenMsg=function(e){return"comm_open"===e.header.msg_type},t.isCommCloseMsg=function(e){return"comm_close"===e.header.msg_type},t.isCommMsgMsg=function(e){return"comm_msg"===e.header.msg_type},t.isInfoRequestMsg=function(e){return"kernel_info_request"===e.header.msg_type},t.isExecuteReplyMsg=function(e){return"execute_reply"===e.header.msg_type},t.isDebugRequestMsg=function(e){return"debug_request"===e.header.msg_type},t.isDebugReplyMsg=function(e){return"debug_reply"===e.header.msg_type},t.isInputRequestMsg=function(e){return"input_request"===e.header.msg_type},t.isInputReplyMsg=function(e){return"input_reply"===e.header.msg_type},(t.supportedKernelWebSocketProtocols||(t.supportedKernelWebSocketProtocols={})).v1KernelWebsocketJupyterOrg="v1.kernel.websocket.jupyter.org"},9753:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getKernelModel=t.shutdownKernel=t.interruptKernel=t.restartKernel=t.startNew=t.listRunning=t.KERNEL_SERVICE_URL=void 0;const n=i(538),s=i(4251),r=i(776);t.KERNEL_SERVICE_URL="api/kernels",t.listRunning=async function(e=n.ServerConnection.makeSettings()){const i=s.URLExt.join(e.baseUrl,t.KERNEL_SERVICE_URL),o=await n.ServerConnection.makeRequest(i,{},e);if(200!==o.status)throw await n.ServerConnection.ResponseError.create(o);const a=await o.json();return(0,r.validateModels)(a),a},t.startNew=async function(e={},i=n.ServerConnection.makeSettings()){const o=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL),a={method:"POST",body:JSON.stringify(e)},l=await n.ServerConnection.makeRequest(o,a,i);if(201!==l.status)throw await n.ServerConnection.ResponseError.create(l);const h=await l.json();return(0,r.validateModel)(h),h},t.restartKernel=async function(e,i=n.ServerConnection.makeSettings()){const o=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL,encodeURIComponent(e),"restart"),a=await n.ServerConnection.makeRequest(o,{method:"POST"},i);if(200!==a.status)throw await n.ServerConnection.ResponseError.create(a);const l=await a.json();(0,r.validateModel)(l)},t.interruptKernel=async function(e,i=n.ServerConnection.makeSettings()){const r=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL,encodeURIComponent(e),"interrupt"),o=await n.ServerConnection.makeRequest(r,{method:"POST"},i);if(204!==o.status)throw await n.ServerConnection.ResponseError.create(o)},t.shutdownKernel=async function(e,i=n.ServerConnection.makeSettings()){const r=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL,encodeURIComponent(e)),o=await n.ServerConnection.makeRequest(r,{method:"DELETE"},i);if(404===o.status){const t=`The kernel "${e}" does not exist on the server`;console.warn(t)}else if(204!==o.status)throw await n.ServerConnection.ResponseError.create(o)},t.getKernelModel=async function(e,i=n.ServerConnection.makeSettings()){const o=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL,encodeURIComponent(e)),a=await n.ServerConnection.makeRequest(o,{},i);if(404===a.status)return;if(200!==a.status)throw await n.ServerConnection.ResponseError.create(a);const l=await a.json();return(0,r.validateModel)(l),l}},8206:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.deserialize=t.serialize=void 0;const o=r(i(1736));var a;t.serialize=function(e,t=""){return t===o.supportedKernelWebSocketProtocols.v1KernelWebsocketJupyterOrg?a.serializeV1KernelWebsocketJupyterOrg(e):a.serializeDefault(e)},t.deserialize=function(e,t=""){return t===o.supportedKernelWebSocketProtocols.v1KernelWebsocketJupyterOrg?a.deserializeV1KernelWebsocketJupyterOrg(e):a.deserializeDefault(e)},function(e){e.deserializeV1KernelWebsocketJupyterOrg=function(e){let t;const i=new DataView(e),n=Number(i.getBigUint64(0,!0));let s=[];for(let e=0;e{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateModels=t.validateModel=t.validateMessage=void 0;const n=i(3247),s=["username","version","session","msg_id","msg_type"],r={stream:{name:"string",text:"string"},display_data:{data:"object",metadata:"object"},execute_input:{code:"string",execution_count:"number"},execute_result:{execution_count:"number",data:"object",metadata:"object"},error:{ename:"string",evalue:"string",traceback:"object"},status:{execution_state:["string",["starting","idle","busy","restarting","dead"]]},clear_output:{wait:"boolean"},comm_open:{comm_id:"string",target_name:"string",data:"object"},comm_msg:{comm_id:"string",data:"object"},comm_close:{comm_id:"string"},shutdown_reply:{restart:"boolean"}};function o(e){(0,n.validateProperty)(e,"name","string"),(0,n.validateProperty)(e,"id","string")}t.validateMessage=function(e){(0,n.validateProperty)(e,"metadata","object"),(0,n.validateProperty)(e,"content","object"),(0,n.validateProperty)(e,"channel","string"),function(e){for(let t=0;to(e)))}},3490:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t},o=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),t.KernelSpecAPI=t.KernelSpec=void 0;const a=r(i(6060));t.KernelSpec=a;const l=r(i(1598));t.KernelSpecAPI=l,o(i(7307),t)},6060:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},7307:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.KernelSpecManager=void 0;const o=i(3911),a=i(9044),l=i(6424),h=r(i(1598)),c=i(7524);class d extends c.BaseManager{constructor(e={}){var t;super(e),this._isReady=!1,this._connectionFailure=new l.Signal(this),this._specs=null,this._specsChanged=new l.Signal(this),this._ready=Promise.all([this.requestSpecs()]).then((e=>{})).catch((e=>{})).then((()=>{this.isDisposed||(this._isReady=!0)})),this._pollSpecs=new a.Poll({auto:!1,factory:()=>this.requestSpecs(),frequency:{interval:61e3,backoff:!0,max:3e5},name:"@jupyterlab/services:KernelSpecManager#specs",standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this.ready.then((()=>{this._pollSpecs.start()}))}get isReady(){return this._isReady}get ready(){return this._ready}get specs(){return this._specs}get specsChanged(){return this._specsChanged}get connectionFailure(){return this._connectionFailure}dispose(){this._pollSpecs.dispose(),super.dispose()}async refreshSpecs(){await this._pollSpecs.refresh(),await this._pollSpecs.tick}async requestSpecs(){const e=await h.getSpecs(this.serverSettings);this.isDisposed||o.JSONExt.deepEqual(e,this._specs)||(this._specs=e,this._specsChanged.emit(e))}}t.KernelSpecManager=d},1598:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getSpecs=void 0;const n=i(538),s=i(4286),r=i(4251);t.getSpecs=async function(e=n.ServerConnection.makeSettings()){const t=r.URLExt.join(e.baseUrl,"api/kernelspecs"),i=await n.ServerConnection.makeRequest(t,{},e);if(200!==i.status)throw await n.ServerConnection.ResponseError.create(i);const o=await i.json();return(0,s.validateSpecModels)(o)}},4286:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateSpecModels=t.validateSpecModel=void 0;const n=i(3247);function s(e){const t=e.spec;if(!t)throw new Error("Invalid kernel spec");(0,n.validateProperty)(e,"name","string"),(0,n.validateProperty)(e,"resources","object"),(0,n.validateProperty)(t,"language","string"),(0,n.validateProperty)(t,"display_name","string"),(0,n.validateProperty)(t,"argv","array");let i=null;t.hasOwnProperty("metadata")&&((0,n.validateProperty)(t,"metadata","object"),i=t.metadata);let s=null;return t.hasOwnProperty("env")&&((0,n.validateProperty)(t,"env","object"),s=t.env),{name:e.name,resources:e.resources,language:t.language,display_name:t.display_name,argv:t.argv,metadata:i,env:s}}t.validateSpecModel=s,t.validateSpecModels=function(e){if(!e.hasOwnProperty("kernelspecs"))throw new Error("No kernelspecs found");let t=Object.keys(e.kernelspecs);const i=Object.create(null);let n=e.default;for(let n=0;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceManager=void 0;const n=i(6424),s=i(4011),r=i(1708),o=i(5657),a=i(5674),l=i(3490),h=i(6624),c=i(538),d=i(3561),u=i(9188),p=i(3185),f=i(1014),m=i(9090);t.ServiceManager=class{constructor(e={}){var t,i;this._isDisposed=!1,this._connectionFailure=new n.Signal(this),this._isReady=!1;const g=e.defaultDrive,v=null!==(t=e.serverSettings)&&void 0!==t?t:c.ServerConnection.makeSettings(),O={defaultDrive:g,serverSettings:v,standby:null!==(i=e.standby)&&void 0!==i?i:"when-hidden"};this.serverSettings=v,this.contents=e.contents||new r.ContentsManager(O),this.events=e.events||new o.EventManager(O),this.kernels=e.kernels||new a.KernelManager(O),this.sessions=e.sessions||new d.SessionManager({...O,kernelManager:this.kernels}),this.settings=e.settings||new u.SettingManager(O),this.terminals=e.terminals||new p.TerminalManager(O),this.builder=e.builder||new s.BuildManager(O),this.workspaces=e.workspaces||new m.WorkspaceManager(O),this.nbconvert=e.nbconvert||new h.NbConvertManager(O),this.kernelspecs=e.kernelspecs||new l.KernelSpecManager(O),this.user=e.user||new f.UserManager(O),this.kernelspecs.connectionFailure.connect(this._onConnectionFailure,this),this.sessions.connectionFailure.connect(this._onConnectionFailure,this),this.terminals.connectionFailure.connect(this._onConnectionFailure,this);const b=[this.sessions.ready,this.kernelspecs.ready];this.terminals.isAvailable()&&b.push(this.terminals.ready),this._readyPromise=Promise.all(b).then((()=>{this._isReady=!0}))}get connectionFailure(){return this._connectionFailure}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,n.Signal.clearData(this),this.contents.dispose(),this.events.dispose(),this.sessions.dispose(),this.terminals.dispose())}get isReady(){return this._isReady}get ready(){return this._readyPromise}_onConnectionFailure(e,t){this._connectionFailure.emit(t)}}},6624:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NbConvertManager=void 0;const n=i(4251),s=i(538),r=i(3911);t.NbConvertManager=class{constructor(e={}){var t;this._exportFormats=null,this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:s.ServerConnection.makeSettings()}async fetchExportFormats(){this._requestingFormats=new r.PromiseDelegate,this._exportFormats=null;const e=this.serverSettings.baseUrl,t=n.URLExt.join(e,"api/nbconvert"),{serverSettings:i}=this,o=await s.ServerConnection.makeRequest(t,{},i);if(200!==o.status)throw await s.ServerConnection.ResponseError.create(o);const a=await o.json(),l={};return Object.keys(a).forEach((function(e){const t=a[e].output_mimetype;l[e]={output_mimetype:t}})),this._exportFormats=l,this._requestingFormats.resolve(l),l}async getExportFormats(e=!0){return this._requestingFormats?this._requestingFormats.promise:e||!this._exportFormats?await this.fetchExportFormats():this._exportFormats}}},538:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServerConnection=void 0;const n=i(4251);let s;var r,o;s="undefined"==typeof window?i(8354):WebSocket,function(e){e.makeSettings=function(e){return o.makeSettings(e)},e.makeRequest=function(e,t,i){return o.handleRequest(e,t,i)};class t extends Error{static async create(e){try{const i=await e.json(),{message:n,traceback:s}=i;return s&&console.error(s),new t(e,null!=n?n:t._defaultMessage(e),null!=s?s:"")}catch(i){return console.debug(i),new t(e)}}constructor(e,i=t._defaultMessage(e),n=""){super(i),this.response=e,this.traceback=n}static _defaultMessage(e){return`Invalid response: ${e.status} ${e.statusText}`}}e.ResponseError=t;class i extends TypeError{constructor(e){super(e.message),this.stack=e.stack}}e.NetworkError=i}(r=t.ServerConnection||(t.ServerConnection={})),function(e){e.makeSettings=function(e={}){var t;const i=n.PageConfig.getBaseUrl(),r=n.PageConfig.getWsUrl(),o=n.URLExt.normalize(e.baseUrl)||i;let a=e.wsUrl;return a||o!==i||(a=r),a||0!==o.indexOf("http")||(a="ws"+o.slice(4)),a=null!=a?a:r,{init:{cache:"no-store",credentials:"same-origin"},fetch,Headers,Request,WebSocket:s,token:n.PageConfig.getToken(),appUrl:n.PageConfig.getOption("appUrl"),appendToken:"undefined"==typeof window||"undefined"!=typeof process&&void 0!==(null===(t=null===process||void 0===process?void 0:{})||void 0===t?void 0:t.JEST_WORKER_ID)||n.URLExt.getHostName(i)!==n.URLExt.getHostName(a),...e,baseUrl:o,wsUrl:a}},e.handleRequest=function(e,t,i){var n;if(0!==e.indexOf(i.baseUrl))throw new Error("Can only be used for notebook server requests");"no-store"===(null!==(n=t.cache)&&void 0!==n?n:i.init.cache)&&(e+=(/\?/.test(e)?"&":"?")+(new Date).getTime());const s=new i.Request(e,{...i.init,...t});let o=!1;if(i.token&&(o=!0,s.headers.append("Authorization",`token ${i.token}`)),"undefined"!=typeof document&&(null===document||void 0===document?void 0:document.cookie)){const e=function(e){const t=document.cookie.match("\\b_xsrf=([^;]*)\\b");return null==t?void 0:t[1]}();void 0!==e&&(o=!0,s.headers.append("X-XSRFToken",e))}return!s.headers.has("Content-Type")&&o&&s.headers.set("Content-Type","application/json"),i.fetch.call(null,s).catch((e=>{throw new r.NetworkError(e)}))}}(o||(o={}))},6512:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SessionConnection=void 0;const n=i(6424),s=i(5247),r=i(1975),o=i(3911);t.SessionConnection=class{constructor(e){var t,i,r,a;this._id="",this._path="",this._name="",this._type="",this._kernel=null,this._isDisposed=!1,this._disposed=new n.Signal(this),this._kernelChanged=new n.Signal(this),this._statusChanged=new n.Signal(this),this._connectionStatusChanged=new n.Signal(this),this._pendingInput=new n.Signal(this),this._iopubMessage=new n.Signal(this),this._unhandledMessage=new n.Signal(this),this._anyMessage=new n.Signal(this),this._propertyChanged=new n.Signal(this),this._id=e.model.id,this._name=e.model.name,this._path=e.model.path,this._type=e.model.type,this._username=null!==(t=e.username)&&void 0!==t?t:"",this._clientId=null!==(i=e.clientId)&&void 0!==i?i:o.UUID.uuid4(),this._connectToKernel=e.connectToKernel,this._kernelConnectionOptions=null!==(r=e.kernelConnectionOptions)&&void 0!==r?r:{},this.serverSettings=null!==(a=e.serverSettings)&&void 0!==a?a:s.ServerConnection.makeSettings(),this.setupKernel(e.model.kernel)}get disposed(){return this._disposed}get kernelChanged(){return this._kernelChanged}get statusChanged(){return this._statusChanged}get connectionStatusChanged(){return this._connectionStatusChanged}get pendingInput(){return this._pendingInput}get iopubMessage(){return this._iopubMessage}get unhandledMessage(){return this._unhandledMessage}get anyMessage(){return this._anyMessage}get propertyChanged(){return this._propertyChanged}get id(){return this._id}get kernel(){return this._kernel}get path(){return this._path}get type(){return this._type}get name(){return this._name}get model(){return{id:this.id,kernel:this.kernel&&{id:this.kernel.id,name:this.kernel.name},path:this._path,type:this._type,name:this._name}}get isDisposed(){return this._isDisposed}update(e){const t=this.model;if(this._path=e.path,this._name=e.name,this._type=e.type,null===this._kernel&&null!==e.kernel||null!==this._kernel&&null===e.kernel||null!==this._kernel&&null!==e.kernel&&this._kernel.id!==e.kernel.id){null!==this._kernel&&this._kernel.dispose();const t=this._kernel||null;this.setupKernel(e.kernel);const i=this._kernel||null;this._kernelChanged.emit({name:"kernel",oldValue:t,newValue:i})}this._handleModelChange(t)}dispose(){if(!this.isDisposed){if(this._isDisposed=!0,this._disposed.emit(),this._kernel){this._kernel.dispose();const e=this._kernel;this._kernel=null;const t=this._kernel;this._kernelChanged.emit({name:"kernel",oldValue:e,newValue:t})}n.Signal.clearData(this)}}async setPath(e){if(this.isDisposed)throw new Error("Session is disposed");await this._patch({path:e})}async setName(e){if(this.isDisposed)throw new Error("Session is disposed");await this._patch({name:e})}async setType(e){if(this.isDisposed)throw new Error("Session is disposed");await this._patch({type:e})}async changeKernel(e){if(this.isDisposed)throw new Error("Session is disposed");return await this._patch({kernel:e}),this.kernel}async shutdown(){if(this.isDisposed)throw new Error("Session is disposed");await(0,r.shutdownSession)(this.id,this.serverSettings),this.dispose()}setupKernel(e){if(null===e)return void(this._kernel=null);const t=this._connectToKernel({...this._kernelConnectionOptions,model:e,username:this._username,clientId:this._clientId,serverSettings:this.serverSettings});this._kernel=t,t.statusChanged.connect(this.onKernelStatus,this),t.connectionStatusChanged.connect(this.onKernelConnectionStatus,this),t.pendingInput.connect(this.onPendingInput,this),t.unhandledMessage.connect(this.onUnhandledMessage,this),t.iopubMessage.connect(this.onIOPubMessage,this),t.anyMessage.connect(this.onAnyMessage,this)}onKernelStatus(e,t){this._statusChanged.emit(t)}onKernelConnectionStatus(e,t){this._connectionStatusChanged.emit(t)}onPendingInput(e,t){this._pendingInput.emit(t)}onIOPubMessage(e,t){this._iopubMessage.emit(t)}onUnhandledMessage(e,t){this._unhandledMessage.emit(t)}onAnyMessage(e,t){this._anyMessage.emit(t)}async _patch(e){const t=await(0,r.updateSession)({...e,id:this._id},this.serverSettings);return this.update(t),t}_handleModelChange(e){e.name!==this._name&&this._propertyChanged.emit("name"),e.type!==this._type&&this._propertyChanged.emit("type"),e.path!==this._path&&this._propertyChanged.emit("path")}}},3561:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t},o=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),t.SessionAPI=t.Session=void 0;const a=r(i(7993));t.Session=a;const l=r(i(1975));t.SessionAPI=l,o(i(8137),t)},8137:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SessionManager=void 0;const n=i(9044),s=i(6424),r=i(538),o=i(7524),a=i(6512),l=i(1975);class h extends o.BaseManager{constructor(e){var t;super(e),this._isReady=!1,this._sessionConnections=new Set,this._models=new Map,this._runningChanged=new s.Signal(this),this._connectionFailure=new s.Signal(this),this._connectToKernel=e=>this._kernelManager.connectTo(e),this._kernelManager=e.kernelManager,this._pollModels=new n.Poll({auto:!1,factory:()=>this.requestRunning(),frequency:{interval:1e4,backoff:!0,max:3e5},name:"@jupyterlab/services:SessionManager#models",standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this._ready=(async()=>{await this._pollModels.start(),await this._pollModels.tick,this._kernelManager.isActive&&await this._kernelManager.ready,this._isReady=!0})()}get isReady(){return this._isReady}get ready(){return this._ready}get runningChanged(){return this._runningChanged}get connectionFailure(){return this._connectionFailure}dispose(){this.isDisposed||(this._models.clear(),this._sessionConnections.forEach((e=>e.dispose())),this._pollModels.dispose(),super.dispose())}connectTo(e){const t=new a.SessionConnection({...e,connectToKernel:this._connectToKernel,serverSettings:this.serverSettings});return this._onStarted(t),this._models.has(e.model.id)||this.refreshRunning().catch((()=>{})),t}running(){return this._models.values()}async refreshRunning(){await this._pollModels.refresh(),await this._pollModels.tick}async startNew(e,t={}){const i=await(0,l.startSession)(e,this.serverSettings);return await this.refreshRunning(),this.connectTo({...t,model:i})}async shutdown(e){await(0,l.shutdownSession)(e,this.serverSettings),await this.refreshRunning()}async shutdownAll(){await this.refreshRunning(),await Promise.all([...this._models.keys()].map((e=>(0,l.shutdownSession)(e,this.serverSettings)))),await this.refreshRunning()}async stopIfNeeded(e){try{const t=(await(0,l.listRunning)(this.serverSettings)).filter((t=>t.path===e));if(1===t.length){const e=t[0].id;await this.shutdown(e)}}catch(e){}}async findById(e){return this._models.has(e)||await this.refreshRunning(),this._models.get(e)}async findByPath(e){for(const t of this._models.values())if(t.path===e)return t;await this.refreshRunning();for(const t of this._models.values())if(t.path===e)return t}async requestRunning(){var e,t;let i;try{i=await(0,l.listRunning)(this.serverSettings)}catch(i){throw(i instanceof r.ServerConnection.NetworkError||503===(null===(e=i.response)||void 0===e?void 0:e.status)||424===(null===(t=i.response)||void 0===t?void 0:t.status))&&this._connectionFailure.emit(i),i}this.isDisposed||this._models.size===i.length&&i.every((e=>{var t,i,n,s;const r=this._models.get(e.id);return!!r&&(null===(t=r.kernel)||void 0===t?void 0:t.id)===(null===(i=e.kernel)||void 0===i?void 0:i.id)&&(null===(n=r.kernel)||void 0===n?void 0:n.name)===(null===(s=e.kernel)||void 0===s?void 0:s.name)&&r.name===e.name&&r.path===e.path&&r.type===e.type}))||(this._models=new Map(i.map((e=>[e.id,e]))),this._sessionConnections.forEach((e=>{this._models.has(e.id)?e.update(this._models.get(e.id)):e.dispose()})),this._runningChanged.emit(i))}_onStarted(e){this._sessionConnections.add(e),e.disposed.connect(this._onDisposed,this),e.propertyChanged.connect(this._onChanged,this),e.kernelChanged.connect(this._onChanged,this)}_onDisposed(e){this._sessionConnections.delete(e),this.refreshRunning().catch((()=>{}))}_onChanged(){this.refreshRunning().catch((()=>{}))}}t.SessionManager=h,function(e){e.NoopManager=class extends e{constructor(){super(...arguments),this._readyPromise=new Promise((()=>{}))}get isActive(){return!1}get parentReady(){return super.ready}async startNew(e,t={}){return Promise.reject(new Error("Not implemented in no-op Session Manager"))}connectTo(e){throw Error("Not implemented in no-op Session Manager")}get ready(){return this.parentReady.then((()=>this._readyPromise))}async shutdown(e){return Promise.reject(new Error("Not implemented in no-op Session Manager"))}async requestRunning(){return Promise.resolve()}}}(h=t.SessionManager||(t.SessionManager={}))},1975:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateSession=t.startSession=t.getSessionModel=t.shutdownSession=t.getSessionUrl=t.listRunning=t.SESSION_SERVICE_URL=void 0;const n=i(538),s=i(4251),r=i(9590);function o(e,i){return s.URLExt.join(e,t.SESSION_SERVICE_URL,i)}t.SESSION_SERVICE_URL="api/sessions",t.listRunning=async function(e=n.ServerConnection.makeSettings()){const i=s.URLExt.join(e.baseUrl,t.SESSION_SERVICE_URL),o=await n.ServerConnection.makeRequest(i,{},e);if(200!==o.status)throw await n.ServerConnection.ResponseError.create(o);const a=await o.json();if(!Array.isArray(a))throw new Error("Invalid Session list");return a.forEach((e=>{(0,r.updateLegacySessionModel)(e),(0,r.validateModel)(e)})),a},t.getSessionUrl=o,t.shutdownSession=async function(e,t=n.ServerConnection.makeSettings()){var i;const s=o(t.baseUrl,e),r=await n.ServerConnection.makeRequest(s,{method:"DELETE"},t);if(404===r.status){const t=null!==(i=(await r.json()).message)&&void 0!==i?i:`The session "${e}"" does not exist on the server`;console.warn(t)}else{if(410===r.status)throw new n.ServerConnection.ResponseError(r,"The kernel was deleted but the session was not");if(204!==r.status)throw await n.ServerConnection.ResponseError.create(r)}},t.getSessionModel=async function(e,t=n.ServerConnection.makeSettings()){const i=o(t.baseUrl,e),s=await n.ServerConnection.makeRequest(i,{},t);if(200!==s.status)throw await n.ServerConnection.ResponseError.create(s);const a=await s.json();return(0,r.updateLegacySessionModel)(a),(0,r.validateModel)(a),a},t.startSession=async function(e,i=n.ServerConnection.makeSettings()){const o=s.URLExt.join(i.baseUrl,t.SESSION_SERVICE_URL),a={method:"POST",body:JSON.stringify(e)},l=await n.ServerConnection.makeRequest(o,a,i);if(201!==l.status)throw await n.ServerConnection.ResponseError.create(l);const h=await l.json();return(0,r.updateLegacySessionModel)(h),(0,r.validateModel)(h),h},t.updateSession=async function(e,t=n.ServerConnection.makeSettings()){const i=o(t.baseUrl,e.id),s={method:"PATCH",body:JSON.stringify(e)},a=await n.ServerConnection.makeRequest(i,s,t);if(200!==a.status)throw await n.ServerConnection.ResponseError.create(a);const l=await a.json();return(0,r.updateLegacySessionModel)(l),(0,r.validateModel)(l),l}},7993:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},9590:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateModels=t.updateLegacySessionModel=t.validateModel=void 0;const n=i(776),s=i(3247);function r(e){(0,s.validateProperty)(e,"id","string"),(0,s.validateProperty)(e,"type","string"),(0,s.validateProperty)(e,"name","string"),(0,s.validateProperty)(e,"path","string"),(0,s.validateProperty)(e,"kernel","object"),(0,n.validateModel)(e.kernel)}t.validateModel=r,t.updateLegacySessionModel=function(e){void 0===e.path&&void 0!==e.notebook&&(e.path=e.notebook.path,e.type="notebook",e.name="")},t.validateModels=function(e){if(!Array.isArray(e))throw new Error("Invalid session list");e.forEach((e=>r(e)))}},9188:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SettingManager=void 0;const n=i(4251),s=i(5895),r=i(538);class o extends s.DataConnector{constructor(e={}){var t;super(),this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:r.ServerConnection.makeSettings()}async fetch(e){if(!e)throw new Error("Plugin `id` parameter is required for settings fetch.");const{serverSettings:t}=this,{baseUrl:i,appUrl:n}=t,{makeRequest:s,ResponseError:o}=r.ServerConnection,l=i+n,h=a.url(l,e),c=await s(h,{},t);if(200!==c.status)throw await o.create(c);return c.json()}async list(e){var t,i,n,s;const{serverSettings:o}=this,{baseUrl:l,appUrl:h}=o,{makeRequest:c,ResponseError:d}=r.ServerConnection,u=l+h,p=a.url(u,"","ids"===e),f=await c(p,{},o);if(200!==f.status)throw new d(f);const m=await f.json(),g=null!==(i=null===(t=null==m?void 0:m.settings)||void 0===t?void 0:t.map((e=>e.id)))&&void 0!==i?i:[];let v=[];return e||(v=null!==(s=null===(n=null==m?void 0:m.settings)||void 0===n?void 0:n.map((e=>(e.data={composite:{},user:{}},e))))&&void 0!==s?s:[]),{ids:g,values:v}}async save(e,t){const{serverSettings:i}=this,{baseUrl:n,appUrl:s}=i,{makeRequest:o,ResponseError:l}=r.ServerConnection,h=n+s,c=a.url(h,e),d={body:JSON.stringify({raw:t}),method:"PUT"},u=await o(c,d,i);if(204!==u.status)throw new l(u)}}var a;t.SettingManager=o,function(e){e.url=function(e,t,i){const s=i?n.URLExt.objectToQueryString({ids_only:!0}):"";return`${n.URLExt.join(e,"api/settings",t)}${s}`}}(a||(a={}))},8354:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=WebSocket},7685:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TerminalConnection=void 0;const n=i(4251),s=i(3911),r=i(6424),o=i(5247),a=i(7384);class l{constructor(e){var t;this._createSocket=()=>{this._errorIfDisposed(),this._clearSocket(),this._updateConnectionStatus("connecting");const e=this._name,t=this.serverSettings;let i=n.URLExt.join(t.wsUrl,"terminals","websocket",encodeURIComponent(e));const s=t.token;t.appendToken&&""!==s&&(i+=`?token=${encodeURIComponent(s)}`),this._ws=new t.WebSocket(i),this._ws.onmessage=this._onWSMessage,this._ws.onclose=this._onWSClose,this._ws.onerror=this._onWSClose},this._onWSMessage=e=>{if(this._isDisposed)return;const t=JSON.parse(e.data);"disconnect"===t[0]&&this.dispose(),"connecting"!==this._connectionStatus?this._messageReceived.emit({type:t[0],content:t.slice(1)}):"setup"===t[0]&&this._updateConnectionStatus("connected")},this._onWSClose=e=>{console.warn(`Terminal websocket closed: ${e.code}`),this.isDisposed||this._reconnect()},this._connectionStatus="connecting",this._connectionStatusChanged=new r.Signal(this),this._isDisposed=!1,this._disposed=new r.Signal(this),this._messageReceived=new r.Signal(this),this._reconnectTimeout=null,this._ws=null,this._noOp=()=>{},this._reconnectLimit=7,this._reconnectAttempt=0,this._pendingMessages=[],this._name=e.model.name,this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:o.ServerConnection.makeSettings(),this._createSocket()}get disposed(){return this._disposed}get messageReceived(){return this._messageReceived}get name(){return this._name}get model(){return{name:this._name}}get isDisposed(){return this._isDisposed}dispose(){this._isDisposed||(this._isDisposed=!0,this._disposed.emit(),this._updateConnectionStatus("disconnected"),this._clearSocket(),r.Signal.clearData(this))}send(e){this._sendMessage(e)}_sendMessage(e,t=!0){if(!this._isDisposed&&e.content)if("connected"===this.connectionStatus&&this._ws){const t=[e.type,...e.content];this._ws.send(JSON.stringify(t))}else{if(!t)throw new Error(`Could not send message: ${JSON.stringify(e)}`);this._pendingMessages.push(e)}}_sendPending(){for(;"connected"===this.connectionStatus&&this._pendingMessages.length>0;)this._sendMessage(this._pendingMessages[0],!1),this._pendingMessages.shift()}reconnect(){this._errorIfDisposed();const e=new s.PromiseDelegate,t=(i,n)=>{"connected"===n?(e.resolve(),this.connectionStatusChanged.disconnect(t,this)):"disconnected"===n&&(e.reject(new Error("Terminal connection disconnected")),this.connectionStatusChanged.disconnect(t,this))};return this.connectionStatusChanged.connect(t,this),this._reconnectAttempt=0,this._reconnect(),e.promise}_reconnect(){if(this._errorIfDisposed(),clearTimeout(this._reconnectTimeout),this._reconnectAttempt{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TerminalManager=void 0;const n=i(9044),s=i(6424),r=i(5247),o=i(7524),a=i(7384),l=i(7685);class h extends o.BaseManager{constructor(e={}){var t;if(super(e),this._isReady=!1,this._names=[],this._terminalConnections=new Set,this._runningChanged=new s.Signal(this),this._connectionFailure=new s.Signal(this),!this.isAvailable())return this._ready=Promise.reject("Terminals unavailable"),void this._ready.catch((e=>{}));this._pollModels=new n.Poll({auto:!1,factory:()=>this.requestRunning(),frequency:{interval:1e4,backoff:!0,max:3e5},name:"@jupyterlab/services:TerminalManager#models",standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this._ready=(async()=>{await this._pollModels.start(),await this._pollModels.tick,this._isReady=!0})()}get isReady(){return this._isReady}get ready(){return this._ready}get runningChanged(){return this._runningChanged}get connectionFailure(){return this._connectionFailure}dispose(){this.isDisposed||(this._names.length=0,this._terminalConnections.forEach((e=>e.dispose())),this._pollModels.dispose(),super.dispose())}isAvailable(){return(0,a.isAvailable)()}connectTo(e){const t=new l.TerminalConnection({...e,serverSettings:this.serverSettings});return this._onStarted(t),this._names.includes(e.model.name)||this.refreshRunning().catch((()=>{})),t}running(){return this._models[Symbol.iterator]()}async refreshRunning(){await this._pollModels.refresh(),await this._pollModels.tick}async startNew(e){const t=await(0,a.startNew)(this.serverSettings,null==e?void 0:e.name,null==e?void 0:e.cwd);return await this.refreshRunning(),this.connectTo({model:t})}async shutdown(e){await(0,a.shutdownTerminal)(e,this.serverSettings),await this.refreshRunning()}async shutdownAll(){await this.refreshRunning(),await Promise.all(this._names.map((e=>(0,a.shutdownTerminal)(e,this.serverSettings)))),await this.refreshRunning()}async requestRunning(){var e,t;let i;try{i=await(0,a.listRunning)(this.serverSettings)}catch(i){throw(i instanceof r.ServerConnection.NetworkError||503===(null===(e=i.response)||void 0===e?void 0:e.status)||424===(null===(t=i.response)||void 0===t?void 0:t.status))&&this._connectionFailure.emit(i),i}if(this.isDisposed)return;const n=i.map((({name:e})=>e)).sort();n!==this._names&&(this._names=n,this._terminalConnections.forEach((e=>{n.includes(e.name)||e.dispose()})),this._runningChanged.emit(this._models))}_onStarted(e){this._terminalConnections.add(e),e.disposed.connect(this._onDisposed,this)}_onDisposed(e){this._terminalConnections.delete(e),this.refreshRunning().catch((()=>{}))}get _models(){return this._names.map((e=>({name:e})))}}t.TerminalManager=h,function(e){e.NoopManager=class extends e{constructor(){super(...arguments),this._readyPromise=new Promise((()=>{}))}get isActive(){return!1}get parentReady(){return super.ready}get ready(){return this.parentReady.then((()=>this._readyPromise))}async startNew(e){return Promise.reject(new Error("Not implemented in no-op Terminal Manager"))}connectTo(e){throw Error("Not implemented in no-op Terminal Manager")}async shutdown(e){return Promise.reject(new Error("Not implemented in no-op Terminal Manager"))}async requestRunning(){return Promise.resolve()}}}(h=t.TerminalManager||(t.TerminalManager={}))},7384:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.shutdownTerminal=t.listRunning=t.startNew=t.isAvailable=t.TERMINAL_SERVICE_URL=void 0;const n=i(4251),s=i(538);function r(){return"true"===String(n.PageConfig.getOption("terminalsAvailable")).toLowerCase()}var o;t.TERMINAL_SERVICE_URL="api/terminals",t.isAvailable=r,t.startNew=async function(e=s.ServerConnection.makeSettings(),i,r){o.errorIfNotAvailable();const a=n.URLExt.join(e.baseUrl,t.TERMINAL_SERVICE_URL),l={method:"POST",body:JSON.stringify({name:i,cwd:r})},h=await s.ServerConnection.makeRequest(a,l,e);if(200!==h.status)throw await s.ServerConnection.ResponseError.create(h);return await h.json()},t.listRunning=async function(e=s.ServerConnection.makeSettings()){o.errorIfNotAvailable();const i=n.URLExt.join(e.baseUrl,t.TERMINAL_SERVICE_URL),r=await s.ServerConnection.makeRequest(i,{},e);if(200!==r.status)throw await s.ServerConnection.ResponseError.create(r);const a=await r.json();if(!Array.isArray(a))throw new Error("Invalid terminal list");return a},t.shutdownTerminal=async function(e,i=s.ServerConnection.makeSettings()){var r;o.errorIfNotAvailable();const a=n.URLExt.join(i.baseUrl,t.TERMINAL_SERVICE_URL,e),l=await s.ServerConnection.makeRequest(a,{method:"DELETE"},i);if(404===l.status){const t=null!==(r=(await l.json()).message)&&void 0!==r?r:`The terminal session "${e}"" does not exist on the server`;console.warn(t)}else if(204!==l.status)throw await s.ServerConnection.ResponseError.create(l)},function(e){e.errorIfNotAvailable=function(){if(!r())throw new Error("Terminals Unavailable")}}(o||(o={}))},3828:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isAvailable=void 0;const n=i(7384);Object.defineProperty(t,"isAvailable",{enumerable:!0,get:function(){return n.isAvailable}})},1014:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UserManager=void 0;const n=i(4251),s=i(3911),r=i(9044),o=i(6424),a=i(538),l=i(7524),h="@jupyterlab/services:UserManager#user";class c extends l.BaseManager{constructor(e={}){var t;super(e),this._isReady=!1,this._userChanged=new o.Signal(this),this._connectionFailure=new o.Signal(this),this._ready=this.requestUser().then((()=>{this.isDisposed||(this._isReady=!0)})).catch((e=>new Promise((()=>{})))),this._pollSpecs=new r.Poll({auto:!1,factory:()=>this.requestUser(),frequency:{interval:61e3,backoff:!0,max:3e5},name:h,standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this.ready.then((()=>{this._pollSpecs.start()}))}get isReady(){return this._isReady}get ready(){return this._ready}get identity(){return this._identity}get permissions(){return this._permissions}get userChanged(){return this._userChanged}get connectionFailure(){return this._connectionFailure}dispose(){this._pollSpecs.dispose(),super.dispose()}async refreshUser(){await this._pollSpecs.refresh(),await this._pollSpecs.tick}async requestUser(){if(this.isDisposed)return;const{baseUrl:e}=this.serverSettings,{makeRequest:t,ResponseError:i}=a.ServerConnection,r=n.URLExt.join(e,"api/me"),o=await t(r,{},this.serverSettings);if(200!==o.status)throw await i.create(o);const l={identity:this._identity,permissions:this._permissions},c=await o.json(),u=c.identity,{localStorage:p}=window,f=p.getItem(h);if(f&&(!u.initials||!u.color)){const e=JSON.parse(f);u.initials=u.initials||e.initials||u.name.substring(0,1),u.color=u.color||e.color||d.getRandomColor()}s.JSONExt.deepEqual(c,l)||(this._identity=u,this._permissions=c.permissions,p.setItem(h,JSON.stringify(u)),this._userChanged.emit(c))}}var d;t.UserManager=c,function(e){const t=["var(--jp-collaborator-color1)","var(--jp-collaborator-color2)","var(--jp-collaborator-color3)","var(--jp-collaborator-color4)","var(--jp-collaborator-color5)","var(--jp-collaborator-color6)","var(--jp-collaborator-color7)"];e.getRandomColor=()=>t[Math.floor(Math.random()*t.length)]}(d||(d={}))},3247:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateProperty=void 0,t.validateProperty=function(e,t,i,n=[]){if(!e.hasOwnProperty(t))throw Error(`Missing property '${t}'`);const s=e[t];if(void 0!==i){let e=!0;switch(i){case"array":e=Array.isArray(s);break;case"object":e=void 0!==s;break;default:e=typeof s===i}if(!e)throw new Error(`Property '${t}' is not of type '${i}'`);if(n.length>0){let e=!0;switch(i){case"string":case"number":case"boolean":e=n.includes(s);break;default:e=n.findIndex((e=>e===s))>=0}if(!e)throw new Error(`Property '${t}' is not one of the valid values ${JSON.stringify(n)}`)}}}},9090:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkspaceManager=void 0;const n=i(4251),s=i(5895),r=i(538);class o extends s.DataConnector{constructor(e={}){var t;super(),this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:r.ServerConnection.makeSettings()}async fetch(e){const{serverSettings:t}=this,{baseUrl:i,appUrl:n}=t,{makeRequest:s,ResponseError:o}=r.ServerConnection,l=i+n,h=a.url(l,e),c=await s(h,{},t);if(200!==c.status)throw await o.create(c);return c.json()}async list(){const{serverSettings:e}=this,{baseUrl:t,appUrl:i}=e,{makeRequest:n,ResponseError:s}=r.ServerConnection,o=t+i,l=a.url(o,""),h=await n(l,{},e);if(200!==h.status)throw await s.create(h);return(await h.json()).workspaces}async remove(e){const{serverSettings:t}=this,{baseUrl:i,appUrl:n}=t,{makeRequest:s,ResponseError:o}=r.ServerConnection,l=i+n,h=a.url(l,e),c=await s(h,{method:"DELETE"},t);if(204!==c.status)throw await o.create(c)}async save(e,t){const{serverSettings:i}=this,{baseUrl:n,appUrl:s}=i,{makeRequest:o,ResponseError:l}=r.ServerConnection,h=n+s,c=a.url(h,e),d={body:JSON.stringify(t),method:"PUT"},u=await o(c,d,i);if(204!==u.status)throw await l.create(u)}}var a;t.WorkspaceManager=o,function(e){e.url=function(e,t){return n.URLExt.join(e,"api/workspaces",t)}}(a||(a={}))},1150:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataConnector=void 0,t.DataConnector=class{async list(e){throw new Error("DataConnector#list method has not been implemented.")}async remove(e){throw new Error("DataConnector#remove method has not been implemented.")}async save(e,t){throw new Error("DataConnector#save method has not been implemented.")}}},5895:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),s(i(1150),t),s(i(4995),t),s(i(2763),t),s(i(4611),t),s(i(2594),t)},4995:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2763:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RestorablePool=void 0;const n=i(3911),s=i(4050),r=i(6424);var o;t.RestorablePool=class{constructor(e){this._added=new r.Signal(this),this._current=null,this._currentChanged=new r.Signal(this),this._hasRestored=!1,this._isDisposed=!1,this._objects=new Set,this._restore=null,this._restored=new n.PromiseDelegate,this._updated=new r.Signal(this),this.namespace=e.namespace}get added(){return this._added}get current(){return this._current}set current(e){this._current!==e&&null!==e&&this._objects.has(e)&&(this._current=e,this._currentChanged.emit(this._current))}get currentChanged(){return this._currentChanged}get isDisposed(){return this._isDisposed}get restored(){return this._restored.promise}get size(){return this._objects.size}get updated(){return this._updated}async add(e){var t,i;if(e.isDisposed){const t="A disposed object cannot be added.";throw console.warn(t,e),new Error(t)}if(this._objects.has(e)){const t="This object already exists in the pool.";throw console.warn(t,e),new Error(t)}if(this._objects.add(e),e.disposed.connect(this._onInstanceDisposed,this),!o.injectedProperty.get(e)){if(this._restore){const{connector:n}=this._restore,s=this._restore.name(e);if(s){const r=`${this.namespace}:${s}`,a=null===(i=(t=this._restore).args)||void 0===i?void 0:i.call(t,e);o.nameProperty.set(e,r),await n.save(r,{data:a})}}this._added.emit(e)}}dispose(){this.isDisposed||(this._current=null,this._isDisposed=!0,this._objects.clear(),r.Signal.clearData(this))}find(e){const t=this._objects.values();for(const i of t)if(e(i))return i}forEach(e){this._objects.forEach(e)}filter(e){const t=[];return this.forEach((i=>{e(i)&&t.push(i)})),t}inject(e){return o.injectedProperty.set(e,!0),this.add(e)}has(e){return this._objects.has(e)}async restore(e){if(this._hasRestored)throw new Error("This pool has already been restored.");this._hasRestored=!0;const{command:t,connector:i,registry:n,when:s}=e,r=this.namespace,o=s?[i.list(r)].concat(s):[i.list(r)];this._restore=e;const[a]=await Promise.all(o),l=await Promise.all(a.ids.map((async(e,s)=>{const r=a.values[s],o=r&&r.data;return void 0===o?i.remove(e):n.execute(t,o).catch((()=>i.remove(e)))})));return this._restored.resolve(),l}async save(e){var t,i;const n=o.injectedProperty.get(e);if(!this._restore||!this.has(e)||n)return;const{connector:s}=this._restore,r=this._restore.name(e),a=o.nameProperty.get(e),l=r?`${this.namespace}:${r}`:"";if(a&&a!==l&&await s.remove(a),o.nameProperty.set(e,l),l){const n=null===(i=(t=this._restore).args)||void 0===i?void 0:i.call(t,e);await s.save(l,{data:n})}a!==l&&this._updated.emit(e)}_onInstanceDisposed(e){if(this._objects.delete(e),e===this._current&&(this._current=null,this._currentChanged.emit(this._current)),o.injectedProperty.get(e))return;if(!this._restore)return;const{connector:t}=this._restore,i=o.nameProperty.get(e);i&&t.remove(i)}},function(e){e.injectedProperty=new s.AttachedProperty({name:"injected",create:()=>!1}),e.nameProperty=new s.AttachedProperty({name:"name",create:()=>""})}(o||(o={}))},4611:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StateDB=void 0;const n=i(6424);class s{constructor(e={}){this._changed=new n.Signal(this);const{connector:t,transform:i}=e;this._connector=t||new s.Connector,this._ready=i?i.then((e=>{const{contents:t,type:i}=e;switch(i){case"cancel":default:return;case"clear":return this._clear();case"merge":return this._merge(t||{});case"overwrite":return this._overwrite(t||{})}})):Promise.resolve(void 0)}get changed(){return this._changed}async clear(){await this._ready,await this._clear()}async fetch(e){return await this._ready,this._fetch(e)}async list(e){return await this._ready,this._list(e)}async remove(e){await this._ready,await this._remove(e),this._changed.emit({id:e,type:"remove"})}async save(e,t){await this._ready,await this._save(e,t),this._changed.emit({id:e,type:"save"})}async toJSON(){await this._ready;const{ids:e,values:t}=await this._list();return t.reduce(((t,i,n)=>(t[e[n]]=i,t)),{})}async _clear(){await Promise.all((await this._list()).ids.map((e=>this._remove(e))))}async _fetch(e){const t=await this._connector.fetch(e);if(t)return JSON.parse(t).v}async _list(e=""){const{ids:t,values:i}=await this._connector.list(e);return{ids:t,values:i.map((e=>JSON.parse(e).v))}}async _merge(e){await Promise.all(Object.keys(e).map((t=>e[t]&&this._save(t,e[t]))))}async _overwrite(e){await this._clear(),await this._merge(e)}async _remove(e){return this._connector.remove(e)}async _save(e,t){return this._connector.save(e,JSON.stringify({v:t}))}}t.StateDB=s,function(e){e.Connector=class{constructor(){this._storage={}}async fetch(e){return this._storage[e]}async list(e=""){return Object.keys(this._storage).reduce(((t,i)=>(""!==e&&e!==i.split(":")[0]||(t.ids.push(i),t.values.push(this._storage[i])),t)),{ids:[],values:[]})}async remove(e){delete this._storage[e]}async save(e,t){this._storage[e]=t}}}(s=t.StateDB||(t.StateDB={}))},2594:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IStateDB=void 0;const n=i(3911);t.IStateDB=new n.Token("@jupyterlab/coreutils:IStateDB",'A service for the JupyterLab state database.\n Use this if you want to store data that will persist across page loads.\n See "state database" for more information.')},7564:(e,t,i)=>{"use strict";var n,s,r;function*o(){}function a(e,t){let i=0;for(const n of e)if(t(n,i++))return n}function l(e,t){let i;for(const n of e)void 0!==i?t(n,i)>0&&(i=n):i=n;return i}function h(e,t){let i=0;for(const n of e)if(!1===t(n,i++))return!1;return!0}function c(e,t){let i=0;for(const n of e)if(t(n,i++))return!0;return!1}function*d(e,t){let i=0;for(const n of e)yield t(n,i++)}function*u(e){if("function"==typeof e.retro)yield*e.retro();else for(let t=e.length-1;t>-1;t--)yield e[t]}i.d(t,{Fp:()=>l,G:()=>c,RO:()=>n,UI:()=>d,cS:()=>o,kf:()=>r,kh:()=>u,sE:()=>a,yW:()=>h}),function(e){function t(e,t,i=0,n=-1){let s,r=e.length;if(0===r)return-1;i=i<0?Math.max(0,i+r):Math.min(i,r-1),s=(n=n<0?Math.max(0,n+r):Math.min(n,r-1))=i)return;let n=e[t];for(let n=t+1;n0;){let n=a>>1,s=o+n;i(e[s],t)<0?(o=s+1,a-=n+1):a=n}return o},e.upperBound=function(e,t,i,n=0,s=-1){let r=e.length;if(0===r)return 0;let o=n=n<0?Math.max(0,n+r):Math.min(n,r-1),a=(s=s<0?Math.max(0,s+r):Math.min(s,r-1))-n+1;for(;a>0;){let n=a>>1,s=o+n;i(e[s],t)>0?a=n:(o=s+1,a-=n+1)}return o},e.shallowEqual=function(e,t,i){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0,s=e.length;n=o&&(i=s<0?o-1:o),void 0===n?n=s<0?-1:o:n<0?n=Math.max(n+o,s<0?-1:0):n>=o&&(n=s<0?o-1:o),r=s<0&&n>=i||s>0&&i>=n?0:s<0?Math.floor((n-i+1)/s+1):Math.floor((n-i-1)/s+1);let a=[];for(let t=0;t=(n=n<0?Math.max(0,n+s):Math.min(n,s-1)))return;let o=n-i+1;if(t>0?t%=o:t<0&&(t=(t%o+o)%o),0===t)return;let a=i+t;r(e,i,a-1),r(e,a,n),r(e,i,n)},e.fill=function(e,t,i=0,n=-1){let s,r=e.length;if(0!==r){i=i<0?Math.max(0,i+r):Math.min(i,r-1),s=(n=n<0?Math.max(0,n+r):Math.min(n,r-1))t;--i)e[i]=e[i-1];e[t]=i},e.removeAt=o,e.removeFirstOf=function(e,i,n=0,s=-1){let r=t(e,i,n,s);return-1!==r&&o(e,r),r},e.removeLastOf=function(e,t,n=-1,s=0){let r=i(e,t,n,s);return-1!==r&&o(e,r),r},e.removeAllOf=function(e,t,i=0,n=-1){let s=e.length;if(0===s)return 0;i=i<0?Math.max(0,i+s):Math.min(i,s-1),n=n<0?Math.max(0,n+s):Math.min(n,s-1);let r=0;for(let o=0;o=i&&o<=n&&e[o]===t||n=i)&&e[o]===t?r++:r>0&&(e[o-r]=e[o]);return r>0&&(e.length=s-r),r},e.removeFirstWhere=function(e,t,i=0,s=-1){let r,a=n(e,t,i,s);return-1!==a&&(r=o(e,a)),{index:a,value:r}},e.removeLastWhere=function(e,t,i=-1,n=0){let r,a=s(e,t,i,n);return-1!==a&&(r=o(e,a)),{index:a,value:r}},e.removeAllWhere=function(e,t,i=0,n=-1){let s=e.length;if(0===s)return 0;i=i<0?Math.max(0,i+s):Math.min(i,s-1),n=n<0?Math.max(0,n+s):Math.min(n,s-1);let r=0;for(let o=0;o=i&&o<=n&&t(e[o],o)||n=i)&&t(e[o],o)?r++:r>0&&(e[o-r]=e[o]);return r>0&&(e.length=s-r),r}}(n||(n={})),function(e){e.rangeLength=function(e,t,i){return 0===i?1/0:e>t&&i>0||et?1:0}}(r||(r={}))},3911:function(e,t){!function(e){"use strict";e.JSONExt=void 0,function(e){function t(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e}function i(e){return Array.isArray(e)}function n(e,s){if(e===s)return!0;if(t(e)||t(s))return!1;let r=i(e),o=i(s);return r===o&&(r&&o?function(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let i=0,s=e.length;i>>0),e[i]=255&t,t>>>=8}e.Random=void 0,(e.Random||(e.Random={})).getRandomValues=(()=>{const e="undefined"!=typeof window&&(window.crypto||window.msCrypto)||null;return e&&"function"==typeof e.getRandomValues?function(t){return e.getRandomValues(t)}:t})(),e.UUID=void 0,(e.UUID||(e.UUID={})).uuid4=function(e){const t=new Uint8Array(16),i=new Array(256);for(let e=0;e<16;++e)i[e]="0"+e.toString(16);for(let e=16;e<256;++e)i[e]=e.toString(16);return function(){return e(t),t[6]=64|15&t[6],t[8]=128|63&t[8],i[t[0]]+i[t[1]]+i[t[2]]+i[t[3]]+"-"+i[t[4]]+i[t[5]]+"-"+i[t[6]]+i[t[7]]+"-"+i[t[8]]+i[t[9]]+"-"+i[t[10]]+i[t[11]]+i[t[12]]+i[t[13]]+i[t[14]]+i[t[15]]}}(e.Random.getRandomValues),e.MimeData=class{constructor(){this._types=[],this._values=[]}types(){return this._types.slice()}hasData(e){return-1!==this._types.indexOf(e)}getData(e){let t=this._types.indexOf(e);return-1!==t?this._values[t]:void 0}setData(e,t){this.clearData(e),this._types.push(e),this._values.push(t)}clearData(e){let t=this._types.indexOf(e);-1!==t&&(this._types.splice(t,1),this._values.splice(t,1))}clear(){this._types.length=0,this._values.length=0}},e.PromiseDelegate=class{constructor(){this.promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}resolve(e){(0,this._resolve)(e)}reject(e){(0,this._reject)(e)}},e.Token=class{constructor(e,t){this.name=e,this.description=null!=t?t:"",this._tokenStructuralPropertyT=null}}}(t)},1122:(e,t,i)=>{"use strict";i.r(t),i.d(t,{DisposableDelegate:()=>s,DisposableSet:()=>o,ObservableDisposableDelegate:()=>r,ObservableDisposableSet:()=>a});var n=i(6424);class s{constructor(e){this._fn=e}get isDisposed(){return!this._fn}dispose(){if(!this._fn)return;let e=this._fn;this._fn=null,e()}}class r extends s{constructor(){super(...arguments),this._disposed=new n.Signal(this)}get disposed(){return this._disposed}dispose(){this.isDisposed||(super.dispose(),this._disposed.emit(void 0),n.Signal.clearData(this))}}class o{constructor(){this._isDisposed=!1,this._items=new Set}get isDisposed(){return this._isDisposed}dispose(){this._isDisposed||(this._isDisposed=!0,this._items.forEach((e=>{e.dispose()})),this._items.clear())}contains(e){return this._items.has(e)}add(e){this._items.add(e)}remove(e){this._items.delete(e)}clear(){this._items.clear()}}!function(e){e.from=function(t){let i=new e;for(const e of t)i.add(e);return i}}(o||(o={}));class a extends o{constructor(){super(...arguments),this._disposed=new n.Signal(this)}get disposed(){return this._disposed}dispose(){this.isDisposed||(super.dispose(),this._disposed.emit(void 0),n.Signal.clearData(this))}}!function(e){e.from=function(t){let i=new e;for(const e of t)i.add(e);return i}}(a||(a={}))},9044:(e,t,i)=>{"use strict";i.r(t),i.d(t,{Debouncer:()=>l,Poll:()=>o,RateLimiter:()=>a,Throttler:()=>h});var n,s=i(3911),r=i(6424);class o{constructor(e){var t;this._disposed=new r.Signal(this),this._lingered=0,this._tick=new s.PromiseDelegate,this._ticked=new r.Signal(this),this._factory=e.factory,this._linger=null!==(t=e.linger)&&void 0!==t?t:n.DEFAULT_LINGER,this._standby=e.standby||n.DEFAULT_STANDBY,this._state={...n.DEFAULT_STATE,timestamp:(new Date).getTime()};const i=e.frequency||{},o=Math.max(i.interval||0,i.max||0,n.DEFAULT_FREQUENCY.max);this.frequency={...n.DEFAULT_FREQUENCY,...i,max:o},this.name=e.name||n.DEFAULT_NAME,"auto"in e&&!e.auto||setTimeout((()=>this.start()))}get disposed(){return this._disposed}get frequency(){return this._frequency}set frequency(e){if(this.isDisposed||s.JSONExt.deepEqual(e,this.frequency||{}))return;let{backoff:t,interval:i,max:n}=e;if(i=Math.round(i),n=Math.round(n),"number"==typeof t&&t<1)throw new Error("Poll backoff growth factor must be at least 1");if((i<0||i>n)&&i!==o.NEVER)throw new Error("Poll interval must be between 0 and max");if(n>o.MAX_INTERVAL&&n!==o.NEVER)throw new Error(`Max interval must be less than ${o.MAX_INTERVAL}`);this._frequency={backoff:t,interval:i,max:n}}get isDisposed(){return"disposed"===this.state.phase}get standby(){return this._standby}set standby(e){this.isDisposed||this.standby===e||(this._standby=e)}get state(){return this._state}get tick(){return this._tick.promise}get ticked(){return this._ticked}async*[Symbol.asyncIterator](){for(;!this.isDisposed;)yield this.state,await this.tick.catch((()=>{}))}dispose(){this.isDisposed||(this._state={...n.DISPOSED_STATE,timestamp:(new Date).getTime()},this._tick.promise.catch((e=>{})),this._tick.reject(new Error(`Poll (${this.name}) is disposed.`)),this._disposed.emit(void 0),r.Signal.clearData(this))}refresh(){return this.schedule({cancel:({phase:e})=>"refreshed"===e,interval:o.IMMEDIATE,phase:"refreshed"})}async schedule(e={}){if(this.isDisposed)return;if(e.cancel&&e.cancel(this.state))return;const t=this._tick,i=new s.PromiseDelegate,n={interval:this.frequency.interval,payload:null,phase:"standby",timestamp:(new Date).getTime(),...e};this._state=n,this._tick=i,clearTimeout(this._timeout),this._ticked.emit(this.state),t.resolve(this),await t.promise,n.interval!==o.NEVER?this._timeout=setTimeout((()=>{this.isDisposed||this.tick!==i.promise||this._execute()}),n.interval):this._timeout=void 0}start(){return this.schedule({cancel:({phase:e})=>"constructed"!==e&&"standby"!==e&&"stopped"!==e,interval:o.IMMEDIATE,phase:"started"})}stop(){return this.schedule({cancel:({phase:e})=>"stopped"===e,interval:o.NEVER,phase:"stopped"})}get hidden(){return n.hidden}_execute(){let e="function"==typeof this.standby?this.standby():this.standby;if("never"===e?e=!1:"when-hidden"===e&&(this.hidden?e=++this._lingered>this._linger:(this._lingered=0,e=!1)),e)return void this.schedule();const t=this.tick;this._factory(this.state).then((e=>{this.isDisposed||this.tick!==t||this.schedule({payload:e,phase:"rejected"===this.state.phase?"reconnected":"resolved"})})).catch((e=>{this.isDisposed||this.tick!==t||this.schedule({interval:n.sleep(this.frequency,this.state),payload:e,phase:"rejected"})}))}}!function(e){e.IMMEDIATE=0,e.MAX_INTERVAL=2147483647,e.NEVER=1/0}(o||(o={})),function(e){e.DEFAULT_BACKOFF=3,e.DEFAULT_FREQUENCY={backoff:!0,interval:1e3,max:3e4},e.DEFAULT_LINGER=1,e.DEFAULT_NAME="unknown",e.DEFAULT_STANDBY="when-hidden",e.DEFAULT_STATE={interval:o.NEVER,payload:null,phase:"constructed",timestamp:new Date(0).getTime()},e.DISPOSED_STATE={interval:o.NEVER,payload:null,phase:"disposed",timestamp:new Date(0).getTime()},e.sleep=function(t,i){const{backoff:n,interval:s,max:r}=t;if(s===o.NEVER)return s;const a=!0===n?e.DEFAULT_BACKOFF:!1===n?1:n,l=function(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e+1))+e}(s,i.interval*a);return Math.min(r,l)},e.hidden="undefined"!=typeof document&&(document.addEventListener("visibilitychange",(()=>{e.hidden="hidden"===document.visibilityState})),document.addEventListener("pagehide",(()=>{e.hidden="hidden"===document.visibilityState})),"hidden"===document.visibilityState)}(n||(n={}));class a{constructor(e,t=500){this.args=void 0,this.payload=null,this.limit=t,this.poll=new o({auto:!1,factory:async()=>{const{args:t}=this;return this.args=void 0,e(...t)},frequency:{backoff:!1,interval:o.NEVER,max:o.NEVER},standby:"never"}),this.payload=new s.PromiseDelegate,this.poll.ticked.connect(((e,t)=>{const{payload:i}=this;return"resolved"===t.phase?(this.payload=new s.PromiseDelegate,void i.resolve(t.payload)):"rejected"===t.phase||"stopped"===t.phase?(this.payload=new s.PromiseDelegate,i.promise.catch((e=>{})),void i.reject(t.payload)):void 0}),this)}get isDisposed(){return null===this.payload}dispose(){this.isDisposed||(this.args=void 0,this.payload=null,this.poll.dispose())}async stop(){return this.poll.stop()}}class l extends a{invoke(...e){return this.args=e,this.poll.schedule({interval:this.limit,phase:"invoked"}),this.payload.promise}}class h extends a{constructor(e,t){super(e,"number"==typeof t?t:t&&t.limit),this._trailing=!1,"number"!=typeof t&&t&&"trailing"===t.edge&&(this._trailing=!0),this._interval=this._trailing?this.limit:o.IMMEDIATE}invoke(...e){const t="invoked"!==this.poll.state.phase;return(t||this._trailing)&&(this.args=e),t&&this.poll.schedule({interval:this._interval,phase:"invoked"}),this.payload.promise}}},4050:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AttachedProperty:()=>n});class n{constructor(e){this._pid=s.nextPID(),this.name=e.name,this._create=e.create,this._coerce=e.coerce||null,this._compare=e.compare||null,this._changed=e.changed||null}get(e){let t,i=s.ensureMap(e);return t=this._pid in i?i[this._pid]:i[this._pid]=this._createValue(e),t}set(e,t){let i,n=s.ensureMap(e);i=this._pid in n?n[this._pid]:n[this._pid]=this._createValue(e);let r=this._coerceValue(e,t);this._maybeNotify(e,i,n[this._pid]=r)}coerce(e){let t,i=s.ensureMap(e);t=this._pid in i?i[this._pid]:i[this._pid]=this._createValue(e);let n=this._coerceValue(e,t);this._maybeNotify(e,t,i[this._pid]=n)}_createValue(e){return(0,this._create)(e)}_coerceValue(e,t){let i=this._coerce;return i?i(e,t):t}_compareValue(e,t){let i=this._compare;return i?i(e,t):e===t}_maybeNotify(e,t,i){let n=this._changed;n&&!this._compareValue(t,i)&&n(e,t,i)}}var s;!function(e){e.clearData=function(e){s.ownerData.delete(e)}}(n||(n={})),function(e){e.ownerData=new WeakMap,e.nextPID=(()=>{let e=0;return()=>`pid-${`${Math.random()}`.slice(2)}-${e++}`})(),e.ensureMap=function(t){let i=e.ownerData.get(t);return i||(i=Object.create(null),e.ownerData.set(t,i),i)}}(s||(s={}))},6424:(e,t,i)=>{"use strict";i.r(t),i.d(t,{Signal:()=>o,Stream:()=>a});var n,s=i(7564),r=i(3911);class o{constructor(e){this.sender=e}connect(e,t){return n.connect(this,e,t)}disconnect(e,t){return n.disconnect(this,e,t)}emit(e){n.emit(this,e)}}!function(e){e.disconnectBetween=function(e,t){n.disconnectBetween(e,t)},e.disconnectSender=function(e){n.disconnectSender(e)},e.disconnectReceiver=function(e){n.disconnectReceiver(e)},e.disconnectAll=function(e){n.disconnectAll(e)},e.clearData=function(e){n.disconnectAll(e)},e.getExceptionHandler=function(){return n.exceptionHandler},e.setExceptionHandler=function(e){let t=n.exceptionHandler;return n.exceptionHandler=e,t}}(o||(o={}));class a extends o{constructor(){super(...arguments),this._pending=new r.PromiseDelegate}async*[Symbol.asyncIterator](){let e=this._pending;for(;;)try{const{args:t,next:i}=await e.promise;e=i,yield t}catch(e){return}}emit(e){const t=this._pending,i=this._pending=new r.PromiseDelegate;t.resolve({args:e,next:i}),super.emit(e)}stop(){this._pending.promise.catch((()=>{})),this._pending.reject("stop"),this._pending=new r.PromiseDelegate}}!function(e){function t(e){let t=n.get(e);if(t&&0!==t.length){for(const e of t){if(!e.signal)continue;let t=e.thisArg||e.slot;e.signal=null,c(r.get(t))}c(t)}}function i(e){let t=r.get(e);if(t&&0!==t.length){for(const e of t){if(!e.signal)continue;let t=e.signal.sender;e.signal=null,c(n.get(t))}c(t)}}e.exceptionHandler=e=>{console.error(e)},e.connect=function(e,t,i){i=i||void 0;let s=n.get(e.sender);if(s||(s=[],n.set(e.sender,s)),l(s,e,t,i))return!1;let o=i||t,a=r.get(o);a||(a=[],r.set(o,a));let h={signal:e,slot:t,thisArg:i};return s.push(h),a.push(h),!0},e.disconnect=function(e,t,i){i=i||void 0;let s=n.get(e.sender);if(!s||0===s.length)return!1;let o=l(s,e,t,i);if(!o)return!1;let a=i||t,h=r.get(a);return o.signal=null,c(s),c(h),!0},e.disconnectBetween=function(e,t){let i=n.get(e);if(!i||0===i.length)return;let s=r.get(t);if(s&&0!==s.length){for(const t of s)t.signal&&t.signal.sender===e&&(t.signal=null);c(i),c(s)}},e.disconnectSender=t,e.disconnectReceiver=i,e.disconnectAll=function(e){t(e),i(e)},e.emit=function(e,t){let i=n.get(e.sender);if(i&&0!==i.length)for(let n=0,s=i.length;ne.signal===t&&e.slot===i&&e.thisArg===n))}function h(t,i){let{signal:n,slot:s,thisArg:r}=t;try{s.call(r,n.sender,i)}catch(t){e.exceptionHandler(t)}}function c(e){0===o.size&&a(d),o.add(e)}function d(){o.forEach(u),o.clear()}function u(e){s.RO.removeAllWhere(e,p)}function p(e){return null===e.signal}}(n||(n={}))},2454:e=>{"use strict";var t=function(e){return function(e){return!!e&&"object"==typeof e}(e)&&!function(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||function(e){return e.$$typeof===i}(e)}(e)},i="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a((i=e,Array.isArray(i)?[]:{}),e,t):e;var i}function s(e,t,i){return e.concat(t).map((function(e){return n(e,i)}))}function r(e){return Object.keys(e).concat(function(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter((function(t){return Object.propertyIsEnumerable.call(e,t)})):[]}(e))}function o(e,t){try{return t in e}catch(e){return!1}}function a(e,i,l){(l=l||{}).arrayMerge=l.arrayMerge||s,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var h=Array.isArray(i);return h===Array.isArray(e)?h?l.arrayMerge(e,i,l):function(e,t,i){var s={};return i.isMergeableObject(e)&&r(e).forEach((function(t){s[t]=n(e[t],i)})),r(t).forEach((function(r){(function(e,t){return o(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))})(e,r)||(o(e,r)&&i.isMergeableObject(t[r])?s[r]=function(e,t){if(!t.customMerge)return a;var i=t.customMerge(e);return"function"==typeof i?i:a}(r,i)(e[r],t[r],i):s[r]=n(t[r],i))})),s}(e,i,l):n(i,l)}a.all=function(e,t){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce((function(e,i){return a(e,i,t)}),{})};var l=a;e.exports=l},8002:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.attributeNames=t.elementNames=void 0,t.elementNames=new Map([["altglyph","altGlyph"],["altglyphdef","altGlyphDef"],["altglyphitem","altGlyphItem"],["animatecolor","animateColor"],["animatemotion","animateMotion"],["animatetransform","animateTransform"],["clippath","clipPath"],["feblend","feBlend"],["fecolormatrix","feColorMatrix"],["fecomponenttransfer","feComponentTransfer"],["fecomposite","feComposite"],["feconvolvematrix","feConvolveMatrix"],["fediffuselighting","feDiffuseLighting"],["fedisplacementmap","feDisplacementMap"],["fedistantlight","feDistantLight"],["fedropshadow","feDropShadow"],["feflood","feFlood"],["fefunca","feFuncA"],["fefuncb","feFuncB"],["fefuncg","feFuncG"],["fefuncr","feFuncR"],["fegaussianblur","feGaussianBlur"],["feimage","feImage"],["femerge","feMerge"],["femergenode","feMergeNode"],["femorphology","feMorphology"],["feoffset","feOffset"],["fepointlight","fePointLight"],["fespecularlighting","feSpecularLighting"],["fespotlight","feSpotLight"],["fetile","feTile"],["feturbulence","feTurbulence"],["foreignobject","foreignObject"],["glyphref","glyphRef"],["lineargradient","linearGradient"],["radialgradient","radialGradient"],["textpath","textPath"]]),t.attributeNames=new Map([["definitionurl","definitionURL"],["attributename","attributeName"],["attributetype","attributeType"],["basefrequency","baseFrequency"],["baseprofile","baseProfile"],["calcmode","calcMode"],["clippathunits","clipPathUnits"],["diffuseconstant","diffuseConstant"],["edgemode","edgeMode"],["filterunits","filterUnits"],["glyphref","glyphRef"],["gradienttransform","gradientTransform"],["gradientunits","gradientUnits"],["kernelmatrix","kernelMatrix"],["kernelunitlength","kernelUnitLength"],["keypoints","keyPoints"],["keysplines","keySplines"],["keytimes","keyTimes"],["lengthadjust","lengthAdjust"],["limitingconeangle","limitingConeAngle"],["markerheight","markerHeight"],["markerunits","markerUnits"],["markerwidth","markerWidth"],["maskcontentunits","maskContentUnits"],["maskunits","maskUnits"],["numoctaves","numOctaves"],["pathlength","pathLength"],["patterncontentunits","patternContentUnits"],["patterntransform","patternTransform"],["patternunits","patternUnits"],["pointsatx","pointsAtX"],["pointsaty","pointsAtY"],["pointsatz","pointsAtZ"],["preservealpha","preserveAlpha"],["preserveaspectratio","preserveAspectRatio"],["primitiveunits","primitiveUnits"],["refx","refX"],["refy","refY"],["repeatcount","repeatCount"],["repeatdur","repeatDur"],["requiredextensions","requiredExtensions"],["requiredfeatures","requiredFeatures"],["specularconstant","specularConstant"],["specularexponent","specularExponent"],["spreadmethod","spreadMethod"],["startoffset","startOffset"],["stddeviation","stdDeviation"],["stitchtiles","stitchTiles"],["surfacescale","surfaceScale"],["systemlanguage","systemLanguage"],["tablevalues","tableValues"],["targetx","targetX"],["targety","targetY"],["textlength","textLength"],["viewbox","viewBox"],["viewtarget","viewTarget"],["xchannelselector","xChannelSelector"],["ychannelselector","yChannelSelector"],["zoomandpan","zoomAndPan"]])},2721:function(e,t,i){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,i=1,n=arguments.length;i";case a.Comment:return"\x3c!--"+e.data+"--\x3e";case a.CDATA:return function(e){return""}(e);case a.Script:case a.Style:case a.Tag:return function(e,t){var i;"foreign"===t.xmlMode&&(e.name=null!==(i=h.elementNames.get(e.name))&&void 0!==i?i:e.name,e.parent&&f.has(e.parent.name)&&(t=n(n({},t),{xmlMode:!1}))),!t.xmlMode&&m.has(e.name)&&(t=n(n({},t),{xmlMode:"foreign"}));var s="<"+e.name,r=function(e,t){if(e)return Object.keys(e).map((function(i){var n,s,r=null!==(n=e[i])&&void 0!==n?n:"";return"foreign"===t.xmlMode&&(i=null!==(s=h.attributeNames.get(i))&&void 0!==s?s:i),t.emptyAttrs||t.xmlMode||""!==r?i+'="'+(!1!==t.decodeEntities?l.encodeXML(r):r.replace(/"/g,"""))+'"':i})).join(" ")}(e.attribs,t);return r&&(s+=" "+r),0===e.children.length&&(t.xmlMode?!1!==t.selfClosingTags:t.selfClosingTags&&d.has(e.name))?(t.xmlMode||(s+=" "),s+="/>"):(s+=">",e.children.length>0&&(s+=u(e.children,t)),!t.xmlMode&&d.has(e.name)||(s+="")),s}(e,t);case a.Text:return function(e,t){var i=e.data||"";return!1===t.decodeEntities||!t.xmlMode&&e.parent&&c.has(e.parent.name)||(i=l.encodeXML(i)),i}(e,t)}}t.default=u;var f=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"]),m=new Set(["svg","math"])},3706:(e,t)=>{"use strict";var i;Object.defineProperty(t,"__esModule",{value:!0}),t.Doctype=t.CDATA=t.Tag=t.Style=t.Script=t.Comment=t.Directive=t.Text=t.Root=t.isTag=t.ElementType=void 0,function(e){e.Root="root",e.Text="text",e.Directive="directive",e.Comment="comment",e.Script="script",e.Style="style",e.Tag="tag",e.CDATA="cdata",e.Doctype="doctype"}(i=t.ElementType||(t.ElementType={})),t.isTag=function(e){return e.type===i.Tag||e.type===i.Script||e.type===i.Style},t.Root=i.Root,t.Text=i.Text,t.Directive=i.Directive,t.Comment=i.Comment,t.Script=i.Script,t.Style=i.Style,t.Tag=i.Tag,t.CDATA=i.CDATA,t.Doctype=i.Doctype},9425:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),t.DomHandler=void 0;var r=i(3706),o=i(4862);s(i(4862),t);var a=/\s+/g,l={normalizeWhitespace:!1,withStartIndices:!1,withEndIndices:!1,xmlMode:!1},h=function(){function e(e,t,i){this.dom=[],this.root=new o.Document(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null,"function"==typeof t&&(i=t,t=l),"object"==typeof e&&(t=e,e=void 0),this.callback=null!=e?e:null,this.options=null!=t?t:l,this.elementCB=null!=i?i:null}return e.prototype.onparserinit=function(e){this.parser=e},e.prototype.onreset=function(){this.dom=[],this.root=new o.Document(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null},e.prototype.onend=function(){this.done||(this.done=!0,this.parser=null,this.handleCallback(null))},e.prototype.onerror=function(e){this.handleCallback(e)},e.prototype.onclosetag=function(){this.lastNode=null;var e=this.tagStack.pop();this.options.withEndIndices&&(e.endIndex=this.parser.endIndex),this.elementCB&&this.elementCB(e)},e.prototype.onopentag=function(e,t){var i=this.options.xmlMode?r.ElementType.Tag:void 0,n=new o.Element(e,t,void 0,i);this.addNode(n),this.tagStack.push(n)},e.prototype.ontext=function(e){var t=this.options.normalizeWhitespace,i=this.lastNode;if(i&&i.type===r.ElementType.Text)t?i.data=(i.data+e).replace(a," "):i.data+=e,this.options.withEndIndices&&(i.endIndex=this.parser.endIndex);else{t&&(e=e.replace(a," "));var n=new o.Text(e);this.addNode(n),this.lastNode=n}},e.prototype.oncomment=function(e){if(this.lastNode&&this.lastNode.type===r.ElementType.Comment)this.lastNode.data+=e;else{var t=new o.Comment(e);this.addNode(t),this.lastNode=t}},e.prototype.oncommentend=function(){this.lastNode=null},e.prototype.oncdatastart=function(){var e=new o.Text(""),t=new o.NodeWithChildren(r.ElementType.CDATA,[e]);this.addNode(t),e.parent=t,this.lastNode=e},e.prototype.oncdataend=function(){this.lastNode=null},e.prototype.onprocessinginstruction=function(e,t){var i=new o.ProcessingInstruction(e,t);this.addNode(i)},e.prototype.handleCallback=function(e){if("function"==typeof this.callback)this.callback(e,this.dom);else if(e)throw e},e.prototype.addNode=function(e){var t=this.tagStack[this.tagStack.length-1],i=t.children[t.children.length-1];this.options.withStartIndices&&(e.startIndex=this.parser.startIndex),this.options.withEndIndices&&(e.endIndex=this.parser.endIndex),t.children.push(e),i&&(e.prev=i,i.next=e),e.parent=t,this.lastNode=null},e}();t.DomHandler=h,t.default=h},4862:function(e,t,i){"use strict";var n,s=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,i=1,n=arguments.length;i0?this.children[this.children.length-1]:null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"childNodes",{get:function(){return this.children},set:function(e){this.children=e},enumerable:!1,configurable:!0}),t}(l);t.NodeWithChildren=p;var f=function(e){function t(t){return e.call(this,o.ElementType.Root,t)||this}return s(t,e),t}(p);t.Document=f;var m=function(e){function t(t,i,n,s){void 0===n&&(n=[]),void 0===s&&(s="script"===t?o.ElementType.Script:"style"===t?o.ElementType.Style:o.ElementType.Tag);var r=e.call(this,s,n)||this;return r.name=t,r.attribs=i,r}return s(t,e),Object.defineProperty(t.prototype,"tagName",{get:function(){return this.name},set:function(e){this.name=e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"attributes",{get:function(){var e=this;return Object.keys(this.attribs).map((function(t){var i,n;return{name:t,value:e.attribs[t],namespace:null===(i=e["x-attribsNamespace"])||void 0===i?void 0:i[t],prefix:null===(n=e["x-attribsPrefix"])||void 0===n?void 0:n[t]}}))},enumerable:!1,configurable:!0}),t}(p);function g(e){return(0,o.isTag)(e)}function v(e){return e.type===o.ElementType.CDATA}function O(e){return e.type===o.ElementType.Text}function b(e){return e.type===o.ElementType.Comment}function _(e){return e.type===o.ElementType.Directive}function y(e){return e.type===o.ElementType.Root}function w(e,t){var i;if(void 0===t&&(t=!1),O(e))i=new c(e.data);else if(b(e))i=new d(e.data);else if(g(e)){var n=t?x(e.children):[],s=new m(e.name,r({},e.attribs),n);n.forEach((function(e){return e.parent=s})),null!=e.namespace&&(s.namespace=e.namespace),e["x-attribsNamespace"]&&(s["x-attribsNamespace"]=r({},e["x-attribsNamespace"])),e["x-attribsPrefix"]&&(s["x-attribsPrefix"]=r({},e["x-attribsPrefix"])),i=s}else if(v(e)){n=t?x(e.children):[];var a=new p(o.ElementType.CDATA,n);n.forEach((function(e){return e.parent=a})),i=a}else if(y(e)){n=t?x(e.children):[];var l=new f(n);n.forEach((function(e){return e.parent=l})),e["x-mode"]&&(l["x-mode"]=e["x-mode"]),i=l}else{if(!_(e))throw new Error("Not implemented yet: ".concat(e.type));var h=new u(e.name,e.data);null!=e["x-name"]&&(h["x-name"]=e["x-name"],h["x-publicId"]=e["x-publicId"],h["x-systemId"]=e["x-systemId"]),i=h}return i.startIndex=e.startIndex,i.endIndex=e.endIndex,null!=e.sourceCodeLocation&&(i.sourceCodeLocation=e.sourceCodeLocation),i}function x(e){for(var t=e.map((function(e){return w(e,!0)})),i=1;i{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getFeed=void 0;var n=i(3017),s=i(9319);t.getFeed=function(e){var t=l(d,e);return t?"feed"===t.name?function(e){var t,i=e.children,n={type:"atom",items:(0,s.getElementsByTagName)("entry",i).map((function(e){var t,i=e.children,n={media:a(i)};c(n,"id","id",i),c(n,"title","title",i);var s=null===(t=l("link",i))||void 0===t?void 0:t.attribs.href;s&&(n.link=s);var r=h("summary",i)||h("content",i);r&&(n.description=r);var o=h("updated",i);return o&&(n.pubDate=new Date(o)),n}))};c(n,"id","id",i),c(n,"title","title",i);var r=null===(t=l("link",i))||void 0===t?void 0:t.attribs.href;r&&(n.link=r),c(n,"description","subtitle",i);var o=h("updated",i);return o&&(n.updated=new Date(o)),c(n,"author","email",i,!0),n}(t):function(e){var t,i,n=null!==(i=null===(t=l("channel",e.children))||void 0===t?void 0:t.children)&&void 0!==i?i:[],r={type:e.name.substr(0,3),id:"",items:(0,s.getElementsByTagName)("item",e.children).map((function(e){var t=e.children,i={media:a(t)};c(i,"id","guid",t),c(i,"title","title",t),c(i,"link","link",t),c(i,"description","description",t);var n=h("pubDate",t);return n&&(i.pubDate=new Date(n)),i}))};c(r,"title","title",n),c(r,"link","link",n),c(r,"description","description",n);var o=h("lastBuildDate",n);return o&&(r.updated=new Date(o)),c(r,"author","managingEditor",n,!0),r}(t):null};var r=["url","type","lang"],o=["fileSize","bitrate","framerate","samplingrate","channels","duration","height","width"];function a(e){return(0,s.getElementsByTagName)("media:content",e).map((function(e){for(var t=e.attribs,i={medium:t.medium,isDefault:!!t.isDefault},n=0,s=r;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.uniqueSort=t.compareDocumentPosition=t.removeSubsets=void 0;var n=i(9425);function s(e,t){var i=[],s=[];if(e===t)return 0;for(var r=(0,n.hasChildren)(e)?e:e.parent;r;)i.unshift(r),r=r.parent;for(r=(0,n.hasChildren)(t)?t:t.parent;r;)s.unshift(r),r=r.parent;for(var o=Math.min(i.length,s.length),a=0;ah.indexOf(d)?l===t?20:4:l===e?10:2}t.removeSubsets=function(e){for(var t=e.length;--t>=0;){var i=e[t];if(t>0&&e.lastIndexOf(i,t-1)>=0)e.splice(t,1);else for(var n=i.parent;n;n=n.parent)if(e.includes(n)){e.splice(t,1);break}}return e},t.compareDocumentPosition=s,t.uniqueSort=function(e){return(e=e.filter((function(e,t,i){return!i.includes(e,t+1)}))).sort((function(e,t){var i=s(e,t);return 2&i?-1:4&i?1:0})),e}},5030:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[i]}})}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),t.hasChildren=t.isDocument=t.isComment=t.isText=t.isCDATA=t.isTag=void 0,s(i(3017),t),s(i(8563),t),s(i(378),t),s(i(1446),t),s(i(9319),t),s(i(6850),t),s(i(9904),t);var r=i(9425);Object.defineProperty(t,"isTag",{enumerable:!0,get:function(){return r.isTag}}),Object.defineProperty(t,"isCDATA",{enumerable:!0,get:function(){return r.isCDATA}}),Object.defineProperty(t,"isText",{enumerable:!0,get:function(){return r.isText}}),Object.defineProperty(t,"isComment",{enumerable:!0,get:function(){return r.isComment}}),Object.defineProperty(t,"isDocument",{enumerable:!0,get:function(){return r.isDocument}}),Object.defineProperty(t,"hasChildren",{enumerable:!0,get:function(){return r.hasChildren}})},9319:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getElementsByTagType=t.getElementsByTagName=t.getElementById=t.getElements=t.testElement=void 0;var n=i(9425),s=i(1446),r={tag_name:function(e){return"function"==typeof e?function(t){return(0,n.isTag)(t)&&e(t.name)}:"*"===e?n.isTag:function(t){return(0,n.isTag)(t)&&t.name===e}},tag_type:function(e){return"function"==typeof e?function(t){return e(t.type)}:function(t){return t.type===e}},tag_contains:function(e){return"function"==typeof e?function(t){return(0,n.isText)(t)&&e(t.data)}:function(t){return(0,n.isText)(t)&&t.data===e}}};function o(e,t){return"function"==typeof t?function(i){return(0,n.isTag)(i)&&t(i.attribs[e])}:function(i){return(0,n.isTag)(i)&&i.attribs[e]===t}}function a(e,t){return function(i){return e(i)||t(i)}}function l(e){var t=Object.keys(e).map((function(t){var i=e[t];return Object.prototype.hasOwnProperty.call(r,t)?r[t](i):o(t,i)}));return 0===t.length?null:t.reduce(a)}t.testElement=function(e,t){var i=l(e);return!i||i(t)},t.getElements=function(e,t,i,n){void 0===n&&(n=1/0);var r=l(e);return r?(0,s.filter)(r,t,i,n):[]},t.getElementById=function(e,t,i){return void 0===i&&(i=!0),Array.isArray(t)||(t=[t]),(0,s.findOne)(o("id",e),t,i)},t.getElementsByTagName=function(e,t,i,n){return void 0===i&&(i=!0),void 0===n&&(n=1/0),(0,s.filter)(r.tag_name(e),t,i,n)},t.getElementsByTagType=function(e,t,i,n){return void 0===i&&(i=!0),void 0===n&&(n=1/0),(0,s.filter)(r.tag_type(e),t,i,n)}},378:(e,t)=>{"use strict";function i(e){if(e.prev&&(e.prev.next=e.next),e.next&&(e.next.prev=e.prev),e.parent){var t=e.parent.children;t.splice(t.lastIndexOf(e),1)}}Object.defineProperty(t,"__esModule",{value:!0}),t.prepend=t.prependChild=t.append=t.appendChild=t.replaceElement=t.removeElement=void 0,t.removeElement=i,t.replaceElement=function(e,t){var i=t.prev=e.prev;i&&(i.next=t);var n=t.next=e.next;n&&(n.prev=t);var s=t.parent=e.parent;if(s){var r=s.children;r[r.lastIndexOf(e)]=t}},t.appendChild=function(e,t){if(i(t),t.next=null,t.parent=e,e.children.push(t)>1){var n=e.children[e.children.length-2];n.next=t,t.prev=n}else t.prev=null},t.append=function(e,t){i(t);var n=e.parent,s=e.next;if(t.next=s,t.prev=e,e.next=t,t.parent=n,s){if(s.prev=t,n){var r=n.children;r.splice(r.lastIndexOf(s),0,t)}}else n&&n.children.push(t)},t.prependChild=function(e,t){if(i(t),t.parent=e,t.prev=null,1!==e.children.unshift(t)){var n=e.children[1];n.prev=t,t.next=n}else t.next=null},t.prepend=function(e,t){i(t);var n=e.parent;if(n){var s=n.children;s.splice(s.indexOf(e),0,t)}e.prev&&(e.prev.next=t),t.parent=n,t.prev=e.prev,t.next=e,e.prev=t}},1446:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.findAll=t.existsOne=t.findOne=t.findOneChild=t.find=t.filter=void 0;var n=i(9425);function s(e,t,i,r){for(var o=[],a=0,l=t;a0){var c=s(e,h.children,i,r);if(o.push.apply(o,c),(r-=c.length)<=0)break}}return o}t.filter=function(e,t,i,n){return void 0===i&&(i=!0),void 0===n&&(n=1/0),Array.isArray(t)||(t=[t]),s(e,t,i,n)},t.find=s,t.findOneChild=function(e,t){return t.find(e)},t.findOne=function e(t,i,s){void 0===s&&(s=!0);for(var r=null,o=0;o0&&(r=e(t,a.children)))}return r},t.existsOne=function e(t,i){return i.some((function(i){return(0,n.isTag)(i)&&(t(i)||i.children.length>0&&e(t,i.children))}))},t.findAll=function(e,t){for(var i,s,r=[],o=t.filter(n.isTag);s=o.shift();){var a=null===(i=s.children)||void 0===i?void 0:i.filter(n.isTag);a&&a.length>0&&o.unshift.apply(o,a),e(s)&&r.push(s)}return r}},3017:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.innerText=t.textContent=t.getText=t.getInnerHTML=t.getOuterHTML=void 0;var s=i(9425),r=n(i(2721)),o=i(3706);function a(e,t){return(0,r.default)(e,t)}t.getOuterHTML=a,t.getInnerHTML=function(e,t){return(0,s.hasChildren)(e)?e.children.map((function(e){return a(e,t)})).join(""):""},t.getText=function e(t){return Array.isArray(t)?t.map(e).join(""):(0,s.isTag)(t)?"br"===t.name?"\n":e(t.children):(0,s.isCDATA)(t)?e(t.children):(0,s.isText)(t)?t.data:""},t.textContent=function e(t){return Array.isArray(t)?t.map(e).join(""):(0,s.hasChildren)(t)&&!(0,s.isComment)(t)?e(t.children):(0,s.isText)(t)?t.data:""},t.innerText=function e(t){return Array.isArray(t)?t.map(e).join(""):(0,s.hasChildren)(t)&&(t.type===o.ElementType.Tag||(0,s.isCDATA)(t))?e(t.children):(0,s.isText)(t)?t.data:""}},8563:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.prevElementSibling=t.nextElementSibling=t.getName=t.hasAttrib=t.getAttributeValue=t.getSiblings=t.getParent=t.getChildren=void 0;var n=i(9425),s=[];function r(e){var t;return null!==(t=e.children)&&void 0!==t?t:s}function o(e){return e.parent||null}t.getChildren=r,t.getParent=o,t.getSiblings=function(e){var t=o(e);if(null!=t)return r(t);for(var i=[e],n=e.prev,s=e.next;null!=n;)i.unshift(n),n=n.prev;for(;null!=s;)i.push(s),s=s.next;return i},t.getAttributeValue=function(e,t){var i;return null===(i=e.attribs)||void 0===i?void 0:i[t]},t.hasAttrib=function(e,t){return null!=e.attribs&&Object.prototype.hasOwnProperty.call(e.attribs,t)&&null!=e.attribs[t]},t.getName=function(e){return e.name},t.nextElementSibling=function(e){for(var t=e.next;null!==t&&!(0,n.isTag)(t);)t=t.next;return t},t.prevElementSibling=function(e){for(var t=e.prev;null!==t&&!(0,n.isTag)(t);)t=t.prev;return t}},4080:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.decodeHTML=t.decodeHTMLStrict=t.decodeXML=void 0;var s=n(i(2810)),r=n(i(2836)),o=n(i(8689)),a=n(i(7826)),l=/&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;function h(e){var t=d(e);return function(e){return String(e).replace(l,t)}}t.decodeXML=h(o.default),t.decodeHTMLStrict=h(s.default);var c=function(e,t){return e65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+String.fromCharCode(e)};t.default=function(e){return e>=55296&&e<=57343||e>1114111?"�":(e in s.default&&(e=s.default[e]),r(e))}},956:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=void 0;var s=c(n(i(8689)).default),r=d(s);t.encodeXML=g(s);var o,a,l=c(n(i(2810)).default),h=d(l);function c(e){return Object.keys(e).sort().reduce((function(t,i){return t[e[i]]="&"+i+";",t}),{})}function d(e){for(var t=[],i=[],n=0,s=Object.keys(e);n1?p(e):e.charCodeAt(0)).toString(16).toUpperCase()+";"}var m=new RegExp(r.source+"|"+u.source,"g");function g(e){return function(t){return t.replace(m,(function(t){return e[t]||f(t)}))}}t.escape=function(e){return e.replace(m,f)},t.escapeUTF8=function(e){return e.replace(r,f)}},2593:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXMLStrict=t.decodeHTML5Strict=t.decodeHTML4Strict=t.decodeHTML5=t.decodeHTML4=t.decodeHTMLStrict=t.decodeHTML=t.decodeXML=t.encodeHTML5=t.encodeHTML4=t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=t.encode=t.decodeStrict=t.decode=void 0;var n=i(4080),s=i(956);t.decode=function(e,t){return(!t||t<=0?n.decodeXML:n.decodeHTML)(e)},t.decodeStrict=function(e,t){return(!t||t<=0?n.decodeXML:n.decodeHTMLStrict)(e)},t.encode=function(e,t){return(!t||t<=0?s.encodeXML:s.encodeHTML)(e)};var r=i(956);Object.defineProperty(t,"encodeXML",{enumerable:!0,get:function(){return r.encodeXML}}),Object.defineProperty(t,"encodeHTML",{enumerable:!0,get:function(){return r.encodeHTML}}),Object.defineProperty(t,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return r.encodeNonAsciiHTML}}),Object.defineProperty(t,"escape",{enumerable:!0,get:function(){return r.escape}}),Object.defineProperty(t,"escapeUTF8",{enumerable:!0,get:function(){return r.escapeUTF8}}),Object.defineProperty(t,"encodeHTML4",{enumerable:!0,get:function(){return r.encodeHTML}}),Object.defineProperty(t,"encodeHTML5",{enumerable:!0,get:function(){return r.encodeHTML}});var o=i(4080);Object.defineProperty(t,"decodeXML",{enumerable:!0,get:function(){return o.decodeXML}}),Object.defineProperty(t,"decodeHTML",{enumerable:!0,get:function(){return o.decodeHTML}}),Object.defineProperty(t,"decodeHTMLStrict",{enumerable:!0,get:function(){return o.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML4",{enumerable:!0,get:function(){return o.decodeHTML}}),Object.defineProperty(t,"decodeHTML5",{enumerable:!0,get:function(){return o.decodeHTML}}),Object.defineProperty(t,"decodeHTML4Strict",{enumerable:!0,get:function(){return o.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML5Strict",{enumerable:!0,get:function(){return o.decodeHTMLStrict}}),Object.defineProperty(t,"decodeXMLStrict",{enumerable:!0,get:function(){return o.decodeXML}})},3419:e=>{"use strict";e.exports=e=>{if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}},995:function(e,t,i){"use strict";var n,s=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),r=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[i]}})}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&r(t,e,i);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.parseFeed=t.FeedHandler=void 0;var h,c,d=l(i(9425)),u=a(i(5030)),p=i(7361);!function(e){e[e.image=0]="image",e[e.audio=1]="audio",e[e.video=2]="video",e[e.document=3]="document",e[e.executable=4]="executable"}(h||(h={})),function(e){e[e.sample=0]="sample",e[e.full=1]="full",e[e.nonstop=2]="nonstop"}(c||(c={}));var f=function(e){function t(t,i){return"object"==typeof t&&(i=t=void 0),e.call(this,t,i)||this}return s(t,e),t.prototype.onend=function(){var e,t,i=v(y,this.dom);if(i){var n={};if("feed"===i.name){var s=i.children;n.type="atom",_(n,"id","id",s),_(n,"title","title",s);var r=b("href",v("link",s));r&&(n.link=r),_(n,"description","subtitle",s),(o=O("updated",s))&&(n.updated=new Date(o)),_(n,"author","email",s,!0),n.items=g("entry",s).map((function(e){var t={},i=e.children;_(t,"id","id",i),_(t,"title","title",i);var n=b("href",v("link",i));n&&(t.link=n);var s=O("summary",i)||O("content",i);s&&(t.description=s);var r=O("updated",i);return r&&(t.pubDate=new Date(r)),t.media=m(i),t}))}else{var o;s=null!==(t=null===(e=v("channel",i.children))||void 0===e?void 0:e.children)&&void 0!==t?t:[],n.type=i.name.substr(0,3),n.id="",_(n,"title","title",s),_(n,"link","link",s),_(n,"description","description",s),(o=O("lastBuildDate",s))&&(n.updated=new Date(o)),_(n,"author","managingEditor",s,!0),n.items=g("item",i.children).map((function(e){var t={},i=e.children;_(t,"id","guid",i),_(t,"title","title",i),_(t,"link","link",i),_(t,"description","description",i);var n=O("pubDate",i);return n&&(t.pubDate=new Date(n)),t.media=m(i),t}))}this.feed=n,this.handleCallback(null)}else this.handleCallback(new Error("couldn't find root of feed"))},t}(d.default);function m(e){return g("media:content",e).map((function(e){var t={medium:e.attribs.medium,isDefault:!!e.attribs.isDefault};return e.attribs.url&&(t.url=e.attribs.url),e.attribs.fileSize&&(t.fileSize=parseInt(e.attribs.fileSize,10)),e.attribs.type&&(t.type=e.attribs.type),e.attribs.expression&&(t.expression=e.attribs.expression),e.attribs.bitrate&&(t.bitrate=parseInt(e.attribs.bitrate,10)),e.attribs.framerate&&(t.framerate=parseInt(e.attribs.framerate,10)),e.attribs.samplingrate&&(t.samplingrate=parseInt(e.attribs.samplingrate,10)),e.attribs.channels&&(t.channels=parseInt(e.attribs.channels,10)),e.attribs.duration&&(t.duration=parseInt(e.attribs.duration,10)),e.attribs.height&&(t.height=parseInt(e.attribs.height,10)),e.attribs.width&&(t.width=parseInt(e.attribs.width,10)),e.attribs.lang&&(t.lang=e.attribs.lang),t}))}function g(e,t){return u.getElementsByTagName(e,t,!0)}function v(e,t){return u.getElementsByTagName(e,t,!0,1)[0]}function O(e,t,i){return void 0===i&&(i=!1),u.getText(u.getElementsByTagName(e,t,i,1)).trim()}function b(e,t){return t?t.attribs[e]:null}function _(e,t,i,n,s){void 0===s&&(s=!1);var r=O(i,n,s);r&&(e[t]=r)}function y(e){return"rss"===e||"feed"===e||"rdf:RDF"===e}t.FeedHandler=f,t.parseFeed=function(e,t){void 0===t&&(t={xmlMode:!0});var i=new f(t);return new p.Parser(i,t).end(e),i.feed}},7361:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Parser=void 0;var s=n(i(1941)),r=new Set(["input","option","optgroup","select","button","datalist","textarea"]),o=new Set(["p"]),a={tr:new Set(["tr","th","td"]),th:new Set(["th"]),td:new Set(["thead","th","td"]),body:new Set(["head","link","script"]),li:new Set(["li"]),p:o,h1:o,h2:o,h3:o,h4:o,h5:o,h6:o,select:r,input:r,output:r,button:r,datalist:r,textarea:r,option:new Set(["option"]),optgroup:new Set(["optgroup","option"]),dd:new Set(["dt","dd"]),dt:new Set(["dt","dd"]),address:o,article:o,aside:o,blockquote:o,details:o,div:o,dl:o,fieldset:o,figcaption:o,figure:o,footer:o,form:o,header:o,hr:o,main:o,nav:o,ol:o,pre:o,section:o,table:o,ul:o,rt:new Set(["rt","rp"]),rp:new Set(["rt","rp"]),tbody:new Set(["thead","tbody"]),tfoot:new Set(["thead","tbody"])},l=new Set(["area","base","basefont","br","col","command","embed","frame","hr","img","input","isindex","keygen","link","meta","param","source","track","wbr"]),h=new Set(["math","svg"]),c=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"]),d=/\s|\//,u=function(){function e(e,t){var i,n,r,o,a;void 0===t&&(t={}),this.startIndex=0,this.endIndex=null,this.tagname="",this.attribname="",this.attribvalue="",this.attribs=null,this.stack=[],this.foreignContext=[],this.options=t,this.cbs=null!=e?e:{},this.lowerCaseTagNames=null!==(i=t.lowerCaseTags)&&void 0!==i?i:!t.xmlMode,this.lowerCaseAttributeNames=null!==(n=t.lowerCaseAttributeNames)&&void 0!==n?n:!t.xmlMode,this.tokenizer=new(null!==(r=t.Tokenizer)&&void 0!==r?r:s.default)(this.options,this),null===(a=(o=this.cbs).onparserinit)||void 0===a||a.call(o,this)}return e.prototype.updatePosition=function(e){null===this.endIndex?this.tokenizer.sectionStart<=e?this.startIndex=0:this.startIndex=this.tokenizer.sectionStart-e:this.startIndex=this.endIndex+1,this.endIndex=this.tokenizer.getAbsoluteIndex()},e.prototype.ontext=function(e){var t,i;this.updatePosition(1),this.endIndex--,null===(i=(t=this.cbs).ontext)||void 0===i||i.call(t,e)},e.prototype.onopentagname=function(e){var t,i;if(this.lowerCaseTagNames&&(e=e.toLowerCase()),this.tagname=e,!this.options.xmlMode&&Object.prototype.hasOwnProperty.call(a,e))for(var n=void 0;this.stack.length>0&&a[e].has(n=this.stack[this.stack.length-1]);)this.onclosetag(n);!this.options.xmlMode&&l.has(e)||(this.stack.push(e),h.has(e)?this.foreignContext.push(!0):c.has(e)&&this.foreignContext.push(!1)),null===(i=(t=this.cbs).onopentagname)||void 0===i||i.call(t,e),this.cbs.onopentag&&(this.attribs={})},e.prototype.onopentagend=function(){var e,t;this.updatePosition(1),this.attribs&&(null===(t=(e=this.cbs).onopentag)||void 0===t||t.call(e,this.tagname,this.attribs),this.attribs=null),!this.options.xmlMode&&this.cbs.onclosetag&&l.has(this.tagname)&&this.cbs.onclosetag(this.tagname),this.tagname=""},e.prototype.onclosetag=function(e){if(this.updatePosition(1),this.lowerCaseTagNames&&(e=e.toLowerCase()),(h.has(e)||c.has(e))&&this.foreignContext.pop(),!this.stack.length||!this.options.xmlMode&&l.has(e))this.options.xmlMode||"br"!==e&&"p"!==e||(this.onopentagname(e),this.closeCurrentTag());else{var t=this.stack.lastIndexOf(e);if(-1!==t)if(this.cbs.onclosetag)for(t=this.stack.length-t;t--;)this.cbs.onclosetag(this.stack.pop());else this.stack.length=t;else"p"!==e||this.options.xmlMode||(this.onopentagname(e),this.closeCurrentTag())}},e.prototype.onselfclosingtag=function(){this.options.xmlMode||this.options.recognizeSelfClosing||this.foreignContext[this.foreignContext.length-1]?this.closeCurrentTag():this.onopentagend()},e.prototype.closeCurrentTag=function(){var e,t,i=this.tagname;this.onopentagend(),this.stack[this.stack.length-1]===i&&(null===(t=(e=this.cbs).onclosetag)||void 0===t||t.call(e,i),this.stack.pop())},e.prototype.onattribname=function(e){this.lowerCaseAttributeNames&&(e=e.toLowerCase()),this.attribname=e},e.prototype.onattribdata=function(e){this.attribvalue+=e},e.prototype.onattribend=function(e){var t,i;null===(i=(t=this.cbs).onattribute)||void 0===i||i.call(t,this.attribname,this.attribvalue,e),this.attribs&&!Object.prototype.hasOwnProperty.call(this.attribs,this.attribname)&&(this.attribs[this.attribname]=this.attribvalue),this.attribname="",this.attribvalue=""},e.prototype.getInstructionName=function(e){var t=e.search(d),i=t<0?e:e.substr(0,t);return this.lowerCaseTagNames&&(i=i.toLowerCase()),i},e.prototype.ondeclaration=function(e){if(this.cbs.onprocessinginstruction){var t=this.getInstructionName(e);this.cbs.onprocessinginstruction("!"+t,"!"+e)}},e.prototype.onprocessinginstruction=function(e){if(this.cbs.onprocessinginstruction){var t=this.getInstructionName(e);this.cbs.onprocessinginstruction("?"+t,"?"+e)}},e.prototype.oncomment=function(e){var t,i,n,s;this.updatePosition(4),null===(i=(t=this.cbs).oncomment)||void 0===i||i.call(t,e),null===(s=(n=this.cbs).oncommentend)||void 0===s||s.call(n)},e.prototype.oncdata=function(e){var t,i,n,s,r,o;this.updatePosition(1),this.options.xmlMode||this.options.recognizeCDATA?(null===(i=(t=this.cbs).oncdatastart)||void 0===i||i.call(t),null===(s=(n=this.cbs).ontext)||void 0===s||s.call(n,e),null===(o=(r=this.cbs).oncdataend)||void 0===o||o.call(r)):this.oncomment("[CDATA["+e+"]]")},e.prototype.onerror=function(e){var t,i;null===(i=(t=this.cbs).onerror)||void 0===i||i.call(t,e)},e.prototype.onend=function(){var e,t;if(this.cbs.onclosetag)for(var i=this.stack.length;i>0;this.cbs.onclosetag(this.stack[--i]));null===(t=(e=this.cbs).onend)||void 0===t||t.call(e)},e.prototype.reset=function(){var e,t,i,n;null===(t=(e=this.cbs).onreset)||void 0===t||t.call(e),this.tokenizer.reset(),this.tagname="",this.attribname="",this.attribs=null,this.stack=[],null===(n=(i=this.cbs).onparserinit)||void 0===n||n.call(i,this)},e.prototype.parseComplete=function(e){this.reset(),this.end(e)},e.prototype.write=function(e){this.tokenizer.write(e)},e.prototype.end=function(e){this.tokenizer.end(e)},e.prototype.pause=function(){this.tokenizer.pause()},e.prototype.resume=function(){this.tokenizer.resume()},e.prototype.parseChunk=function(e){this.write(e)},e.prototype.done=function(e){this.end(e)},e}();t.Parser=u},1941:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=n(i(7826)),r=n(i(2810)),o=n(i(2836)),a=n(i(8689));function l(e){return" "===e||"\n"===e||"\t"===e||"\f"===e||"\r"===e}function h(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"}function c(e,t,i){var n=e.toLowerCase();return e===n?function(e,s){s===n?e._state=t:(e._state=i,e._index--)}:function(s,r){r===n||r===e?s._state=t:(s._state=i,s._index--)}}function d(e,t){var i=e.toLowerCase();return function(n,s){s===i||s===e?n._state=t:(n._state=3,n._index--)}}var u=c("C",24,16),p=c("D",25,16),f=c("A",26,16),m=c("T",27,16),g=c("A",28,16),v=d("R",35),O=d("I",36),b=d("P",37),_=d("T",38),y=c("R",40,1),w=c("I",41,1),x=c("P",42,1),S=c("T",43,1),k=d("Y",45),T=d("L",46),C=d("E",47),P=c("Y",49,1),M=c("L",50,1),E=c("E",51,1),A=d("I",54),R=d("T",55),D=d("L",56),I=d("E",57),q=c("I",58,1),L=c("T",59,1),N=c("L",60,1),B=c("E",61,1),$=c("#",63,64),Q=c("X",66,65),z=function(){function e(e,t){var i;this._state=1,this.buffer="",this.sectionStart=0,this._index=0,this.bufferOffset=0,this.baseState=1,this.special=1,this.running=!0,this.ended=!1,this.cbs=t,this.xmlMode=!!(null==e?void 0:e.xmlMode),this.decodeEntities=null===(i=null==e?void 0:e.decodeEntities)||void 0===i||i}return e.prototype.reset=function(){this._state=1,this.buffer="",this.sectionStart=0,this._index=0,this.bufferOffset=0,this.baseState=1,this.special=1,this.running=!0,this.ended=!1},e.prototype.write=function(e){this.ended&&this.cbs.onerror(Error(".write() after done!")),this.buffer+=e,this.parse()},e.prototype.end=function(e){this.ended&&this.cbs.onerror(Error(".end() after done!")),e&&this.write(e),this.ended=!0,this.running&&this.finish()},e.prototype.pause=function(){this.running=!1},e.prototype.resume=function(){this.running=!0,this._indexthis.sectionStart&&this.cbs.ontext(this.getSection()),this._state=2,this.sectionStart=this._index):!this.decodeEntities||"&"!==e||1!==this.special&&4!==this.special||(this._index>this.sectionStart&&this.cbs.ontext(this.getSection()),this.baseState=1,this._state=62,this.sectionStart=this._index)},e.prototype.isTagStartChar=function(e){return h(e)||this.xmlMode&&!l(e)&&"/"!==e&&">"!==e},e.prototype.stateBeforeTagName=function(e){"/"===e?this._state=5:"<"===e?(this.cbs.ontext(this.getSection()),this.sectionStart=this._index):">"===e||1!==this.special||l(e)?this._state=1:"!"===e?(this._state=15,this.sectionStart=this._index+1):"?"===e?(this._state=17,this.sectionStart=this._index+1):this.isTagStartChar(e)?(this._state=this.xmlMode||"s"!==e&&"S"!==e?this.xmlMode||"t"!==e&&"T"!==e?3:52:32,this.sectionStart=this._index):this._state=1},e.prototype.stateInTagName=function(e){("/"===e||">"===e||l(e))&&(this.emitToken("onopentagname"),this._state=8,this._index--)},e.prototype.stateBeforeClosingTagName=function(e){l(e)||(">"===e?this._state=1:1!==this.special?4===this.special||"s"!==e&&"S"!==e?4!==this.special||"t"!==e&&"T"!==e?(this._state=1,this._index--):this._state=53:this._state=33:this.isTagStartChar(e)?(this._state=6,this.sectionStart=this._index):(this._state=20,this.sectionStart=this._index))},e.prototype.stateInClosingTagName=function(e){(">"===e||l(e))&&(this.emitToken("onclosetag"),this._state=7,this._index--)},e.prototype.stateAfterClosingTagName=function(e){">"===e&&(this._state=1,this.sectionStart=this._index+1)},e.prototype.stateBeforeAttributeName=function(e){">"===e?(this.cbs.onopentagend(),this._state=1,this.sectionStart=this._index+1):"/"===e?this._state=4:l(e)||(this._state=9,this.sectionStart=this._index)},e.prototype.stateInSelfClosingTag=function(e){">"===e?(this.cbs.onselfclosingtag(),this._state=1,this.sectionStart=this._index+1,this.special=1):l(e)||(this._state=8,this._index--)},e.prototype.stateInAttributeName=function(e){("="===e||"/"===e||">"===e||l(e))&&(this.cbs.onattribname(this.getSection()),this.sectionStart=-1,this._state=10,this._index--)},e.prototype.stateAfterAttributeName=function(e){"="===e?this._state=11:"/"===e||">"===e?(this.cbs.onattribend(void 0),this._state=8,this._index--):l(e)||(this.cbs.onattribend(void 0),this._state=9,this.sectionStart=this._index)},e.prototype.stateBeforeAttributeValue=function(e){'"'===e?(this._state=12,this.sectionStart=this._index+1):"'"===e?(this._state=13,this.sectionStart=this._index+1):l(e)||(this._state=14,this.sectionStart=this._index,this._index--)},e.prototype.handleInAttributeValue=function(e,t){e===t?(this.emitToken("onattribdata"),this.cbs.onattribend(t),this._state=8):this.decodeEntities&&"&"===e&&(this.emitToken("onattribdata"),this.baseState=this._state,this._state=62,this.sectionStart=this._index)},e.prototype.stateInAttributeValueDoubleQuotes=function(e){this.handleInAttributeValue(e,'"')},e.prototype.stateInAttributeValueSingleQuotes=function(e){this.handleInAttributeValue(e,"'")},e.prototype.stateInAttributeValueNoQuotes=function(e){l(e)||">"===e?(this.emitToken("onattribdata"),this.cbs.onattribend(null),this._state=8,this._index--):this.decodeEntities&&"&"===e&&(this.emitToken("onattribdata"),this.baseState=this._state,this._state=62,this.sectionStart=this._index)},e.prototype.stateBeforeDeclaration=function(e){this._state="["===e?23:"-"===e?18:16},e.prototype.stateInDeclaration=function(e){">"===e&&(this.cbs.ondeclaration(this.getSection()),this._state=1,this.sectionStart=this._index+1)},e.prototype.stateInProcessingInstruction=function(e){">"===e&&(this.cbs.onprocessinginstruction(this.getSection()),this._state=1,this.sectionStart=this._index+1)},e.prototype.stateBeforeComment=function(e){"-"===e?(this._state=19,this.sectionStart=this._index+1):this._state=16},e.prototype.stateInComment=function(e){"-"===e&&(this._state=21)},e.prototype.stateInSpecialComment=function(e){">"===e&&(this.cbs.oncomment(this.buffer.substring(this.sectionStart,this._index)),this._state=1,this.sectionStart=this._index+1)},e.prototype.stateAfterComment1=function(e){this._state="-"===e?22:19},e.prototype.stateAfterComment2=function(e){">"===e?(this.cbs.oncomment(this.buffer.substring(this.sectionStart,this._index-2)),this._state=1,this.sectionStart=this._index+1):"-"!==e&&(this._state=19)},e.prototype.stateBeforeCdata6=function(e){"["===e?(this._state=29,this.sectionStart=this._index+1):(this._state=16,this._index--)},e.prototype.stateInCdata=function(e){"]"===e&&(this._state=30)},e.prototype.stateAfterCdata1=function(e){this._state="]"===e?31:29},e.prototype.stateAfterCdata2=function(e){">"===e?(this.cbs.oncdata(this.buffer.substring(this.sectionStart,this._index-2)),this._state=1,this.sectionStart=this._index+1):"]"!==e&&(this._state=29)},e.prototype.stateBeforeSpecialS=function(e){"c"===e||"C"===e?this._state=34:"t"===e||"T"===e?this._state=44:(this._state=3,this._index--)},e.prototype.stateBeforeSpecialSEnd=function(e){2!==this.special||"c"!==e&&"C"!==e?3!==this.special||"t"!==e&&"T"!==e?this._state=1:this._state=48:this._state=39},e.prototype.stateBeforeSpecialLast=function(e,t){("/"===e||">"===e||l(e))&&(this.special=t),this._state=3,this._index--},e.prototype.stateAfterSpecialLast=function(e,t){">"===e||l(e)?(this.special=1,this._state=6,this.sectionStart=this._index-t,this._index--):this._state=1},e.prototype.parseFixedEntity=function(e){if(void 0===e&&(e=this.xmlMode?a.default:r.default),this.sectionStart+1=2;){var i=this.buffer.substr(e,t);if(Object.prototype.hasOwnProperty.call(o.default,i))return this.emitPartial(o.default[i]),void(this.sectionStart+=t+1);t--}},e.prototype.stateInNamedEntity=function(e){";"===e?(this.parseFixedEntity(),1===this.baseState&&this.sectionStart+1"9")&&!h(e)&&(this.xmlMode||this.sectionStart+1===this._index||(1!==this.baseState?"="!==e&&this.parseFixedEntity(o.default):this.parseLegacyEntity()),this._state=this.baseState,this._index--)},e.prototype.decodeNumericEntity=function(e,t,i){var n=this.sectionStart+e;if(n!==this._index){var r=this.buffer.substring(n,this._index),o=parseInt(r,t);this.emitPartial(s.default(o)),this.sectionStart=i?this._index+1:this._index}this._state=this.baseState},e.prototype.stateInNumericEntity=function(e){";"===e?this.decodeNumericEntity(2,10,!0):(e<"0"||e>"9")&&(this.xmlMode?this._state=this.baseState:this.decodeNumericEntity(2,10,!1),this._index--)},e.prototype.stateInHexEntity=function(e){";"===e?this.decodeNumericEntity(3,16,!0):(e<"a"||e>"f")&&(e<"A"||e>"F")&&(e<"0"||e>"9")&&(this.xmlMode?this._state=this.baseState:this.decodeNumericEntity(3,16,!1),this._index--)},e.prototype.cleanup=function(){this.sectionStart<0?(this.buffer="",this.bufferOffset+=this._index,this._index=0):this.running&&(1===this._state?(this.sectionStart!==this._index&&this.cbs.ontext(this.buffer.substr(this.sectionStart)),this.buffer="",this.bufferOffset+=this._index,this._index=0):this.sectionStart===this._index?(this.buffer="",this.bufferOffset+=this._index,this._index=0):(this.buffer=this.buffer.substr(this.sectionStart),this._index-=this.sectionStart,this.bufferOffset+=this.sectionStart),this.sectionStart=0)},e.prototype.parse=function(){for(;this._index{"use strict";function i(e){return"[object Object]"===Object.prototype.toString.call(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.isPlainObject=function(e){var t,n;return!1!==i(e)&&(void 0===(t=e.constructor)||!1!==i(n=t.prototype)&&!1!==n.hasOwnProperty("isPrototypeOf"))}},6145:(e,t,i)=>{var n,s=/[&<>"'`]/g,r=RegExp(s.source),o="object"==typeof i.g&&i.g&&i.g.Object===Object&&i.g,a="object"==typeof self&&self&&self.Object===Object&&self,l=o||a||Function("return this")(),h=(n={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},function(e){return null==n?void 0:n[e]}),c=Object.prototype.toString,d=l.Symbol,u=d?d.prototype:void 0,p=u?u.toString:void 0;e.exports=function(e){var t;return(e=null==(t=e)?"":function(e){if("string"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==c.call(e)}(e))return p?p.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(t))&&r.test(e)?e.replace(s,h):e}},6965:e=>{"use strict";function t(e){return"number"==typeof e||!!/^0x[0-9a-f]+$/i.test(e)||/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(e)}function i(e,t){return"constructor"===t&&"function"==typeof e[t]||"__proto__"===t}e.exports=function(e,n){n||(n={});var s={bools:{},strings:{},unknownFn:null};"function"==typeof n.unknown&&(s.unknownFn=n.unknown),"boolean"==typeof n.boolean&&n.boolean?s.allBools=!0:[].concat(n.boolean).filter(Boolean).forEach((function(e){s.bools[e]=!0}));var r={};function o(e){return r[e].some((function(e){return s.bools[e]}))}Object.keys(n.alias||{}).forEach((function(e){r[e]=[].concat(n.alias[e]),r[e].forEach((function(t){r[t]=[e].concat(r[e].filter((function(e){return t!==e})))}))})),[].concat(n.string).filter(Boolean).forEach((function(e){s.strings[e]=!0,r[e]&&[].concat(r[e]).forEach((function(e){s.strings[e]=!0}))}));var a=n.default||{},l={_:[]};function h(e,t,n){for(var r=e,o=0;o=l)return g;n=i(d),s=[],","===n.slice(-1)?(n=n.replace(u,""),O()):v()}function v(){for(i(h),r="",o="in descriptor";;){if(a=e.charAt(m),"in descriptor"===o)if(t(a))r&&(s.push(r),r="",o="after descriptor");else{if(","===a)return m+=1,r&&s.push(r),void O();if("("===a)r+=a,o="in parens";else{if(""===a)return r&&s.push(r),void O();r+=a}}else if("in parens"===o)if(")"===a)r+=a,o="in descriptor";else{if(""===a)return s.push(r),void O();r+=a}else if("after descriptor"===o)if(t(a));else{if(""===a)return void O();o="in descriptor",m-=1}m+=1}}function O(){var t,i,r,o,a,l,h,c,d,u=!1,m={};for(o=0;o{"use strict";function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function i(e,t){for(var i,n="",s=0,r=-1,o=0,a=0;a<=e.length;++a){if(a2){var l=n.lastIndexOf("/");if(l!==n.length-1){-1===l?(n="",s=0):s=(n=n.slice(0,l)).length-1-n.lastIndexOf("/"),r=a,o=0;continue}}else if(2===n.length||1===n.length){n="",s=0,r=a,o=0;continue}t&&(n.length>0?n+="/..":n="..",s=2)}else n.length>0?n+="/"+e.slice(r+1,a):n=e.slice(r+1,a),s=a-r-1;r=a,o=0}else 46===i&&-1!==o?++o:o=-1}return n}var n={resolve:function(){for(var e,n="",s=!1,r=arguments.length-1;r>=-1&&!s;r--){var o;r>=0?o=arguments[r]:(void 0===e&&(e=process.cwd()),o=e),t(o),0!==o.length&&(n=o+"/"+n,s=47===o.charCodeAt(0))}return n=i(n,!s),s?n.length>0?"/"+n:"/":n.length>0?n:"."},normalize:function(e){if(t(e),0===e.length)return".";var n=47===e.charCodeAt(0),s=47===e.charCodeAt(e.length-1);return 0!==(e=i(e,!n)).length||n||(e="."),e.length>0&&s&&(e+="/"),n?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,i=0;i0&&(void 0===e?e=s:e+="/"+s)}return void 0===e?".":n.normalize(e)},relative:function(e,i){if(t(e),t(i),e===i)return"";if((e=n.resolve(e))===(i=n.resolve(i)))return"";for(var s=1;sh){if(47===i.charCodeAt(a+d))return i.slice(a+d+1);if(0===d)return i.slice(a+d)}else o>h&&(47===e.charCodeAt(s+d)?c=d:0===d&&(c=0));break}var u=e.charCodeAt(s+d);if(u!==i.charCodeAt(a+d))break;47===u&&(c=d)}var p="";for(d=s+c+1;d<=r;++d)d!==r&&47!==e.charCodeAt(d)||(0===p.length?p+="..":p+="/..");return p.length>0?p+i.slice(a+c):(a+=c,47===i.charCodeAt(a)&&++a,i.slice(a))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var i=e.charCodeAt(0),n=47===i,s=-1,r=!0,o=e.length-1;o>=1;--o)if(47===(i=e.charCodeAt(o))){if(!r){s=o;break}}else r=!1;return-1===s?n?"/":".":n&&1===s?"//":e.slice(0,s)},basename:function(e,i){if(void 0!==i&&"string"!=typeof i)throw new TypeError('"ext" argument must be a string');t(e);var n,s=0,r=-1,o=!0;if(void 0!==i&&i.length>0&&i.length<=e.length){if(i.length===e.length&&i===e)return"";var a=i.length-1,l=-1;for(n=e.length-1;n>=0;--n){var h=e.charCodeAt(n);if(47===h){if(!o){s=n+1;break}}else-1===l&&(o=!1,l=n+1),a>=0&&(h===i.charCodeAt(a)?-1==--a&&(r=n):(a=-1,r=l))}return s===r?r=l:-1===r&&(r=e.length),e.slice(s,r)}for(n=e.length-1;n>=0;--n)if(47===e.charCodeAt(n)){if(!o){s=n+1;break}}else-1===r&&(o=!1,r=n+1);return-1===r?"":e.slice(s,r)},extname:function(e){t(e);for(var i=-1,n=0,s=-1,r=!0,o=0,a=e.length-1;a>=0;--a){var l=e.charCodeAt(a);if(47!==l)-1===s&&(r=!1,s=a+1),46===l?-1===i?i=a:1!==o&&(o=1):-1!==i&&(o=-1);else if(!r){n=a+1;break}}return-1===i||-1===s||0===o||1===o&&i===s-1&&i===n+1?"":e.slice(i,s)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var i=t.dir||t.root,n=t.base||(t.name||"")+(t.ext||"");return i?i===t.root?i+n:i+"/"+n:n}(0,e)},parse:function(e){t(e);var i={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return i;var n,s=e.charCodeAt(0),r=47===s;r?(i.root="/",n=1):n=0;for(var o=-1,a=0,l=-1,h=!0,c=e.length-1,d=0;c>=n;--c)if(47!==(s=e.charCodeAt(c)))-1===l&&(h=!1,l=c+1),46===s?-1===o?o=c:1!==d&&(d=1):-1!==o&&(d=-1);else if(!h){a=c+1;break}return-1===o||-1===l||0===d||1===d&&o===l-1&&o===a+1?-1!==l&&(i.base=i.name=0===a&&r?e.slice(1,l):e.slice(a,l)):(0===a&&r?(i.name=e.slice(1,o),i.base=e.slice(1,l)):(i.name=e.slice(a,o),i.base=e.slice(a,l)),i.ext=e.slice(o,l)),a>0?i.dir=e.slice(0,a-1):r&&(i.dir="/"),i},sep:"/",delimiter:":",win32:null,posix:null};n.posix=n,e.exports=n},1435:e=>{var t=String,i=function(){return{isColorSupported:!1,reset:t,bold:t,dim:t,italic:t,underline:t,inverse:t,hidden:t,strikethrough:t,black:t,red:t,green:t,yellow:t,blue:t,magenta:t,cyan:t,white:t,gray:t,bgBlack:t,bgRed:t,bgGreen:t,bgYellow:t,bgBlue:t,bgMagenta:t,bgCyan:t,bgWhite:t}};e.exports=i(),e.exports.createColors=i},7983:(e,t,i)=>{"use strict";let n=i(9930);class s extends n{constructor(e){super(e),this.type="atrule"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}}e.exports=s,s.default=s,n.registerAtRule(s)},1044:(e,t,i)=>{"use strict";let n=i(322);class s extends n{constructor(e){super(e),this.type="comment"}}e.exports=s,s.default=s},9930:(e,t,i)=>{"use strict";let n,s,r,o,{isClean:a,my:l}=i(2450),h=i(9026),c=i(1044),d=i(322);function u(e){return e.map((e=>(e.nodes&&(e.nodes=u(e.nodes)),delete e.source,e)))}function p(e){if(e[a]=!1,e.proxyOf.nodes)for(let t of e.proxyOf.nodes)p(t)}class f extends d{append(...e){for(let t of e){let e=this.normalize(t,this.last);for(let t of e)this.proxyOf.nodes.push(t)}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}each(e){if(!this.proxyOf.nodes)return;let t,i,n=this.getIterator();for(;this.indexes[n]"proxyOf"===t?e:e[t]?"each"===t||"string"==typeof t&&t.startsWith("walk")?(...i)=>e[t](...i.map((e=>"function"==typeof e?(t,i)=>e(t.toProxy(),i):e))):"every"===t||"some"===t?i=>e[t](((e,...t)=>i(e.toProxy(),...t))):"root"===t?()=>e.root().toProxy():"nodes"===t?e.nodes.map((e=>e.toProxy())):"first"===t||"last"===t?e[t].toProxy():e[t]:e[t],set:(e,t,i)=>(e[t]===i||(e[t]=i,"name"!==t&&"params"!==t&&"selector"!==t||e.markDirty()),!0)}}index(e){return"number"==typeof e?e:(e.proxyOf&&(e=e.proxyOf),this.proxyOf.nodes.indexOf(e))}insertAfter(e,t){let i,n=this.index(e),s=this.normalize(t,this.proxyOf.nodes[n]).reverse();n=this.index(e);for(let e of s)this.proxyOf.nodes.splice(n+1,0,e);for(let e in this.indexes)i=this.indexes[e],n(e[l]||f.rebuild(e),(e=e.proxyOf).parent&&e.parent.removeChild(e),e[a]&&p(e),void 0===e.raws.before&&t&&void 0!==t.raws.before&&(e.raws.before=t.raws.before.replace(/\S/g,"")),e.parent=this.proxyOf,e)))}prepend(...e){e=e.reverse();for(let t of e){let e=this.normalize(t,this.first,"prepend").reverse();for(let t of e)this.proxyOf.nodes.unshift(t);for(let t in this.indexes)this.indexes[t]=this.indexes[t]+e.length}return this.markDirty(),this}push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}removeChild(e){let t;e=this.index(e),this.proxyOf.nodes[e].parent=void 0,this.proxyOf.nodes.splice(e,1);for(let i in this.indexes)t=this.indexes[i],t>=e&&(this.indexes[i]=t-1);return this.markDirty(),this}replaceValues(e,t,i){return i||(i=t,t={}),this.walkDecls((n=>{t.props&&!t.props.includes(n.prop)||t.fast&&!n.value.includes(t.fast)||(n.value=n.value.replace(e,i))})),this.markDirty(),this}some(e){return this.nodes.some(e)}walk(e){return this.each(((t,i)=>{let n;try{n=e(t,i)}catch(e){throw t.addToError(e)}return!1!==n&&t.walk&&(n=t.walk(e)),n}))}walkAtRules(e,t){return t?e instanceof RegExp?this.walk(((i,n)=>{if("atrule"===i.type&&e.test(i.name))return t(i,n)})):this.walk(((i,n)=>{if("atrule"===i.type&&i.name===e)return t(i,n)})):(t=e,this.walk(((e,i)=>{if("atrule"===e.type)return t(e,i)})))}walkComments(e){return this.walk(((t,i)=>{if("comment"===t.type)return e(t,i)}))}walkDecls(e,t){return t?e instanceof RegExp?this.walk(((i,n)=>{if("decl"===i.type&&e.test(i.prop))return t(i,n)})):this.walk(((i,n)=>{if("decl"===i.type&&i.prop===e)return t(i,n)})):(t=e,this.walk(((e,i)=>{if("decl"===e.type)return t(e,i)})))}walkRules(e,t){return t?e instanceof RegExp?this.walk(((i,n)=>{if("rule"===i.type&&e.test(i.selector))return t(i,n)})):this.walk(((i,n)=>{if("rule"===i.type&&i.selector===e)return t(i,n)})):(t=e,this.walk(((e,i)=>{if("rule"===e.type)return t(e,i)})))}get first(){if(this.proxyOf.nodes)return this.proxyOf.nodes[0]}get last(){if(this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}}f.registerParse=e=>{n=e},f.registerRule=e=>{s=e},f.registerAtRule=e=>{r=e},f.registerRoot=e=>{o=e},e.exports=f,f.default=f,f.rebuild=e=>{"atrule"===e.type?Object.setPrototypeOf(e,r.prototype):"rule"===e.type?Object.setPrototypeOf(e,s.prototype):"decl"===e.type?Object.setPrototypeOf(e,h.prototype):"comment"===e.type?Object.setPrototypeOf(e,c.prototype):"root"===e.type&&Object.setPrototypeOf(e,o.prototype),e[l]=!0,e.nodes&&e.nodes.forEach((e=>{f.rebuild(e)}))}},2604:(e,t,i)=>{"use strict";let n=i(1435),s=i(2940);class r extends Error{constructor(e,t,i,n,s,o){super(e),this.name="CssSyntaxError",this.reason=e,s&&(this.file=s),n&&(this.source=n),o&&(this.plugin=o),void 0!==t&&void 0!==i&&("number"==typeof t?(this.line=t,this.column=i):(this.line=t.line,this.column=t.column,this.endLine=i.line,this.endColumn=i.column)),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,r)}setMessage(){this.message=this.plugin?this.plugin+": ":"",this.message+=this.file?this.file:"",void 0!==this.line&&(this.message+=":"+this.line+":"+this.column),this.message+=": "+this.reason}showSourceCode(e){if(!this.source)return"";let t=this.source;null==e&&(e=n.isColorSupported),s&&e&&(t=s(t));let i,r,o=t.split(/\r?\n/),a=Math.max(this.line-3,0),l=Math.min(this.line+2,o.length),h=String(l).length;if(e){let{bold:e,gray:t,red:s}=n.createColors(!0);i=t=>e(s(t)),r=e=>t(e)}else i=r=e=>e;return o.slice(a,l).map(((e,t)=>{let n=a+1+t,s=" "+(" "+n).slice(-h)+" | ";if(n===this.line){let t=r(s.replace(/\d/g," "))+e.slice(0,this.column-1).replace(/[^\t]/g," ");return i(">")+r(s)+e+"\n "+t+i("^")}return" "+r(s)+e})).join("\n")}toString(){let e=this.showSourceCode();return e&&(e="\n\n"+e+"\n"),this.name+": "+this.message+e}}e.exports=r,r.default=r},9026:(e,t,i)=>{"use strict";let n=i(322);class s extends n{constructor(e){e&&void 0!==e.value&&"string"!=typeof e.value&&(e={...e,value:String(e.value)}),super(e),this.type="decl"}get variable(){return this.prop.startsWith("--")||"$"===this.prop[0]}}e.exports=s,s.default=s},2900:(e,t,i)=>{"use strict";let n,s,r=i(9930);class o extends r{constructor(e){super({type:"document",...e}),this.nodes||(this.nodes=[])}toResult(e={}){return new n(new s,this,e).stringify()}}o.registerLazyResult=e=>{n=e},o.registerProcessor=e=>{s=e},e.exports=o,o.default=o},4899:(e,t,i)=>{"use strict";let n=i(9026),s=i(2764),r=i(1044),o=i(7983),a=i(6970),l=i(4539),h=i(4146);function c(e,t){if(Array.isArray(e))return e.map((e=>c(e)));let{inputs:i,...d}=e;if(i){t=[];for(let e of i){let i={...e,__proto__:a.prototype};i.map&&(i.map={...i.map,__proto__:s.prototype}),t.push(i)}}if(d.nodes&&(d.nodes=e.nodes.map((e=>c(e,t)))),d.source){let{inputId:e,...i}=d.source;d.source=i,null!=e&&(d.source.input=t[e])}if("root"===d.type)return new l(d);if("decl"===d.type)return new n(d);if("rule"===d.type)return new h(d);if("comment"===d.type)return new r(d);if("atrule"===d.type)return new o(d);throw new Error("Unknown node type: "+e.type)}e.exports=c,c.default=c},6970:(e,t,i)=>{"use strict";let{SourceMapConsumer:n,SourceMapGenerator:s}=i(9059),{fileURLToPath:r,pathToFileURL:o}=i(415),{isAbsolute:a,resolve:l}=i(2666),{nanoid:h}=i(8845),c=i(2940),d=i(2604),u=i(2764),p=Symbol("fromOffsetCache"),f=Boolean(n&&s),m=Boolean(l&&a);class g{constructor(e,t={}){if(null==e||"object"==typeof e&&!e.toString)throw new Error(`PostCSS received ${e} instead of CSS string`);if(this.css=e.toString(),"\ufeff"===this.css[0]||"￾"===this.css[0]?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,t.from&&(!m||/^\w+:\/\//.test(t.from)||a(t.from)?this.file=t.from:this.file=l(t.from)),m&&f){let e=new u(this.css,t);if(e.text){this.map=e;let t=e.consumer().file;!this.file&&t&&(this.file=this.mapResolve(t))}}this.file||(this.id=""),this.map&&(this.map.file=this.from)}error(e,t,i,n={}){let s,r,a;if(t&&"object"==typeof t){let e=t,n=i;if("number"==typeof e.offset){let n=this.fromOffset(e.offset);t=n.line,i=n.col}else t=e.line,i=e.column;if("number"==typeof n.offset){let e=this.fromOffset(n.offset);r=e.line,a=e.col}else r=n.line,a=n.column}else if(!i){let e=this.fromOffset(t);t=e.line,i=e.col}let l=this.origin(t,i,r,a);return s=l?new d(e,void 0===l.endLine?l.line:{column:l.column,line:l.line},void 0===l.endLine?l.column:{column:l.endColumn,line:l.endLine},l.source,l.file,n.plugin):new d(e,void 0===r?t:{column:i,line:t},void 0===r?i:{column:a,line:r},this.css,this.file,n.plugin),s.input={column:i,endColumn:a,endLine:r,line:t,source:this.css},this.file&&(o&&(s.input.url=o(this.file).toString()),s.input.file=this.file),s}fromOffset(e){let t,i;if(this[p])i=this[p];else{let e=this.css.split("\n");i=new Array(e.length);let t=0;for(let n=0,s=e.length;n=t)n=i.length-1;else{let t,s=i.length-2;for(;n>1),e=i[t+1])){n=t;break}n=t+1}}return{col:e-i[n]+1,line:n+1}}mapResolve(e){return/^\w+:\/\//.test(e)?e:l(this.map.consumer().sourceRoot||this.map.root||".",e)}origin(e,t,i,n){if(!this.map)return!1;let s,l,h=this.map.consumer(),c=h.originalPositionFor({column:t,line:e});if(!c.source)return!1;"number"==typeof i&&(s=h.originalPositionFor({column:n,line:i})),l=a(c.source)?o(c.source):new URL(c.source,this.map.consumer().sourceRoot||o(this.map.mapFile));let d={column:c.column,endColumn:s&&s.column,endLine:s&&s.line,line:c.line,url:l.toString()};if("file:"===l.protocol){if(!r)throw new Error("file: protocol is not available in this PostCSS build");d.file=r(l)}let u=h.sourceContentFor(c.source);return u&&(d.source=u),d}toJSON(){let e={};for(let t of["hasBOM","css","file","id"])null!=this[t]&&(e[t]=this[t]);return this.map&&(e.map={...this.map},e.map.consumerCache&&(e.map.consumerCache=void 0)),e}get from(){return this.file||this.id}}e.exports=g,g.default=g,c&&c.registerInput&&c.registerInput(g)},427:(e,t,i)=>{"use strict";let{isClean:n,my:s}=i(2450),r=i(4342),o=i(9573),a=i(9930),l=i(2900),h=(i(5411),i(165)),c=i(6214),d=i(4539);const u={atrule:"AtRule",comment:"Comment",decl:"Declaration",document:"Document",root:"Root",rule:"Rule"},p={AtRule:!0,AtRuleExit:!0,Comment:!0,CommentExit:!0,Declaration:!0,DeclarationExit:!0,Document:!0,DocumentExit:!0,Once:!0,OnceExit:!0,postcssPlugin:!0,prepare:!0,Root:!0,RootExit:!0,Rule:!0,RuleExit:!0},f={Once:!0,postcssPlugin:!0,prepare:!0},m=0;function g(e){return"object"==typeof e&&"function"==typeof e.then}function v(e){let t=!1,i=u[e.type];return"decl"===e.type?t=e.prop.toLowerCase():"atrule"===e.type&&(t=e.name.toLowerCase()),t&&e.append?[i,i+"-"+t,m,i+"Exit",i+"Exit-"+t]:t?[i,i+"-"+t,i+"Exit",i+"Exit-"+t]:e.append?[i,m,i+"Exit"]:[i,i+"Exit"]}function O(e){let t;return t="document"===e.type?["Document",m,"DocumentExit"]:"root"===e.type?["Root",m,"RootExit"]:v(e),{eventIndex:0,events:t,iterator:0,node:e,visitorIndex:0,visitors:[]}}function b(e){return e[n]=!1,e.nodes&&e.nodes.forEach((e=>b(e))),e}let _={};class y{constructor(e,t,i){let n;if(this.stringified=!1,this.processed=!1,"object"!=typeof t||null===t||"root"!==t.type&&"document"!==t.type)if(t instanceof y||t instanceof h)n=b(t.root),t.map&&(void 0===i.map&&(i.map={}),i.map.inline||(i.map.inline=!1),i.map.prev=t.map);else{let e=c;i.syntax&&(e=i.syntax.parse),i.parser&&(e=i.parser),e.parse&&(e=e.parse);try{n=e(t,i)}catch(e){this.processed=!0,this.error=e}n&&!n[s]&&a.rebuild(n)}else n=b(t);this.result=new h(e,n,i),this.helpers={..._,postcss:_,result:this.result},this.plugins=this.processor.plugins.map((e=>"object"==typeof e&&e.prepare?{...e,...e.prepare(this.result)}:e))}async(){return this.error?Promise.reject(this.error):this.processed?Promise.resolve(this.result):(this.processing||(this.processing=this.runAsync()),this.processing)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}getAsyncError(){throw new Error("Use process(css).then(cb) to work with async plugins")}handleError(e,t){let i=this.result.lastPlugin;try{t&&t.addToError(e),this.error=e,"CssSyntaxError"!==e.name||e.plugin?i.postcssVersion:(e.plugin=i.postcssPlugin,e.setMessage())}catch(e){console&&console.error&&console.error(e)}return e}prepareVisitors(){this.listeners={};let e=(e,t,i)=>{this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push([e,i])};for(let t of this.plugins)if("object"==typeof t)for(let i in t){if(!p[i]&&/^[A-Z]/.test(i))throw new Error(`Unknown event ${i} in ${t.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).`);if(!f[i])if("object"==typeof t[i])for(let n in t[i])e(t,"*"===n?i:i+"-"+n.toLowerCase(),t[i][n]);else"function"==typeof t[i]&&e(t,i,t[i])}this.hasListener=Object.keys(this.listeners).length>0}async runAsync(){this.plugin=0;for(let e=0;e0;){let e=this.visitTick(t);if(g(e))try{await e}catch(e){let i=t[t.length-1].node;throw this.handleError(e,i)}}}if(this.listeners.OnceExit)for(let[t,i]of this.listeners.OnceExit){this.result.lastPlugin=t;try{if("document"===e.type){let t=e.nodes.map((e=>i(e,this.helpers)));await Promise.all(t)}else await i(e,this.helpers)}catch(e){throw this.handleError(e)}}}return this.processed=!0,this.stringify()}runOnRoot(e){this.result.lastPlugin=e;try{if("object"==typeof e&&e.Once){if("document"===this.result.root.type){let t=this.result.root.nodes.map((t=>e.Once(t,this.helpers)));return g(t[0])?Promise.all(t):t}return e.Once(this.result.root,this.helpers)}if("function"==typeof e)return e(this.result.root,this.result)}catch(e){throw this.handleError(e)}}stringify(){if(this.error)throw this.error;if(this.stringified)return this.result;this.stringified=!0,this.sync();let e=this.result.opts,t=o;e.syntax&&(t=e.syntax.stringify),e.stringifier&&(t=e.stringifier),t.stringify&&(t=t.stringify);let i=new r(t,this.result.root,this.result.opts).generate();return this.result.css=i[0],this.result.map=i[1],this.result}sync(){if(this.error)throw this.error;if(this.processed)return this.result;if(this.processed=!0,this.processing)throw this.getAsyncError();for(let e of this.plugins)if(g(this.runOnRoot(e)))throw this.getAsyncError();if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[n];)e[n]=!0,this.walkSync(e);if(this.listeners.OnceExit)if("document"===e.type)for(let t of e.nodes)this.visitSync(this.listeners.OnceExit,t);else this.visitSync(this.listeners.OnceExit,e)}return this.result}then(e,t){return this.async().then(e,t)}toString(){return this.css}visitSync(e,t){for(let[i,n]of e){let e;this.result.lastPlugin=i;try{e=n(t,this.helpers)}catch(e){throw this.handleError(e,t.proxyOf)}if("root"!==t.type&&"document"!==t.type&&!t.parent)return!0;if(g(e))throw this.getAsyncError()}}visitTick(e){let t=e[e.length-1],{node:i,visitors:s}=t;if("root"!==i.type&&"document"!==i.type&&!i.parent)return void e.pop();if(s.length>0&&t.visitorIndex{e[n]||this.walkSync(e)}));else{let t=this.listeners[i];if(t&&this.visitSync(t,e.toProxy()))return}}warnings(){return this.sync().warnings()}get content(){return this.stringify().content}get css(){return this.stringify().css}get map(){return this.stringify().map}get messages(){return this.sync().messages}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){return this.sync().root}get[Symbol.toStringTag](){return"LazyResult"}}y.registerPostcss=e=>{_=e},e.exports=y,y.default=y,d.registerLazyResult(y),l.registerLazyResult(y)},6065:e=>{"use strict";let t={comma:e=>t.split(e,[","],!0),space:e=>t.split(e,[" ","\n","\t"]),split(e,t,i){let n=[],s="",r=!1,o=0,a=!1,l="",h=!1;for(let i of e)h?h=!1:"\\"===i?h=!0:a?i===l&&(a=!1):'"'===i||"'"===i?(a=!0,l=i):"("===i?o+=1:")"===i?o>0&&(o-=1):0===o&&t.includes(i)&&(r=!0),r?(""!==s&&n.push(s.trim()),s="",r=!1):s+=i;return(i||""!==s)&&n.push(s.trim()),n}};e.exports=t,t.default=t},4342:(e,t,i)=>{"use strict";let{SourceMapConsumer:n,SourceMapGenerator:s}=i(9059),{dirname:r,relative:o,resolve:a,sep:l}=i(2666),{pathToFileURL:h}=i(415),c=i(6970),d=Boolean(n&&s),u=Boolean(r&&a&&o&&l);e.exports=class{constructor(e,t,i,n){this.stringify=e,this.mapOpts=i.map||{},this.root=t,this.opts=i,this.css=n,this.usesFileUrls=!this.mapOpts.from&&this.mapOpts.absolute,this.memoizedFileURLs=new Map,this.memoizedPaths=new Map,this.memoizedURLs=new Map}addAnnotation(){let e;e=this.isInline()?"data:application/json;base64,"+this.toBase64(this.map.toString()):"string"==typeof this.mapOpts.annotation?this.mapOpts.annotation:"function"==typeof this.mapOpts.annotation?this.mapOpts.annotation(this.opts.to,this.root):this.outputFile()+".map";let t="\n";this.css.includes("\r\n")&&(t="\r\n"),this.css+=t+"/*# sourceMappingURL="+e+" */"}applyPrevMaps(){for(let e of this.previous()){let t,i=this.toUrl(this.path(e.file)),s=e.root||r(e.file);!1===this.mapOpts.sourcesContent?(t=new n(e.text),t.sourcesContent&&(t.sourcesContent=t.sourcesContent.map((()=>null)))):t=e.consumer(),this.map.applySourceMap(t,i,this.toUrl(this.path(s)))}}clearAnnotation(){if(!1!==this.mapOpts.annotation)if(this.root){let e;for(let t=this.root.nodes.length-1;t>=0;t--)e=this.root.nodes[t],"comment"===e.type&&0===e.text.indexOf("# sourceMappingURL=")&&this.root.removeChild(t)}else this.css&&(this.css=this.css.replace(/(\n)?\/\*#[\S\s]*?\*\/$/gm,""))}generate(){if(this.clearAnnotation(),u&&d&&this.isMap())return this.generateMap();{let e="";return this.stringify(this.root,(t=>{e+=t})),[e]}}generateMap(){if(this.root)this.generateString();else if(1===this.previous().length){let e=this.previous()[0].consumer();e.file=this.outputFile(),this.map=s.fromSourceMap(e)}else this.map=new s({file:this.outputFile()}),this.map.addMapping({generated:{column:0,line:1},original:{column:0,line:1},source:this.opts.from?this.toUrl(this.path(this.opts.from)):""});return this.isSourcesContent()&&this.setSourcesContent(),this.root&&this.previous().length>0&&this.applyPrevMaps(),this.isAnnotation()&&this.addAnnotation(),this.isInline()?[this.css]:[this.css,this.map]}generateString(){this.css="",this.map=new s({file:this.outputFile()});let e,t,i=1,n=1,r="",o={generated:{column:0,line:0},original:{column:0,line:0},source:""};this.stringify(this.root,((s,a,l)=>{if(this.css+=s,a&&"end"!==l&&(o.generated.line=i,o.generated.column=n-1,a.source&&a.source.start?(o.source=this.sourcePath(a),o.original.line=a.source.start.line,o.original.column=a.source.start.column-1,this.map.addMapping(o)):(o.source=r,o.original.line=1,o.original.column=0,this.map.addMapping(o))),e=s.match(/\n/g),e?(i+=e.length,t=s.lastIndexOf("\n"),n=s.length-t):n+=s.length,a&&"start"!==l){let e=a.parent||{raws:{}};("decl"===a.type||"atrule"===a.type&&!a.nodes)&&a===e.last&&!e.raws.semicolon||(a.source&&a.source.end?(o.source=this.sourcePath(a),o.original.line=a.source.end.line,o.original.column=a.source.end.column-1,o.generated.line=i,o.generated.column=n-2,this.map.addMapping(o)):(o.source=r,o.original.line=1,o.original.column=0,o.generated.line=i,o.generated.column=n-1,this.map.addMapping(o)))}}))}isAnnotation(){return!!this.isInline()||(void 0!==this.mapOpts.annotation?this.mapOpts.annotation:!this.previous().length||this.previous().some((e=>e.annotation)))}isInline(){if(void 0!==this.mapOpts.inline)return this.mapOpts.inline;let e=this.mapOpts.annotation;return(void 0===e||!0===e)&&(!this.previous().length||this.previous().some((e=>e.inline)))}isMap(){return void 0!==this.opts.map?!!this.opts.map:this.previous().length>0}isSourcesContent(){return void 0!==this.mapOpts.sourcesContent?this.mapOpts.sourcesContent:!this.previous().length||this.previous().some((e=>e.withContent()))}outputFile(){return this.opts.to?this.path(this.opts.to):this.opts.from?this.path(this.opts.from):"to.css"}path(e){if(this.mapOpts.absolute)return e;if(60===e.charCodeAt(0))return e;if(/^\w+:\/\//.test(e))return e;let t=this.memoizedPaths.get(e);if(t)return t;let i=this.opts.to?r(this.opts.to):".";"string"==typeof this.mapOpts.annotation&&(i=r(a(i,this.mapOpts.annotation)));let n=o(i,e);return this.memoizedPaths.set(e,n),n}previous(){if(!this.previousMaps)if(this.previousMaps=[],this.root)this.root.walk((e=>{if(e.source&&e.source.input.map){let t=e.source.input.map;this.previousMaps.includes(t)||this.previousMaps.push(t)}}));else{let e=new c(this.css,this.opts);e.map&&this.previousMaps.push(e.map)}return this.previousMaps}setSourcesContent(){let e={};if(this.root)this.root.walk((t=>{if(t.source){let i=t.source.input.from;if(i&&!e[i]){e[i]=!0;let n=this.usesFileUrls?this.toFileUrl(i):this.toUrl(this.path(i));this.map.setSourceContent(n,t.source.input.css)}}}));else if(this.css){let e=this.opts.from?this.toUrl(this.path(this.opts.from)):"";this.map.setSourceContent(e,this.css)}}sourcePath(e){return this.mapOpts.from?this.toUrl(this.mapOpts.from):this.usesFileUrls?this.toFileUrl(e.source.input.from):this.toUrl(this.path(e.source.input.from))}toBase64(e){return Buffer?Buffer.from(e).toString("base64"):window.btoa(unescape(encodeURIComponent(e)))}toFileUrl(e){let t=this.memoizedFileURLs.get(e);if(t)return t;if(h){let t=h(e).toString();return this.memoizedFileURLs.set(e,t),t}throw new Error("`map.absolute` option is not available in this PostCSS build")}toUrl(e){let t=this.memoizedURLs.get(e);if(t)return t;"\\"===l&&(e=e.replace(/\\/g,"/"));let i=encodeURI(e).replace(/[#?]/g,encodeURIComponent);return this.memoizedURLs.set(e,i),i}}},7744:(e,t,i)=>{"use strict";let n=i(4342),s=i(9573),r=(i(5411),i(6214));const o=i(165);class a{constructor(e,t,i){let r;t=t.toString(),this.stringified=!1,this._processor=e,this._css=t,this._opts=i,this._map=void 0;let a=s;this.result=new o(this._processor,r,this._opts),this.result.css=t;let l=this;Object.defineProperty(this.result,"root",{get:()=>l.root});let h=new n(a,r,this._opts,t);if(h.isMap()){let[e,t]=h.generate();e&&(this.result.css=e),t&&(this.result.map=t)}}async(){return this.error?Promise.reject(this.error):Promise.resolve(this.result)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}sync(){if(this.error)throw this.error;return this.result}then(e,t){return this.async().then(e,t)}toString(){return this._css}warnings(){return[]}get content(){return this.result.css}get css(){return this.result.css}get map(){return this.result.map}get messages(){return[]}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){if(this._root)return this._root;let e,t=r;try{e=t(this._css,this._opts)}catch(e){this.error=e}if(this.error)throw this.error;return this._root=e,e}get[Symbol.toStringTag](){return"NoWorkResult"}}e.exports=a,a.default=a},322:(e,t,i)=>{"use strict";let{isClean:n,my:s}=i(2450),r=i(2604),o=i(9906),a=i(9573);function l(e,t){let i=new e.constructor;for(let n in e){if(!Object.prototype.hasOwnProperty.call(e,n))continue;if("proxyCache"===n)continue;let s=e[n],r=typeof s;"parent"===n&&"object"===r?t&&(i[n]=t):"source"===n?i[n]=s:Array.isArray(s)?i[n]=s.map((e=>l(e,i))):("object"===r&&null!==s&&(s=l(s)),i[n]=s)}return i}class h{constructor(e={}){this.raws={},this[n]=!1,this[s]=!0;for(let t in e)if("nodes"===t){this.nodes=[];for(let i of e[t])"function"==typeof i.clone?this.append(i.clone()):this.append(i)}else this[t]=e[t]}addToError(e){if(e.postcssNode=this,e.stack&&this.source&&/\n\s{4}at /.test(e.stack)){let t=this.source;e.stack=e.stack.replace(/\n\s{4}at /,`$&${t.input.from}:${t.start.line}:${t.start.column}$&`)}return e}after(e){return this.parent.insertAfter(this,e),this}assign(e={}){for(let t in e)this[t]=e[t];return this}before(e){return this.parent.insertBefore(this,e),this}cleanRaws(e){delete this.raws.before,delete this.raws.after,e||delete this.raws.between}clone(e={}){let t=l(this);for(let i in e)t[i]=e[i];return t}cloneAfter(e={}){let t=this.clone(e);return this.parent.insertAfter(this,t),t}cloneBefore(e={}){let t=this.clone(e);return this.parent.insertBefore(this,t),t}error(e,t={}){if(this.source){let{end:i,start:n}=this.rangeBy(t);return this.source.input.error(e,{column:n.column,line:n.line},{column:i.column,line:i.line},t)}return new r(e)}getProxyProcessor(){return{get:(e,t)=>"proxyOf"===t?e:"root"===t?()=>e.root().toProxy():e[t],set:(e,t,i)=>(e[t]===i||(e[t]=i,"prop"!==t&&"value"!==t&&"name"!==t&&"params"!==t&&"important"!==t&&"text"!==t||e.markDirty()),!0)}}markDirty(){if(this[n]){this[n]=!1;let e=this;for(;e=e.parent;)e[n]=!1}}next(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e+1]}positionBy(e,t){let i=this.source.start;if(e.index)i=this.positionInside(e.index,t);else if(e.word){let n=(t=this.toString()).indexOf(e.word);-1!==n&&(i=this.positionInside(n,t))}return i}positionInside(e,t){let i=t||this.toString(),n=this.source.start.column,s=this.source.start.line;for(let t=0;t"object"==typeof e&&e.toJSON?e.toJSON(null,t):e));else if("object"==typeof n&&n.toJSON)i[e]=n.toJSON(null,t);else if("source"===e){let r=t.get(n.input);null==r&&(r=s,t.set(n.input,s),s++),i[e]={end:n.end,inputId:r,start:n.start}}else i[e]=n}return n&&(i.inputs=[...t.keys()].map((e=>e.toJSON()))),i}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}toString(e=a){e.stringify&&(e=e.stringify);let t="";return e(this,(e=>{t+=e})),t}warn(e,t,i){let n={node:this};for(let e in i)n[e]=i[e];return e.warn(t,n)}get proxyOf(){return this}}e.exports=h,h.default=h},6214:(e,t,i)=>{"use strict";let n=i(9930),s=i(6992),r=i(6970);function o(e,t){let i=new r(e,t),n=new s(i);try{n.parse()}catch(e){throw e}return n.root}e.exports=o,o.default=o,n.registerParse(o)},6992:(e,t,i)=>{"use strict";let n=i(9026),s=i(9985),r=i(1044),o=i(7983),a=i(4539),l=i(4146);const h={empty:!0,space:!0};e.exports=class{constructor(e){this.input=e,this.root=new a,this.current=this.root,this.spaces="",this.semicolon=!1,this.customProperty=!1,this.createTokenizer(),this.root.source={input:e,start:{column:1,line:1,offset:0}}}atrule(e){let t,i,n,s=new o;s.name=e[1].slice(1),""===s.name&&this.unnamedAtrule(s,e),this.init(s,e[2]);let r=!1,a=!1,l=[],h=[];for(;!this.tokenizer.endOfFile();){if(t=(e=this.tokenizer.nextToken())[0],"("===t||"["===t?h.push("("===t?")":"]"):"{"===t&&h.length>0?h.push("}"):t===h[h.length-1]&&h.pop(),0===h.length){if(";"===t){s.source.end=this.getPosition(e[2]),s.source.end.offset++,this.semicolon=!0;break}if("{"===t){a=!0;break}if("}"===t){if(l.length>0){for(n=l.length-1,i=l[n];i&&"space"===i[0];)i=l[--n];i&&(s.source.end=this.getPosition(i[3]||i[2]),s.source.end.offset++)}this.end(e);break}l.push(e)}else l.push(e);if(this.tokenizer.endOfFile()){r=!0;break}}s.raws.between=this.spacesAndCommentsFromEnd(l),l.length?(s.raws.afterName=this.spacesAndCommentsFromStart(l),this.raw(s,"params",l),r&&(e=l[l.length-1],s.source.end=this.getPosition(e[3]||e[2]),s.source.end.offset++,this.spaces=s.raws.between,s.raws.between="")):(s.raws.afterName="",s.params=""),a&&(s.nodes=[],this.current=s)}checkMissedSemicolon(e){let t=this.colon(e);if(!1===t)return;let i,n=0;for(let s=t-1;s>=0&&(i=e[s],"space"===i[0]||(n+=1,2!==n));s--);throw this.input.error("Missed semicolon","word"===i[0]?i[3]+1:i[2])}colon(e){let t,i,n,s=0;for(let[r,o]of e.entries()){if(t=o,i=t[0],"("===i&&(s+=1),")"===i&&(s-=1),0===s&&":"===i){if(n){if("word"===n[0]&&"progid"===n[1])continue;return r}this.doubleColon(t)}n=t}return!1}comment(e){let t=new r;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++;let i=e[1].slice(2,-2);if(/^\s*$/.test(i))t.text="",t.raws.left=i,t.raws.right="";else{let e=i.match(/^(\s*)([^]*\S)(\s*)$/);t.text=e[2],t.raws.left=e[1],t.raws.right=e[3]}}createTokenizer(){this.tokenizer=s(this.input)}decl(e,t){let i=new n;this.init(i,e[0][2]);let s,r=e[e.length-1];for(";"===r[0]&&(this.semicolon=!0,e.pop()),i.source.end=this.getPosition(r[3]||r[2]||function(e){for(let t=e.length-1;t>=0;t--){let i=e[t],n=i[3]||i[2];if(n)return n}}(e)),i.source.end.offset++;"word"!==e[0][0];)1===e.length&&this.unknownWord(e),i.raws.before+=e.shift()[1];for(i.source.start=this.getPosition(e[0][2]),i.prop="";e.length;){let t=e[0][0];if(":"===t||"space"===t||"comment"===t)break;i.prop+=e.shift()[1]}for(i.raws.between="";e.length;){if(s=e.shift(),":"===s[0]){i.raws.between+=s[1];break}"word"===s[0]&&/\w/.test(s[1])&&this.unknownWord([s]),i.raws.between+=s[1]}"_"!==i.prop[0]&&"*"!==i.prop[0]||(i.raws.before+=i.prop[0],i.prop=i.prop.slice(1));let o,a=[];for(;e.length&&(o=e[0][0],"space"===o||"comment"===o);)a.push(e.shift());this.precheckMissedSemicolon(e);for(let t=e.length-1;t>=0;t--){if(s=e[t],"!important"===s[1].toLowerCase()){i.important=!0;let n=this.stringFrom(e,t);n=this.spacesFromEnd(e)+n," !important"!==n&&(i.raws.important=n);break}if("important"===s[1].toLowerCase()){let n=e.slice(0),s="";for(let e=t;e>0;e--){let t=n[e][0];if(0===s.trim().indexOf("!")&&"space"!==t)break;s=n.pop()[1]+s}0===s.trim().indexOf("!")&&(i.important=!0,i.raws.important=s,e=n)}if("space"!==s[0]&&"comment"!==s[0])break}e.some((e=>"space"!==e[0]&&"comment"!==e[0]))&&(i.raws.between+=a.map((e=>e[1])).join(""),a=[]),this.raw(i,"value",a.concat(e),t),i.value.includes(":")&&!t&&this.checkMissedSemicolon(e)}doubleColon(e){throw this.input.error("Double colon",{offset:e[2]},{offset:e[2]+e[1].length})}emptyRule(e){let t=new l;this.init(t,e[2]),t.selector="",t.raws.between="",this.current=t}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.spaces="",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current.source.end.offset++,this.current=this.current.parent):this.unexpectedClose(e)}endFile(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.root.source.end=this.getPosition(this.tokenizer.position())}freeSemicolon(e){if(this.spaces+=e[1],this.current.nodes){let e=this.current.nodes[this.current.nodes.length-1];e&&"rule"===e.type&&!e.raws.ownSemicolon&&(e.raws.ownSemicolon=this.spaces,this.spaces="")}}getPosition(e){let t=this.input.fromOffset(e);return{column:t.col,line:t.line,offset:e}}init(e,t){this.current.push(e),e.source={input:this.input,start:this.getPosition(t)},e.raws.before=this.spaces,this.spaces="","comment"!==e.type&&(this.semicolon=!1)}other(e){let t=!1,i=null,n=!1,s=null,r=[],o=e[1].startsWith("--"),a=[],l=e;for(;l;){if(i=l[0],a.push(l),"("===i||"["===i)s||(s=l),r.push("("===i?")":"]");else if(o&&n&&"{"===i)s||(s=l),r.push("}");else if(0===r.length){if(";"===i){if(n)return void this.decl(a,o);break}if("{"===i)return void this.rule(a);if("}"===i){this.tokenizer.back(a.pop()),t=!0;break}":"===i&&(n=!0)}else i===r[r.length-1]&&(r.pop(),0===r.length&&(s=null));l=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),r.length>0&&this.unclosedBracket(s),t&&n){if(!o)for(;a.length&&(l=a[a.length-1][0],"space"===l||"comment"===l);)this.tokenizer.back(a.pop());this.decl(a,o)}else this.unknownWord(a)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case"space":this.spaces+=e[1];break;case";":this.freeSemicolon(e);break;case"}":this.end(e);break;case"comment":this.comment(e);break;case"at-word":this.atrule(e);break;case"{":this.emptyRule(e);break;default:this.other(e)}this.endFile()}precheckMissedSemicolon(){}raw(e,t,i,n){let s,r,o,a,l=i.length,c="",d=!0;for(let e=0;ee+t[1]),"");e.raws[t]={raw:n,value:c}}e[t]=c}rule(e){e.pop();let t=new l;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,"selector",e),this.current=t}spacesAndCommentsFromEnd(e){let t,i="";for(;e.length&&(t=e[e.length-1][0],"space"===t||"comment"===t);)i=e.pop()[1]+i;return i}spacesAndCommentsFromStart(e){let t,i="";for(;e.length&&(t=e[0][0],"space"===t||"comment"===t);)i+=e.shift()[1];return i}spacesFromEnd(e){let t,i="";for(;e.length&&(t=e[e.length-1][0],"space"===t);)i=e.pop()[1]+i;return i}stringFrom(e,t){let i="";for(let n=t;n{"use strict";let n=i(2604),s=i(9026),r=i(427),o=i(9930),a=i(540),l=i(9573),h=i(4899),c=i(2900),d=i(860),u=i(1044),p=i(7983),f=i(165),m=i(6970),g=i(6214),v=i(6065),O=i(4146),b=i(4539),_=i(322);function y(...e){return 1===e.length&&Array.isArray(e[0])&&(e=e[0]),new a(e)}y.plugin=function(e,t){let i,n=!1;function s(...i){console&&console.warn&&!n&&(n=!0,console.warn(e+": postcss.plugin was deprecated. Migration guide:\nhttps://evilmartians.com/chronicles/postcss-8-plugin-migration"),{}.LANG&&{}.LANG.startsWith("cn")&&console.warn(e+": 里面 postcss.plugin 被弃用. 迁移指南:\nhttps://www.w3ctech.com/topic/2226"));let s=t(...i);return s.postcssPlugin=e,s.postcssVersion=(new a).version,s}return Object.defineProperty(s,"postcss",{get:()=>(i||(i=s()),i)}),s.process=function(e,t,i){return y([s(i)]).process(e,t)},s},y.stringify=l,y.parse=g,y.fromJSON=h,y.list=v,y.comment=e=>new u(e),y.atRule=e=>new p(e),y.decl=e=>new s(e),y.rule=e=>new O(e),y.root=e=>new b(e),y.document=e=>new c(e),y.CssSyntaxError=n,y.Declaration=s,y.Container=o,y.Processor=a,y.Document=c,y.Comment=u,y.Warning=d,y.AtRule=p,y.Result=f,y.Input=m,y.Rule=O,y.Root=b,y.Node=_,r.registerPostcss(y),e.exports=y,y.default=y},2764:(e,t,i)=>{"use strict";let{SourceMapConsumer:n,SourceMapGenerator:s}=i(9059),{existsSync:r,readFileSync:o}=i(1336),{dirname:a,join:l}=i(2666);class h{constructor(e,t){if(!1===t.map)return;this.loadAnnotation(e),this.inline=this.startWith(this.annotation,"data:");let i=t.map?t.map.prev:void 0,n=this.loadMap(t.from,i);!this.mapFile&&t.from&&(this.mapFile=t.from),this.mapFile&&(this.root=a(this.mapFile)),n&&(this.text=n)}consumer(){return this.consumerCache||(this.consumerCache=new n(this.text)),this.consumerCache}decodeInline(e){if(/^data:application\/json;charset=utf-?8,/.test(e)||/^data:application\/json,/.test(e))return decodeURIComponent(e.substr(RegExp.lastMatch.length));if(/^data:application\/json;charset=utf-?8;base64,/.test(e)||/^data:application\/json;base64,/.test(e))return t=e.substr(RegExp.lastMatch.length),Buffer?Buffer.from(t,"base64").toString():window.atob(t);var t;let i=e.match(/data:application\/json;([^,]+),/)[1];throw new Error("Unsupported source map encoding "+i)}getAnnotationURL(e){return e.replace(/^\/\*\s*# sourceMappingURL=/,"").trim()}isMap(e){return"object"==typeof e&&("string"==typeof e.mappings||"string"==typeof e._mappings||Array.isArray(e.sections))}loadAnnotation(e){let t=e.match(/\/\*\s*# sourceMappingURL=/gm);if(!t)return;let i=e.lastIndexOf(t.pop()),n=e.indexOf("*/",i);i>-1&&n>-1&&(this.annotation=this.getAnnotationURL(e.substring(i,n)))}loadFile(e){if(this.root=a(e),r(e))return this.mapFile=e,o(e,"utf-8").toString().trim()}loadMap(e,t){if(!1===t)return!1;if(t){if("string"==typeof t)return t;if("function"!=typeof t){if(t instanceof n)return s.fromSourceMap(t).toString();if(t instanceof s)return t.toString();if(this.isMap(t))return JSON.stringify(t);throw new Error("Unsupported previous source map format: "+t.toString())}{let i=t(e);if(i){let e=this.loadFile(i);if(!e)throw new Error("Unable to load previous source map: "+i.toString());return e}}}else{if(this.inline)return this.decodeInline(this.annotation);if(this.annotation){let t=this.annotation;return e&&(t=l(a(e),t)),this.loadFile(t)}}}startWith(e,t){return!!e&&e.substr(0,t.length)===t}withContent(){return!!(this.consumer().sourcesContent&&this.consumer().sourcesContent.length>0)}}e.exports=h,h.default=h},540:(e,t,i)=>{"use strict";let n=i(7744),s=i(427),r=i(2900),o=i(4539);class a{constructor(e=[]){this.version="8.4.31",this.plugins=this.normalize(e)}normalize(e){let t=[];for(let i of e)if(!0===i.postcss?i=i():i.postcss&&(i=i.postcss),"object"==typeof i&&Array.isArray(i.plugins))t=t.concat(i.plugins);else if("object"==typeof i&&i.postcssPlugin)t.push(i);else if("function"==typeof i)t.push(i);else if("object"!=typeof i||!i.parse&&!i.stringify)throw new Error(i+" is not a PostCSS plugin");return t}process(e,t={}){return 0===this.plugins.length&&void 0===t.parser&&void 0===t.stringifier&&void 0===t.syntax?new n(this,e,t):new s(this,e,t)}use(e){return this.plugins=this.plugins.concat(this.normalize([e])),this}}e.exports=a,a.default=a,o.registerProcessor(a),r.registerProcessor(a)},165:(e,t,i)=>{"use strict";let n=i(860);class s{constructor(e,t,i){this.processor=e,this.messages=[],this.root=t,this.opts=i,this.css=void 0,this.map=void 0}toString(){return this.css}warn(e,t={}){t.plugin||this.lastPlugin&&this.lastPlugin.postcssPlugin&&(t.plugin=this.lastPlugin.postcssPlugin);let i=new n(e,t);return this.messages.push(i),i}warnings(){return this.messages.filter((e=>"warning"===e.type))}get content(){return this.css}}e.exports=s,s.default=s},4539:(e,t,i)=>{"use strict";let n,s,r=i(9930);class o extends r{constructor(e){super(e),this.type="root",this.nodes||(this.nodes=[])}normalize(e,t,i){let n=super.normalize(e);if(t)if("prepend"===i)this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let e of n)e.raws.before=t.raws.before;return n}removeChild(e,t){let i=this.index(e);return!t&&0===i&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[i].raws.before),super.removeChild(e)}toResult(e={}){return new n(new s,this,e).stringify()}}o.registerLazyResult=e=>{n=e},o.registerProcessor=e=>{s=e},e.exports=o,o.default=o,r.registerRoot(o)},4146:(e,t,i)=>{"use strict";let n=i(9930),s=i(6065);class r extends n{constructor(e){super(e),this.type="rule",this.nodes||(this.nodes=[])}get selectors(){return s.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\s*/):null,i=t?t[0]:","+this.raw("between","beforeOpen");this.selector=e.join(i)}}e.exports=r,r.default=r,n.registerRule(r)},9906:e=>{"use strict";const t={after:"\n",beforeClose:"\n",beforeComment:"\n",beforeDecl:"\n",beforeOpen:" ",beforeRule:"\n",colon:": ",commentLeft:" ",commentRight:" ",emptyBody:"",indent:" ",semicolon:!1};class i{constructor(e){this.builder=e}atrule(e,t){let i="@"+e.name,n=e.params?this.rawValue(e,"params"):"";if(void 0!==e.raws.afterName?i+=e.raws.afterName:n&&(i+=" "),e.nodes)this.block(e,i+n);else{let s=(e.raws.between||"")+(t?";":"");this.builder(i+n+s,e)}}beforeAfter(e,t){let i;i="decl"===e.type?this.raw(e,null,"beforeDecl"):"comment"===e.type?this.raw(e,null,"beforeComment"):"before"===t?this.raw(e,null,"beforeRule"):this.raw(e,null,"beforeClose");let n=e.parent,s=0;for(;n&&"root"!==n.type;)s+=1,n=n.parent;if(i.includes("\n")){let t=this.raw(e,null,"indent");if(t.length)for(let e=0;e0&&"comment"===e.nodes[t].type;)t-=1;let i=this.raw(e,"semicolon");for(let n=0;n{if(s=e.raws[i],void 0!==s)return!1}))}var a;return void 0===s&&(s=t[n]),o.rawCache[n]=s,s}rawBeforeClose(e){let t;return e.walk((e=>{if(e.nodes&&e.nodes.length>0&&void 0!==e.raws.after)return t=e.raws.after,t.includes("\n")&&(t=t.replace(/[^\n]+$/,"")),!1})),t&&(t=t.replace(/\S/g,"")),t}rawBeforeComment(e,t){let i;return e.walkComments((e=>{if(void 0!==e.raws.before)return i=e.raws.before,i.includes("\n")&&(i=i.replace(/[^\n]+$/,"")),!1})),void 0===i?i=this.raw(t,null,"beforeDecl"):i&&(i=i.replace(/\S/g,"")),i}rawBeforeDecl(e,t){let i;return e.walkDecls((e=>{if(void 0!==e.raws.before)return i=e.raws.before,i.includes("\n")&&(i=i.replace(/[^\n]+$/,"")),!1})),void 0===i?i=this.raw(t,null,"beforeRule"):i&&(i=i.replace(/\S/g,"")),i}rawBeforeOpen(e){let t;return e.walk((e=>{if("decl"!==e.type&&(t=e.raws.between,void 0!==t))return!1})),t}rawBeforeRule(e){let t;return e.walk((i=>{if(i.nodes&&(i.parent!==e||e.first!==i)&&void 0!==i.raws.before)return t=i.raws.before,t.includes("\n")&&(t=t.replace(/[^\n]+$/,"")),!1})),t&&(t=t.replace(/\S/g,"")),t}rawColon(e){let t;return e.walkDecls((e=>{if(void 0!==e.raws.between)return t=e.raws.between.replace(/[^\s:]/g,""),!1})),t}rawEmptyBody(e){let t;return e.walk((e=>{if(e.nodes&&0===e.nodes.length&&(t=e.raws.after,void 0!==t))return!1})),t}rawIndent(e){if(e.raws.indent)return e.raws.indent;let t;return e.walk((i=>{let n=i.parent;if(n&&n!==e&&n.parent&&n.parent===e&&void 0!==i.raws.before){let e=i.raws.before.split("\n");return t=e[e.length-1],t=t.replace(/\S/g,""),!1}})),t}rawSemicolon(e){let t;return e.walk((e=>{if(e.nodes&&e.nodes.length&&"decl"===e.last.type&&(t=e.raws.semicolon,void 0!==t))return!1})),t}rawValue(e,t){let i=e[t],n=e.raws[t];return n&&n.value===i?n.raw:i}root(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}rule(e){this.block(e,this.rawValue(e,"selector")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,"end")}stringify(e,t){if(!this[e.type])throw new Error("Unknown AST node type "+e.type+". Maybe you need to change PostCSS stringifier.");this[e.type](e,t)}}e.exports=i,i.default=i},9573:(e,t,i)=>{"use strict";let n=i(9906);function s(e,t){new n(t).stringify(e)}e.exports=s,s.default=s},2450:e=>{"use strict";e.exports.isClean=Symbol("isClean"),e.exports.my=Symbol("my")},9985:e=>{"use strict";const t="'".charCodeAt(0),i='"'.charCodeAt(0),n="\\".charCodeAt(0),s="/".charCodeAt(0),r="\n".charCodeAt(0),o=" ".charCodeAt(0),a="\f".charCodeAt(0),l="\t".charCodeAt(0),h="\r".charCodeAt(0),c="[".charCodeAt(0),d="]".charCodeAt(0),u="(".charCodeAt(0),p=")".charCodeAt(0),f="{".charCodeAt(0),m="}".charCodeAt(0),g=";".charCodeAt(0),v="*".charCodeAt(0),O=":".charCodeAt(0),b="@".charCodeAt(0),_=/[\t\n\f\r "#'()/;[\\\]{}]/g,y=/[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g,w=/.[\r\n"'(/\\]/,x=/[\da-f]/i;e.exports=function(e,S={}){let k,T,C,P,M,E,A,R,D,I,q=e.css.valueOf(),L=S.ignoreErrors,N=q.length,B=0,$=[],Q=[];function z(t){throw e.error("Unclosed "+t,B)}return{back:function(e){Q.push(e)},endOfFile:function(){return 0===Q.length&&B>=N},nextToken:function(e){if(Q.length)return Q.pop();if(B>=N)return;let S=!!e&&e.ignoreUnclosed;switch(k=q.charCodeAt(B),k){case r:case o:case l:case h:case a:T=B;do{T+=1,k=q.charCodeAt(T)}while(k===o||k===r||k===l||k===h||k===a);I=["space",q.slice(B,T)],B=T-1;break;case c:case d:case f:case m:case O:case g:case p:{let e=String.fromCharCode(k);I=[e,e,B];break}case u:if(R=$.length?$.pop()[1]:"",D=q.charCodeAt(B+1),"url"===R&&D!==t&&D!==i&&D!==o&&D!==r&&D!==l&&D!==a&&D!==h){T=B;do{if(E=!1,T=q.indexOf(")",T+1),-1===T){if(L||S){T=B;break}z("bracket")}for(A=T;q.charCodeAt(A-1)===n;)A-=1,E=!E}while(E);I=["brackets",q.slice(B,T+1),B,T],B=T}else T=q.indexOf(")",B+1),P=q.slice(B,T+1),-1===T||w.test(P)?I=["(","(",B]:(I=["brackets",P,B,T],B=T);break;case t:case i:C=k===t?"'":'"',T=B;do{if(E=!1,T=q.indexOf(C,T+1),-1===T){if(L||S){T=B+1;break}z("string")}for(A=T;q.charCodeAt(A-1)===n;)A-=1,E=!E}while(E);I=["string",q.slice(B,T+1),B,T],B=T;break;case b:_.lastIndex=B+1,_.test(q),T=0===_.lastIndex?q.length-1:_.lastIndex-2,I=["at-word",q.slice(B,T+1),B,T],B=T;break;case n:for(T=B,M=!0;q.charCodeAt(T+1)===n;)T+=1,M=!M;if(k=q.charCodeAt(T+1),M&&k!==s&&k!==o&&k!==r&&k!==l&&k!==h&&k!==a&&(T+=1,x.test(q.charAt(T)))){for(;x.test(q.charAt(T+1));)T+=1;q.charCodeAt(T+1)===o&&(T+=1)}I=["word",q.slice(B,T+1),B,T],B=T;break;default:k===s&&q.charCodeAt(B+1)===v?(T=q.indexOf("*/",B+2)+1,0===T&&(L||S?T=q.length:z("comment")),I=["comment",q.slice(B,T+1),B,T],B=T):(y.lastIndex=B+1,y.test(q),T=0===y.lastIndex?q.length-1:y.lastIndex-2,I=["word",q.slice(B,T+1),B,T],$.push(I),B=T)}return B++,I},position:function(){return B}}}},5411:e=>{"use strict";let t={};e.exports=function(e){t[e]||(t[e]=!0,"undefined"!=typeof console&&console.warn&&console.warn(e))}},860:e=>{"use strict";class t{constructor(e,t={}){if(this.type="warning",this.text=e,t.node&&t.node.source){let e=t.node.rangeBy(t);this.line=e.start.line,this.column=e.start.column,this.endLine=e.end.line,this.endColumn=e.end.column}for(let e in t)this[e]=t[e]}toString(){return this.node?this.node.error(this.text,{index:this.index,plugin:this.plugin,word:this.word}).message:this.plugin?this.plugin+": "+this.text:this.text}}e.exports=t,t.default=t},8878:(e,t)=>{"use strict";var i=Object.prototype.hasOwnProperty;function n(e){try{return decodeURIComponent(e.replace(/\+/g," "))}catch(e){return null}}function s(e){try{return encodeURIComponent(e)}catch(e){return null}}t.stringify=function(e,t){t=t||"";var n,r,o=[];for(r in"string"!=typeof t&&(t="?"),e)if(i.call(e,r)){if((n=e[r])||null!=n&&!isNaN(n)||(n=""),r=s(r),n=s(n),null===r||null===n)continue;o.push(r+"="+n)}return o.length?t+o.join("&"):""},t.parse=function(e){for(var t,i=/([^=?#&]+)=?([^&]*)/g,s={};t=i.exec(e);){var r=n(t[1]),o=n(t[2]);null===r||null===o||r in s||(s[r]=o)}return s}},1384:e=>{"use strict";e.exports=function(e,t){if(t=t.split(":")[0],!(e=+e))return!1;switch(t){case"http":case"ws":return 80!==e;case"https":case"wss":return 443!==e;case"ftp":return 21!==e;case"gopher":return 70!==e;case"file":return!1}return 0!==e}},1622:(e,t,i)=>{const n=i(1659),s=i(3419),{isPlainObject:r}=i(3056),o=i(2454),a=i(9382),{parse:l}=i(5356),h=["img","audio","video","picture","svg","object","map","iframe","embed"],c=["script","style"];function d(e,t){e&&Object.keys(e).forEach((function(i){t(e[i],i)}))}function u(e,t){return{}.hasOwnProperty.call(e,t)}function p(e,t){const i=[];return d(e,(function(e){t(e)&&i.push(e)})),i}e.exports=m;const f=/^[^\0\t\n\f\r /<=>]+$/;function m(e,t,i){if(null==e)return"";let v="",O="";function b(e,t){const i=this;this.tag=e,this.attribs=t||{},this.tagPosition=v.length,this.text="",this.mediaChildren=[],this.updateParentNodeText=function(){M.length&&(M[M.length-1].text+=i.text)},this.updateParentNodeMediaChildren=function(){M.length&&h.includes(this.tag)&&M[M.length-1].mediaChildren.push(this.tag)}}(t=Object.assign({},m.defaults,t)).parser=Object.assign({},g,t.parser),c.forEach((function(e){!1!==t.allowedTags&&(t.allowedTags||[]).indexOf(e)>-1&&!t.allowVulnerableTags&&console.warn(`\n\n⚠️ Your \`allowedTags\` option includes, \`${e}\`, which is inherently\nvulnerable to XSS attacks. Please remove it from \`allowedTags\`.\nOr, to disable this warning, add the \`allowVulnerableTags\` option\nand ensure you are accounting for this risk.\n\n`)}));const _=t.nonTextTags||["script","style","textarea","option"];let y,w;t.allowedAttributes&&(y={},w={},d(t.allowedAttributes,(function(e,t){y[t]=[];const i=[];e.forEach((function(e){"string"==typeof e&&e.indexOf("*")>=0?i.push(s(e).replace(/\\\*/g,".*")):y[t].push(e)})),i.length&&(w[t]=new RegExp("^("+i.join("|")+")$"))})));const x={},S={},k={};d(t.allowedClasses,(function(e,t){y&&(u(y,t)||(y[t]=[]),y[t].push("class")),x[t]=[],k[t]=[];const i=[];e.forEach((function(e){"string"==typeof e&&e.indexOf("*")>=0?i.push(s(e).replace(/\\\*/g,".*")):e instanceof RegExp?k[t].push(e):x[t].push(e)})),i.length&&(S[t]=new RegExp("^("+i.join("|")+")$"))}));const T={};let C,P,M,E,A,R,D;d(t.transformTags,(function(e,t){let i;"function"==typeof e?i=e:"string"==typeof e&&(i=m.simpleTransform(e)),"*"===t?C=i:T[t]=i}));let I=!1;L();const q=new n.Parser({onopentag:function(e,i){if(t.enforceHtmlBoundary&&"html"===e&&L(),R)return void D++;const n=new b(e,i);M.push(n);let s=!1;const h=!!n.text;let c;if(u(T,e)&&(c=T[e](e,i),n.attribs=i=c.attribs,void 0!==c.text&&(n.innerText=c.text),e!==c.tagName&&(n.name=e=c.tagName,A[P]=c.tagName)),C&&(c=C(e,i),n.attribs=i=c.attribs,e!==c.tagName&&(n.name=e=c.tagName,A[P]=c.tagName)),(!1!==t.allowedTags&&-1===(t.allowedTags||[]).indexOf(e)||"recursiveEscape"===t.disallowedTagsMode&&!function(e){for(const t in e)if(u(e,t))return!1;return!0}(E)||null!=t.nestingLimit&&P>=t.nestingLimit)&&(s=!0,E[P]=!0,"discard"===t.disallowedTagsMode&&-1!==_.indexOf(e)&&(R=!0,D=1),E[P]=!0),P++,s){if("discard"===t.disallowedTagsMode)return;O=v,v=""}v+="<"+e,"script"===e&&(t.allowedScriptHostnames||t.allowedScriptDomains)&&(n.innerText=""),(!y||u(y,e)||y["*"])&&d(i,(function(i,s){if(!f.test(s))return void delete n.attribs[s];let h=!1;if(!y||u(y,e)&&-1!==y[e].indexOf(s)||y["*"]&&-1!==y["*"].indexOf(s)||u(w,e)&&w[e].test(s)||w["*"]&&w["*"].test(s))h=!0;else if(y&&y[e])for(const t of y[e])if(r(t)&&t.name&&t.name===s){h=!0;let e="";if(!0===t.multiple){const n=i.split(" ");for(const i of n)-1!==t.values.indexOf(i)&&(""===e?e=i:e+=" "+i)}else t.values.indexOf(i)>=0&&(e=i);i=e}if(h){if(-1!==t.allowedSchemesAppliedToAttributes.indexOf(s)&&B(e,i))return void delete n.attribs[s];if("script"===e&&"src"===s){let e=!0;try{const n=$(i);if(t.allowedScriptHostnames||t.allowedScriptDomains){const i=(t.allowedScriptHostnames||[]).find((function(e){return e===n.url.hostname})),s=(t.allowedScriptDomains||[]).find((function(e){return n.url.hostname===e||n.url.hostname.endsWith(`.${e}`)}));e=i||s}}catch(t){e=!1}if(!e)return void delete n.attribs[s]}if("iframe"===e&&"src"===s){let e=!0;try{const n=$(i);if(n.isRelativeUrl)e=u(t,"allowIframeRelativeUrls")?t.allowIframeRelativeUrls:!t.allowedIframeHostnames&&!t.allowedIframeDomains;else if(t.allowedIframeHostnames||t.allowedIframeDomains){const i=(t.allowedIframeHostnames||[]).find((function(e){return e===n.url.hostname})),s=(t.allowedIframeDomains||[]).find((function(e){return n.url.hostname===e||n.url.hostname.endsWith(`.${e}`)}));e=i||s}}catch(t){e=!1}if(!e)return void delete n.attribs[s]}if("srcset"===s)try{let e=a(i);if(e.forEach((function(e){B("srcset",e.url)&&(e.evil=!0)})),e=p(e,(function(e){return!e.evil})),!e.length)return void delete n.attribs[s];i=p(e,(function(e){return!e.evil})).map((function(e){if(!e.url)throw new Error("URL missing");return e.url+(e.w?` ${e.w}w`:"")+(e.h?` ${e.h}h`:"")+(e.d?` ${e.d}x`:"")})).join(", "),n.attribs[s]=i}catch(e){return void delete n.attribs[s]}if("class"===s){const t=x[e],r=x["*"],a=S[e],l=k[e],h=[a,S["*"]].concat(l).filter((function(e){return e}));if(!(c=i,d=t&&r?o(t,r):t||r,m=h,i=d?(c=c.split(/\s+/)).filter((function(e){return-1!==d.indexOf(e)||m.some((function(t){return t.test(e)}))})).join(" "):c).length)return void delete n.attribs[s]}if("style"===s)try{if(i=function(e){return e.nodes[0].nodes.reduce((function(e,t){return e.push(`${t.prop}:${t.value}${t.important?" !important":""}`),e}),[]).join(";")}(function(e,t){if(!t)return e;const i=e.nodes[0];let n;return n=t[i.selector]&&t["*"]?o(t[i.selector],t["*"]):t[i.selector]||t["*"],n&&(e.nodes[0].nodes=i.nodes.reduce(function(e){return function(t,i){return u(e,i.prop)&&e[i.prop].some((function(e){return e.test(i.value)}))&&t.push(i),t}}(n),[])),e}(l(e+" {"+i+"}"),t.allowedStyles)),0===i.length)return void delete n.attribs[s]}catch(e){return void delete n.attribs[s]}v+=" "+s,i&&i.length&&(v+='="'+N(i,!0)+'"')}else delete n.attribs[s];var c,d,m})),-1!==t.selfClosing.indexOf(e)?v+=" />":(v+=">",!n.innerText||h||t.textFilter||(v+=N(n.innerText),I=!0)),s&&(v=O+N(v),O="")},ontext:function(e){if(R)return;const i=M[M.length-1];let n;if(i&&(n=i.tag,e=void 0!==i.innerText?i.innerText:e),"discard"!==t.disallowedTagsMode||"script"!==n&&"style"!==n){const i=N(e,!1);t.textFilter&&!I?v+=t.textFilter(i,n):I||(v+=i)}else v+=e;M.length&&(M[M.length-1].text+=e)},onclosetag:function(e){if(R){if(D--,D)return;R=!1}const i=M.pop();if(!i)return;if(i.tag!==e)return void M.push(i);R=!!t.enforceHtmlBoundary&&"html"===e,P--;const n=E[P];if(n){if(delete E[P],"discard"===t.disallowedTagsMode)return void i.updateParentNodeText();O=v,v=""}A[P]&&(e=A[P],delete A[P]),t.exclusiveFilter&&t.exclusiveFilter(i)?v=v.substr(0,i.tagPosition):(i.updateParentNodeMediaChildren(),i.updateParentNodeText(),-1===t.selfClosing.indexOf(e)?(v+="",n&&(v=O+N(v),O=""),I=!1):n&&(v=O,O=""))}},t.parser);return q.write(e),q.end(),v;function L(){v="",P=0,M=[],E={},A={},R=!1,D=0}function N(e,i){return"string"!=typeof e&&(e+=""),t.parser.decodeEntities&&(e=e.replace(/&/g,"&").replace(//g,">"),i&&(e=e.replace(/"/g,"""))),e=e.replace(/&(?![a-zA-Z0-9#]{1,20};)/g,"&").replace(//g,">"),i&&(e=e.replace(/"/g,""")),e}function B(e,i){for(i=i.replace(/[\x00-\x20]+/g,"");;){const e=i.indexOf("\x3c!--");if(-1===e)break;const t=i.indexOf("--\x3e",e+4);if(-1===t)break;i=i.substring(0,e)+i.substring(t+3)}const n=i.match(/^([a-zA-Z][a-zA-Z0-9.\-+]*):/);if(!n)return!!i.match(/^[/\\]{2}/)&&!t.allowProtocolRelative;const s=n[1].toLowerCase();return u(t.allowedSchemesByTag,e)?-1===t.allowedSchemesByTag[e].indexOf(s):!t.allowedSchemes||-1===t.allowedSchemes.indexOf(s)}function $(e){if((e=e.replace(/^(\w+:)?\s*[\\/]\s*[\\/]/,"$1//")).startsWith("relative:"))throw new Error("relative: exploit attempt");let t="relative://relative-site";for(let e=0;e<100;e++)t+=`/${e}`;const i=new URL(e,t);return{isRelativeUrl:i&&"relative-site"===i.hostname&&"relative:"===i.protocol,url:i}}}const g={decodeEntities:!0};m.defaults={allowedTags:["address","article","aside","footer","header","h1","h2","h3","h4","h5","h6","hgroup","main","nav","section","blockquote","dd","div","dl","dt","figcaption","figure","hr","li","main","ol","p","pre","ul","a","abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rb","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","caption","col","colgroup","table","tbody","td","tfoot","th","thead","tr"],disallowedTagsMode:"discard",allowedAttributes:{a:["href","name","target"],img:["src","srcset","alt","title","width","height","loading"]},selfClosing:["img","br","hr","area","base","basefont","input","link","meta"],allowedSchemes:["http","https","ftp","mailto","tel"],allowedSchemesByTag:{},allowedSchemesAppliedToAttributes:["href","src","cite"],allowProtocolRelative:!0,enforceHtmlBoundary:!1},m.simpleTransform=function(e,t,i){return i=void 0===i||i,t=t||{},function(n,s){let r;if(i)for(r in t)s[r]=t[r];else s=t;return{tagName:e,attribs:s}}}},2296:(e,t,i)=>{"use strict";var n=i(1384),s=i(8878),r=/^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,o=/[\n\r\t]/g,a=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,l=/:\d+$/,h=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,c=/^[a-zA-Z]:/;function d(e){return(e||"").toString().replace(r,"")}var u=[["#","hash"],["?","query"],function(e,t){return m(t.protocol)?e.replace(/\\/g,"/"):e},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d*)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],p={hash:1,query:1};function f(e){var t,n=("undefined"!=typeof window?window:void 0!==i.g?i.g:"undefined"!=typeof self?self:{}).location||{},s={},r=typeof(e=e||n);if("blob:"===e.protocol)s=new v(unescape(e.pathname),{});else if("string"===r)for(t in s=new v(e,{}),p)delete s[t];else if("object"===r){for(t in e)t in p||(s[t]=e[t]);void 0===s.slashes&&(s.slashes=a.test(e.href))}return s}function m(e){return"file:"===e||"ftp:"===e||"http:"===e||"https:"===e||"ws:"===e||"wss:"===e}function g(e,t){e=(e=d(e)).replace(o,""),t=t||{};var i,n=h.exec(e),s=n[1]?n[1].toLowerCase():"",r=!!n[2],a=!!n[3],l=0;return r?a?(i=n[2]+n[3]+n[4],l=n[2].length+n[3].length):(i=n[2]+n[4],l=n[2].length):a?(i=n[3]+n[4],l=n[3].length):i=n[4],"file:"===s?l>=2&&(i=i.slice(2)):m(s)?i=n[4]:s?r&&(i=i.slice(2)):l>=2&&m(t.protocol)&&(i=n[4]),{protocol:s,slashes:r||m(s),slashesCount:l,rest:i}}function v(e,t,i){if(e=(e=d(e)).replace(o,""),!(this instanceof v))return new v(e,t,i);var r,a,l,h,p,O,b=u.slice(),_=typeof t,y=this,w=0;for("object"!==_&&"string"!==_&&(i=t,t=null),i&&"function"!=typeof i&&(i=s.parse),r=!(a=g(e||"",t=f(t))).protocol&&!a.slashes,y.slashes=a.slashes||r&&t.slashes,y.protocol=a.protocol||t.protocol||"",e=a.rest,("file:"===a.protocol&&(2!==a.slashesCount||c.test(e))||!a.slashes&&(a.protocol||a.slashesCount<2||!m(y.protocol)))&&(b[3]=[/(.*)/,"pathname"]);w{},1336:()=>{},2666:()=>{},9059:()=>{},415:()=>{},8845:e=>{e.exports={nanoid:(e=21)=>{let t="",i=e;for(;i--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[64*Math.random()|0];return t},customAlphabet:(e,t=21)=>(i=t)=>{let n="",s=i;for(;s--;)n+=e[Math.random()*e.length|0];return n}}},6399:e=>{"use strict";e.exports=JSON.parse('{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}')},2810:e=>{"use strict";e.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"\'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\\"","QUOT":"\\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}')},2836:e=>{"use strict";e.exports=JSON.parse('{"Aacute":"Á","aacute":"á","Acirc":"Â","acirc":"â","acute":"´","AElig":"Æ","aelig":"æ","Agrave":"À","agrave":"à","amp":"&","AMP":"&","Aring":"Å","aring":"å","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","brvbar":"¦","Ccedil":"Ç","ccedil":"ç","cedil":"¸","cent":"¢","copy":"©","COPY":"©","curren":"¤","deg":"°","divide":"÷","Eacute":"É","eacute":"é","Ecirc":"Ê","ecirc":"ê","Egrave":"È","egrave":"è","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","frac12":"½","frac14":"¼","frac34":"¾","gt":">","GT":">","Iacute":"Í","iacute":"í","Icirc":"Î","icirc":"î","iexcl":"¡","Igrave":"Ì","igrave":"ì","iquest":"¿","Iuml":"Ï","iuml":"ï","laquo":"«","lt":"<","LT":"<","macr":"¯","micro":"µ","middot":"·","nbsp":" ","not":"¬","Ntilde":"Ñ","ntilde":"ñ","Oacute":"Ó","oacute":"ó","Ocirc":"Ô","ocirc":"ô","Ograve":"Ò","ograve":"ò","ordf":"ª","ordm":"º","Oslash":"Ø","oslash":"ø","Otilde":"Õ","otilde":"õ","Ouml":"Ö","ouml":"ö","para":"¶","plusmn":"±","pound":"£","quot":"\\"","QUOT":"\\"","raquo":"»","reg":"®","REG":"®","sect":"§","shy":"­","sup1":"¹","sup2":"²","sup3":"³","szlig":"ß","THORN":"Þ","thorn":"þ","times":"×","Uacute":"Ú","uacute":"ú","Ucirc":"Û","ucirc":"û","Ugrave":"Ù","ugrave":"ù","uml":"¨","Uuml":"Ü","uuml":"ü","Yacute":"Ý","yacute":"ý","yen":"¥","yuml":"ÿ"}')},8689:e=>{"use strict";e.exports=JSON.parse('{"amp":"&","apos":"\'","gt":">","lt":"<","quot":"\\""}')}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var i=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(i.exports,i,i.exports,__webpack_require__),i.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var i in t)__webpack_require__.o(t,i)&&!__webpack_require__.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};(()=>{"use strict";class e{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){let s=[];return this.decompose(0,e,s,2),n.length&&n.decompose(0,n.length,s,3),this.decompose(t,this.length,s,1),i.from(s,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){let n=[];return this.decompose(e,t,n,0),i.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),n=new r(this),s=new r(e);for(let e=t,r=t;;){if(n.next(e),s.next(e),e=0,n.lineBreak!=s.lineBreak||n.done!=s.done||n.value!=s.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(e=1){return new r(this,e)}iterRange(e,t=this.length){return new o(this,e,t)}iterLines(e,t){let i;if(null==e)i=this.iter();else{null==t&&(t=this.lines+1);let n=this.line(e).from;i=this.iterRange(n,Math.max(n,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new a(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(n){if(0==n.length)throw new RangeError("A document must have at least one line");return 1!=n.length||n[0]?n.length<=32?new t(n):i.from(t.split(n,[])):e.empty}}class t extends e{constructor(e,t=function(e){let t=-1;for(let i of e)t+=i.length+1;return t}(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,n){for(let s=0;;s++){let r=this.text[s],o=n+r.length;if((t?i:o)>=e)return new l(n,o,i,r);n=o+1,i++}}decompose(e,i,r,o){let a=e<=0&&i>=this.length?this:new t(s(this.text,e,i),Math.min(i,this.length)-Math.max(0,e));if(1&o){let e=r.pop(),i=n(a.text,e.text.slice(),0,a.length);if(i.length<=32)r.push(new t(i,e.length+a.length));else{let e=i.length>>1;r.push(new t(i.slice(0,e)),new t(i.slice(e)))}}else r.push(a)}replace(e,r,o){if(!(o instanceof t))return super.replace(e,r,o);let a=n(this.text,n(o.text,s(this.text,0,e)),r),l=this.length+o.length-(r-e);return a.length<=32?new t(a,l):i.from(t.split(a,[]),l)}sliceString(e,t=this.length,i="\n"){let n="";for(let s=0,r=0;s<=t&&re&&r&&(n+=i),es&&(n+=o.slice(Math.max(0,e-s),t-s)),s=a+1}return n}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,i){let n=[],s=-1;for(let r of e)n.push(r),s+=r.length+1,32==n.length&&(i.push(new t(n,s)),n=[],s=-1);return s>-1&&i.push(new t(n,s)),i}}class i extends e{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let t of e)this.lines+=t.lines}lineInner(e,t,i,n){for(let s=0;;s++){let r=this.children[s],o=n+r.length,a=i+r.lines-1;if((t?a:o)>=e)return r.lineInner(e,t,i,n);n=o+1,i=a+1}}decompose(e,t,i,n){for(let s=0,r=0;r<=t&&s=r){let s=n&((r<=e?1:0)|(a>=t?2:0));r>=e&&a<=t&&!s?i.push(o):o.decompose(e-r,t-r,i,s)}r=a+1}}replace(e,t,n){if(n.lines=r&&t<=a){let l=o.replace(e-r,t-r,n),h=this.lines-o.lines+l.lines;if(l.lines>4&&l.lines>h>>6){let r=this.children.slice();return r[s]=l,new i(r,this.length-(t-e)+n.length)}return super.replace(r,a,l)}r=a+1}return super.replace(e,t,n)}sliceString(e,t=this.length,i="\n"){let n="";for(let s=0,r=0;se&&s&&(n+=i),er&&(n+=o.sliceString(e-r,t-r,i)),r=a+1}return n}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof i))return 0;let n=0,[s,r,o,a]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;s+=t,r+=t){if(s==o||r==a)return n;let i=this.children[s],l=e.children[r];if(i!=l)return n+i.scanIdentical(l,t);n+=i.length+1}}static from(e,n=e.reduce(((e,t)=>e+t.length+1),-1)){let s=0;for(let t of e)s+=t.lines;if(s<32){let i=[];for(let t of e)t.flatten(i);return new t(i,n)}let r=Math.max(32,s>>5),o=r<<1,a=r>>1,l=[],h=0,c=-1,d=[];function u(e){let n;if(e.lines>o&&e instanceof i)for(let t of e.children)u(t);else e.lines>a&&(h>a||!h)?(p(),l.push(e)):e instanceof t&&h&&(n=d[d.length-1])instanceof t&&e.lines+n.lines<=32?(h+=e.lines,c+=e.length+1,d[d.length-1]=new t(n.text.concat(e.text),n.length+1+e.length)):(h+e.lines>r&&p(),h+=e.lines,c+=e.length+1,d.push(e))}function p(){0!=h&&(l.push(1==d.length?d[0]:i.from(d,c)),c=-1,h=d.length=0)}for(let t of e)u(t);return p(),1==l.length?l[0]:new i(l,n)}}function n(e,t,i=0,n=1e9){for(let s=0,r=0,o=!0;r=i&&(l>n&&(a=a.slice(0,n-s)),s0?1:(e instanceof t?e.text.length:e.children.length)<<1]}nextInner(e,i){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,s=this.nodes[n],r=this.offsets[n],o=r>>1,a=s instanceof t?s.text.length:s.children.length;if(o==(i>0?a:0)){if(0==n)return this.done=!0,this.value="",this;i>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((1&r)==(i>0?0:1)){if(this.offsets[n]+=i,0==e)return this.lineBreak=!0,this.value="\n",this;e--}else if(s instanceof t){let t=s.text[o+(i<0?-1:0)];if(this.offsets[n]+=i,t.length>Math.max(0,e))return this.value=0==e?t:i>0?t.slice(e):t.slice(0,t.length-e),this;e-=t.length}else{let r=s.children[o+(i<0?-1:0)];e>r.length?(e-=r.length,this.offsets[n]+=i):(i<0&&this.offsets[n]--,this.nodes.push(r),this.offsets.push(i>0?1:(r instanceof t?r.text.length:r.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}}class o{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new r(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:n}=this.cursor.next(e);return this.pos+=(n.length+e)*t,this.value=n.length<=i?n:t<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&""!=this.value}}class a{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:n}=this.inner.next(e);return t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}}"undefined"!=typeof Symbol&&(e.prototype[Symbol.iterator]=function(){return this.iter()},r.prototype[Symbol.iterator]=o.prototype[Symbol.iterator]=a.prototype[Symbol.iterator]=function(){return this});class l{constructor(e,t,i,n){this.from=e,this.to=t,this.number=i,this.text=n}get length(){return this.to-this.from}}let h="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map((e=>e?parseInt(e,36):1));for(let e=1;ee)return h[t-1]<=e;return!1}function d(e){return e>=127462&&e<=127487}const u=8205;function p(e,t,i=!0,n=!0){return(i?f:m)(e,t,n)}function f(e,t,i){if(t==e.length)return t;t&&g(e.charCodeAt(t))&&v(e.charCodeAt(t-1))&&t--;let n=O(e,t);for(t+=_(n);t=0&&d(O(e,n));)i++,n-=2;if(i%2==0)break;t+=2}}}return t}function m(e,t,i){for(;t>0;){let n=f(e,t-2,i);if(n=56320&&e<57344}function v(e){return e>=55296&&e<56320}function O(e,t){let i=e.charCodeAt(t);if(!v(i)||t+1==e.length)return i;let n=e.charCodeAt(t+1);return g(n)?n-56320+(i-55296<<10)+65536:i}function b(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}function _(e){return e<65536?1:2}const y=/\r\n?|\n/;var w=function(e){return e[e.Simple=0]="Simple",e[e.TrackDel=1]="TrackDel",e[e.TrackBefore=2]="TrackBefore",e[e.TrackAfter=3]="TrackAfter",e}(w||(w={}));class x{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return s+(e-n);s+=o}else{if(i!=w.Simple&&l>=e&&(i==w.TrackDel&&ne||i==w.TrackBefore&&ne))return null;if(l>e||l==e&&t<0&&!o)return e==n||t<0?s:s+a;s+=a}n=l}if(e>n)throw new RangeError(`Position ${e} is out of range for changeset of length ${n}`);return s}touchesRange(e,t=e){for(let i=0,n=0;i=0&&n<=t&&s>=e)return!(nt)||"cover";n=s}return!1}toString(){let e="";for(let t=0;t=0?":"+n:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some((e=>"number"!=typeof e)))throw new RangeError("Invalid JSON representation of ChangeDesc");return new x(e)}static create(e){return new x(e)}}class S extends x{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return C(this,((t,i,n,s,r)=>e=e.replace(n,n+(i-t),r)),!1),e}mapDesc(e,t=!1){return P(this,e,t,!0)}invert(t){let i=this.sections.slice(),n=[];for(let s=0,r=0;s=0){i[s]=a,i[s+1]=o;let l=s>>1;for(;n.length0&&T(i,t,s.text),s.forward(e),o+=e}let l=e[r++];for(;o>1].toJSON()))}return e}static of(t,i,n){let s=[],r=[],o=0,a=null;function l(e=!1){if(!e&&!s.length)return;oa||t<0||a>i)throw new RangeError(`Invalid change range ${t} to ${a} (in doc of length ${i})`);let d=c?"string"==typeof c?e.of(c.split(n||y)):c:e.empty,u=d.length;if(t==a&&0==u)return;to&&k(s,t-o,-1),k(s,a-t,u),T(r,s,d),o=a}}(t),l(!a),a}static empty(e){return new S(e?[e,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let i=[],n=[];for(let s=0;st&&"string"!=typeof e)))throw new RangeError("Invalid JSON representation of ChangeSet");if(1==r.length)i.push(r[0],0);else{for(;n.length=0&&i<=0&&i==e[s+1]?e[s]+=t:0==t&&0==e[s]?e[s+1]+=i:n?(e[s]+=t,e[s+1]+=i):e.push(t,i)}function T(t,i,n){if(0==n.length)return;let s=i.length-2>>1;if(s>1])),!(n||a==t.sections.length||t.sections[a+1]<0);)l=t.sections[a++],h=t.sections[a++];i(r,c,o,d,u),r=c,o=d}}}function P(e,t,i,n=!1){let s=[],r=n?[]:null,o=new E(e),a=new E(t);for(let e=-1;;)if(-1==o.ins&&-1==a.ins){let e=Math.min(o.len,a.len);k(s,e,-1),o.forward(e),a.forward(e)}else if(a.ins>=0&&(o.ins<0||e==o.i||0==o.off&&(a.len=0&&e=0)){if(o.done&&a.done)return r?S.createSet(s,r):x.create(s);throw new Error("Mismatched change set lengths")}{let t=0,i=o.len;for(;i;)if(-1==a.ins){let e=Math.min(i,a.len);t+=e,i-=e,a.forward(e)}else{if(!(0==a.ins&&a.lent||o.ins>=0&&o.len>t)&&(e||n.length>i),r.forward2(t),o.forward(t)}}else k(n,0,o.ins,e),s&&T(s,n,o.text),o.next()}}class E{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return i>=t.length?e.empty:t[i]}textBit(t){let{inserted:i}=this.set,n=this.i-2>>1;return n>=i.length&&!t?e.empty:i[n].slice(this.off,null==t?void 0:this.off+t)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){-1==this.ins?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}}class A{constructor(e,t,i){this.from=e,this.to=t,this.flags=i}get anchor(){return 32&this.flags?this.to:this.from}get head(){return 32&this.flags?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return 8&this.flags?-1:16&this.flags?1:0}get bidiLevel(){let e=7&this.flags;return 7==e?null:e}get goalColumn(){let e=this.flags>>6;return 16777215==e?void 0:e}map(e,t=-1){let i,n;return this.empty?i=n=e.mapPos(this.from,t):(i=e.mapPos(this.from,1),n=e.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new A(i,n,this.flags)}extend(e,t=e){if(e<=this.anchor&&t>=this.anchor)return R.range(e,t);let i=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return R.range(this.anchor,i)}eq(e){return this.anchor==e.anchor&&this.head==e.head}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||"number"!=typeof e.anchor||"number"!=typeof e.head)throw new RangeError("Invalid JSON representation for SelectionRange");return R.range(e.anchor,e.head)}static create(e,t,i){return new A(e,t,i)}}class R{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:R.create(this.ranges.map((i=>i.map(e,t))),this.mainIndex)}eq(e){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let t=0;te.toJSON())),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||"number"!=typeof e.main||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new R(e.ranges.map((e=>A.fromJSON(e))),e.main)}static single(e,t=e){return new R([R.range(e,t)],0)}static create(e,t=0){if(0==e.length)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;ne?8:0)|s)}static normalized(e,t=0){let i=e[t];e.sort(((e,t)=>e.from-t.from)),t=e.indexOf(i);for(let i=1;in.head?R.range(o,r):R.range(r,o))}}return new R(e,t)}}function D(e,t){for(let i of e.ranges)if(i.to>t)throw new RangeError("Selection points outside of document")}let I=0;class q{constructor(e,t,i,n,s){this.combine=e,this.compareInput=t,this.compare=i,this.isStatic=n,this.id=I++,this.default=e([]),this.extensions="function"==typeof s?s(this):s}get reader(){return this}static define(e={}){return new q(e.combine||(e=>e),e.compareInput||((e,t)=>e===t),e.compare||(e.combine?(e,t)=>e===t:L),!!e.static,e.enables)}of(e){return new N([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new N(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new N(e,this,2,t)}from(e,t){return t||(t=e=>e),this.compute([e],(i=>t(i.field(e))))}}function L(e,t){return e==t||e.length==t.length&&e.every(((e,i)=>e===t[i]))}class N{constructor(e,t,i,n){this.dependencies=e,this.facet=t,this.type=i,this.value=n,this.id=I++}dynamicSlot(e){var t;let i=this.value,n=this.facet.compareInput,s=this.id,r=e[s]>>1,o=2==this.type,a=!1,l=!1,h=[];for(let i of this.dependencies)"doc"==i?a=!0:"selection"==i?l=!0:0==(1&(null!==(t=e[i.id])&&void 0!==t?t:1))&&h.push(e[i.id]);return{create:e=>(e.values[r]=i(e),1),update(e,t){if(a&&t.docChanged||l&&(t.docChanged||t.selection)||$(e,h)){let t=i(e);if(o?!B(t,e.values[r],n):!n(t,e.values[r]))return e.values[r]=t,1}return 0},reconfigure:(e,t)=>{let a,l=t.config.address[s];if(null!=l){let s=G(t,l);if(this.dependencies.every((i=>i instanceof q?t.facet(i)===e.facet(i):!(i instanceof j)||t.field(i,!1)==e.field(i,!1)))||(o?B(a=i(e),s,n):n(a=i(e),s)))return e.values[r]=s,0}else a=i(e);return e.values[r]=a,1}}}}function B(e,t,i){if(e.length!=t.length)return!1;for(let n=0;ne[t.id])),s=i.map((e=>e.type)),r=n.filter((e=>!(1&e))),o=e[t.id]>>1;function a(e){let i=[];for(let t=0;te===t),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(z).find((e=>e.field==this));return((null==t?void 0:t.create)||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:e=>(e.values[t]=this.create(e),1),update:(e,i)=>{let n=e.values[t],s=this.updateF(n,i);return this.compareF(n,s)?0:(e.values[t]=s,1)},reconfigure:(e,i)=>null!=i.config.address[this.id]?(e.values[t]=i.field(this),0):(e.values[t]=this.create(e),1)}}init(e){return[this,z.of({field:this,create:e})]}get extension(){return this}}function W(e){return t=>new U(t,e)}const V={highest:W(0),high:W(1),default:W(2),low:W(3),lowest:W(4)};class U{constructor(e,t){this.inner=e,this.prec=t}}class F{of(e){return new H(this,e)}reconfigure(e){return F.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}}class H{constructor(e,t){this.compartment=e,this.inner=t}}class X{constructor(e,t,i,n,s,r){for(this.base=e,this.compartments=t,this.dynamicSlots=i,this.address=n,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,i){let n=[],s=Object.create(null),r=new Map;for(let i of function(e,t,i){let n=[[],[],[],[],[]],s=new Map;return function e(r,o){let a=s.get(r);if(null!=a){if(a<=o)return;let e=n[a].indexOf(r);e>-1&&n[a].splice(e,1),r instanceof H&&i.delete(r.compartment)}if(s.set(r,o),Array.isArray(r))for(let t of r)e(t,o);else if(r instanceof H){if(i.has(r.compartment))throw new RangeError("Duplicate use of compartment in extensions");let n=t.get(r.compartment)||r.inner;i.set(r.compartment,n),e(n,o)}else if(r instanceof U)e(r.inner,r.prec);else if(r instanceof j)n[o].push(r),r.provides&&e(r.provides,o);else if(r instanceof N)n[o].push(r),r.facet.extensions&&e(r.facet.extensions,2);else{let t=r.extension;if(!t)throw new Error(`Unrecognized extension value in extension set (${r}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);e(t,o)}}(e,2),n.reduce(((e,t)=>e.concat(t)))}(e,t,r))i instanceof j?n.push(i):(s[i.facet.id]||(s[i.facet.id]=[])).push(i);let o=Object.create(null),a=[],l=[];for(let e of n)o[e.id]=l.length<<1,l.push((t=>e.slot(t)));let h=null==i?void 0:i.config.facets;for(let e in s){let t=s[e],n=t[0].facet,r=h&&h[e]||[];if(t.every((e=>0==e.type)))if(o[n.id]=a.length<<1|1,L(r,t))a.push(i.facet(n));else{let e=n.combine(t.map((e=>e.value)));a.push(i&&n.compare(e,i.facet(n))?i.facet(n):e)}else{for(let e of t)0==e.type?(o[e.id]=a.length<<1|1,a.push(e.value)):(o[e.id]=l.length<<1,l.push((t=>e.dynamicSlot(t))));o[n.id]=l.length<<1,l.push((e=>Q(e,n,t)))}}let c=l.map((e=>e(o)));return new X(e,r,c,o,a,s)}}function Y(e,t){if(1&t)return 2;let i=t>>1,n=e.status[i];if(4==n)throw new Error("Cyclic dependency between fields and/or facets");if(2&n)return n;e.status[i]=4;let s=e.computeSlot(e,e.config.dynamicSlots[i]);return e.status[i]=2|s}function G(e,t){return 1&t?e.config.staticValues[t>>1]:e.values[t>>1]}const Z=q.define(),K=q.define({combine:e=>e.some((e=>e)),static:!0}),J=q.define({combine:e=>e.length?e[0]:void 0,static:!0}),ee=q.define(),te=q.define(),ie=q.define(),ne=q.define({combine:e=>!!e.length&&e[0]});class se{constructor(e,t){this.type=e,this.value=t}static define(){return new re}}class re{of(e){return new se(this,e)}}class oe{constructor(e){this.map=e}of(e){return new ae(this,e)}}class ae{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return void 0===t?void 0:t==this.value?this:new ae(this.type,t)}is(e){return this.type==e}static define(e={}){return new oe(e.map||(e=>e))}static mapEffects(e,t){if(!e.length)return e;let i=[];for(let n of e){let e=n.map(t);e&&i.push(e)}return i}}ae.reconfigure=ae.define(),ae.appendConfig=ae.define();class le{constructor(e,t,i,n,s,r){this.startState=e,this.changes=t,this.selection=i,this.effects=n,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,i&&D(i,t.newLength),s.some((e=>e.type==le.time))||(this.annotations=s.concat(le.time.of(Date.now())))}static create(e,t,i,n,s,r){return new le(e,t,i,n,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(le.userEvent);return!(!t||!(t==e||t.length>e.length&&t.slice(0,e.length)==e&&"."==t[e.length]))}}function he(e,t){let i=[];for(let n=0,s=0;;){let r,o;if(n=e[n]))r=e[n++],o=e[n++];else{if(!(s=0;s--){let r=i[s](e);r&&Object.keys(r).length&&(n=ce(n,de(t,r,e.changes.newLength),!0))}return n==e?e:le.create(t,e.changes,e.selection,n.effects,n.annotations,n.scrollIntoView)}(i?function(e){let t=e.startState,i=!0;for(let n of t.facet(ee)){let t=n(e);if(!1===t){i=!1;break}Array.isArray(t)&&(i=!0===i?t:he(i,t))}if(!0!==i){let n,s;if(!1===i)s=e.changes.invertedDesc,n=S.empty(t.doc.length);else{let t=e.changes.filter(i);n=t.changes,s=t.filtered.mapDesc(t.changes).invertedDesc}e=le.create(t,n,e.selection&&e.selection.map(s),ae.mapEffects(e.effects,s),e.annotations,e.scrollIntoView)}let n=t.facet(te);for(let i=n.length-1;i>=0;i--){let s=n[i](e);e=s instanceof le?s:Array.isArray(s)&&1==s.length&&s[0]instanceof le?s[0]:ue(t,fe(s),!1)}return e}(s):s)}le.time=se.define(),le.userEvent=se.define(),le.addToHistory=se.define(),le.remote=se.define();const pe=[];function fe(e){return null==e?pe:Array.isArray(e)?e:[e]}var me=function(e){return e[e.Word=0]="Word",e[e.Space=1]="Space",e[e.Other=2]="Other",e}(me||(me={}));const ge=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let ve;try{ve=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(e){}class Oe{constructor(e,t,i,n,s,r){this.config=e,this.doc=t,this.selection=i,this.values=n,this.status=e.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let e=0;es.set(t,e))),i=null),s.set(t.value.compartment,t.value.extension)):t.is(ae.reconfigure)?(i=null,n=t.value):t.is(ae.appendConfig)&&(i=null,n=fe(n).concat(t.value));i?t=e.startState.values.slice():(i=X.resolve(n,s,this),t=new Oe(i,this.doc,this.selection,i.dynamicSlots.map((()=>null)),((e,t)=>t.reconfigure(e,this)),null).values),new Oe(i,e.newDoc,e.newSelection,t,((t,i)=>i.update(t,e)),e)}replaceSelection(e){return"string"==typeof e&&(e=this.toText(e)),this.changeByRange((t=>({changes:{from:t.from,to:t.to,insert:e},range:R.cursor(t.from+e.length)})))}changeByRange(e){let t=this.selection,i=e(t.ranges[0]),n=this.changes(i.changes),s=[i.range],r=fe(i.effects);for(let i=1;is.spec.fromJSON(r,e))))}return Oe.create({doc:e.doc,selection:R.fromJSON(e.selection),extensions:t.extensions?n.concat([t.extensions]):n})}static create(t={}){let i=X.resolve(t.extensions||[],new Map),n=t.doc instanceof e?t.doc:e.of((t.doc||"").split(i.staticFacet(Oe.lineSeparator)||y)),s=t.selection?t.selection instanceof R?t.selection:R.single(t.selection.anchor,t.selection.head):R.single(0);return D(s,n.length),i.staticFacet(K)||(s=s.asSingle()),new Oe(i,n,s,i.dynamicSlots.map((()=>null)),((e,t)=>t.create(e)),null)}get tabSize(){return this.facet(Oe.tabSize)}get lineBreak(){return this.facet(Oe.lineSeparator)||"\n"}get readOnly(){return this.facet(ne)}phrase(e,...t){for(let t of this.facet(Oe.phrases))if(Object.prototype.hasOwnProperty.call(t,e)){e=t[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,((e,i)=>{if("$"==i)return"$";let n=+(i||1);return!n||n>t.length?e:t[n-1]}))),e}languageDataAt(e,t,i=-1){let n=[];for(let s of this.facet(Z))for(let r of s(this,t,i))Object.prototype.hasOwnProperty.call(r,e)&&n.push(r[e]);return n}charCategorizer(e){return t=this.languageDataAt("wordChars",e).join(""),e=>{if(!/\S/.test(e))return me.Space;if(function(e){if(ve)return ve.test(e);for(let t=0;t"€"&&(i.toUpperCase()!=i.toLowerCase()||ge.test(i)))return!0}return!1}(e))return me.Word;for(let i=0;i-1)return me.Word;return me.Other};var t}wordAt(e){let{text:t,from:i,length:n}=this.doc.lineAt(e),s=this.charCategorizer(e),r=e-i,o=e-i;for(;r>0;){let e=p(t,r,!1);if(s(t.slice(e,r))!=me.Word)break;r=e}for(;oe.length?e[0]:4}),Oe.lineSeparator=J,Oe.readOnly=ne,Oe.phrases=q.define({compare(e,t){let i=Object.keys(e),n=Object.keys(t);return i.length==n.length&&i.every((i=>e[i]==t[i]))}}),Oe.languageData=Z,Oe.changeFilter=ee,Oe.transactionFilter=te,Oe.transactionExtender=ie,F.reconfigure=ae.define();class _e{eq(e){return this==e}range(e,t=e){return ye.create(e,t,this)}}_e.prototype.startSide=_e.prototype.endSide=0,_e.prototype.point=!1,_e.prototype.mapMode=w.TrackDel;class ye{constructor(e,t,i){this.from=e,this.to=t,this.value=i}static create(e,t,i){return new ye(e,t,i)}}function we(e,t){return e.from-t.from||e.value.startSide-t.value.startSide}class xe{constructor(e,t,i,n){this.from=e,this.to=t,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(e,t,i,n=0){let s=i?this.to:this.from;for(let r=n,o=s.length;;){if(r==o)return r;let n=r+o>>1,a=s[n]-e||(i?this.value[n].endSide:this.value[n].startSide)-t;if(n==r)return a>=0?r:o;a>=0?o=n:r=n+1}}between(e,t,i,n){for(let s=this.findIndex(t,-1e9,!0),r=this.findIndex(i,1e9,!1,s);sh||l==h&&c.startSide>0&&c.endSide<=0)continue;(h-l||c.endSide-c.startSide)<0||(r<0&&(r=l),c.point&&(o=Math.max(o,h-l)),i.push(c),n.push(l-r),s.push(h-r))}return{mapped:i.length?new xe(n,s,i,o):null,pos:r}}}class Se{constructor(e,t,i,n){this.chunkPos=e,this.chunk=t,this.nextLayer=i,this.maxPoint=n}static create(e,t,i,n){return new Se(e,t,i,n)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:i=!1,filterFrom:n=0,filterTo:s=this.length}=e,r=e.filter;if(0==t.length&&!r)return this;if(i&&(t=t.slice().sort(we)),this.isEmpty)return t.length?Se.of(t):this;let o=new Ce(this,null,-1).goto(0),a=0,l=[],h=new ke;for(;o.value||a=0){let e=t[a++];h.addInner(e.from,e.to,e.value)||l.push(e)}else 1==o.rangeIndex&&o.chunkIndexthis.chunkEnd(o.chunkIndex)||so.to||s=s&&e<=s+r.length&&!1===r.between(s,e-s,t-s,i))return}this.nextLayer.between(e,t,i)}}iter(e=0){return Pe.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return Pe.from(e).goto(t)}static compare(e,t,i,n,s=-1){let r=e.filter((e=>e.maxPoint>0||!e.isEmpty&&e.maxPoint>=s)),o=t.filter((e=>e.maxPoint>0||!e.isEmpty&&e.maxPoint>=s)),a=Te(r,o,i),l=new Ee(r,a,s),h=new Ee(o,a,s);i.iterGaps(((e,t,i)=>Ae(l,e,h,t,i,n))),i.empty&&0==i.length&&Ae(l,0,h,0,0,n)}static eq(e,t,i=0,n){null==n&&(n=999999999);let s=e.filter((e=>!e.isEmpty&&t.indexOf(e)<0)),r=t.filter((t=>!t.isEmpty&&e.indexOf(t)<0));if(s.length!=r.length)return!1;if(!s.length)return!0;let o=Te(s,r),a=new Ee(s,o,0).goto(i),l=new Ee(r,o,0).goto(i);for(;;){if(a.to!=l.to||!Re(a.active,l.active)||a.point&&(!l.point||!a.point.eq(l.point)))return!1;if(a.to>n)return!0;a.next(),l.next()}}static spans(e,t,i,n,s=-1){let r=new Ee(e,null,s).goto(t),o=t,a=r.openStart;for(;;){let e=Math.min(r.to,i);if(r.point){let i=r.activeForPoint(r.to),s=r.pointFromo&&(n.span(o,e,r.active,a),a=r.openEnd(e));if(r.to>i)return a+(r.point&&r.to>i?1:0);o=r.to,r.next()}}static of(e,t=!1){let i=new ke;for(let n of e instanceof ye?[e]:t?function(e){if(e.length>1)for(let t=e[0],i=1;i0)return e.slice().sort(we);t=n}return e}(e):e)i.add(n.from,n.to,n.value);return i.finish()}}Se.empty=new Se([],[],null,-1),Se.empty.nextLayer=Se.empty;class ke{finishChunk(e){this.chunks.push(new xe(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,i){this.addInner(e,t,i)||(this.nextLayer||(this.nextLayer=new ke)).add(e,t,i)}addInner(e,t,i){let n=e-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return!(n<0||(250==this.from.length&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=t,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),0))}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let i=t.value.length-1;return this.last=t.value[i],this.lastFrom=t.from[i]+e,this.lastTo=t.to[i]+e,!0}finish(){return this.finishInner(Se.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),0==this.chunks.length)return e;let t=Se.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}}function Te(e,t,i){let n=new Map;for(let t of e)for(let e=0;e=this.minPoint)break}}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new Ce(r,t,i,s));return 1==n.length?n[0]:new Pe(n)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let i of this.heap)i.goto(e,t);for(let e=this.heap.length>>1;e>=0;e--)Me(this.heap,e);return this.next(),this}forward(e,t){for(let i of this.heap)i.forward(e,t);for(let e=this.heap.length>>1;e>=0;e--)Me(this.heap,e);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(0==this.heap.length)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),Me(this.heap,0)}}}function Me(e,t){for(let i=e[t];;){let n=1+(t<<1);if(n>=e.length)break;let s=e[n];if(n+1=0&&(s=e[n+1],n++),i.compare(s)<0)break;e[n]=i,e[t]=s,t=n}}class Ee{constructor(e,t,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Pe.from(e,t,i)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){De(this.active,e),De(this.activeTo,e),De(this.activeRank,e),this.minActive=qe(this.active,this.activeTo)}addActive(e){let t=0,{value:i,to:n,rank:s}=this.cursor;for(;t-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>e){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&De(i,n)}else{if(!this.cursor.value){this.to=this.endSide=1e9;break}if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}{let e=this.cursor.value;if(e.point){if(!(t&&this.cursor.to==this.to&&this.cursor.from=0&&i[t]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&t.push(this.active[i]);return t.reverse()}openEnd(e){let t=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)t++;return t}}function Ae(e,t,i,n,s,r){e.goto(t),i.goto(n);let o=n+s,a=n,l=n-t;for(;;){let t=e.to+l-i.to||e.endSide-i.endSide,n=t<0?e.to+l:i.to,s=Math.min(n,o);if(e.point||i.point?e.point&&i.point&&(e.point==i.point||e.point.eq(i.point))&&Re(e.activeForPoint(e.to),i.activeForPoint(i.to))||r.comparePoint(a,s,e.point,i.point):s>a&&!Re(e.active,i.active)&&r.compareRange(a,s,e.active,i.active),n>o)break;a=n,t<=0&&e.next(),t>=0&&i.next()}}function Re(e,t){if(e.length!=t.length)return!1;for(let i=0;i=t;i--)e[i+1]=e[i];e[t]=i}function qe(e,t){let i=-1,n=1e9;for(let s=0;s=t)return n;if(n==e.length)break;s+=9==e.charCodeAt(n)?i-s%i:1,n=p(e,n)}return!0===n?-1:e.length}const Be="undefined"==typeof Symbol?"__ͼ":Symbol.for("ͼ"),$e="undefined"==typeof Symbol?"__styleSet"+Math.floor(1e8*Math.random()):Symbol("styleSet"),Qe="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};class ze{constructor(e,t){this.rules=[];let{finish:i}=t||{};function n(e){return/^@/.test(e)?[e]:e.split(/,\s*/)}function s(e,t,r,o){let a=[],l=/^@(\w+)\b/.exec(e[0]),h=l&&"keyframes"==l[1];if(l&&null==t)return r.push(e[0]+";");for(let i in t){let o=t[i];if(/&/.test(i))s(i.split(/,\s*/).map((t=>e.map((e=>t.replace(/&/,e))))).reduce(((e,t)=>e.concat(t))),o,r);else if(o&&"object"==typeof o){if(!l)throw new RangeError("The value of a property ("+i+") should be a primitive value.");s(n(i),o,a,h)}else null!=o&&a.push(i.replace(/_.*/,"").replace(/[A-Z]/g,(e=>"-"+e.toLowerCase()))+": "+o+";")}(a.length||h)&&r.push((!i||l||o?e:e.map(i)).join(", ")+" {"+a.join(" ")+"}")}for(let t in e)s(n(t),e[t],this.rules)}getRules(){return this.rules.join("\n")}static newName(){let e=Qe[Be]||1;return Qe[Be]=e+1,"ͼ"+e.toString(36)}static mount(e,t,i){let n=e[$e],s=i&&i.nonce;n?s&&n.setNonce(s):n=new We(e,s),n.mount(Array.isArray(t)?t:[t])}}let je=new Map;class We{constructor(e,t){let i=e.ownerDocument||e,n=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&n.CSSStyleSheet){let t=je.get(i);if(t)return e.adoptedStyleSheets=[t.sheet,...e.adoptedStyleSheets],e[$e]=t;this.sheet=new n.CSSStyleSheet,e.adoptedStyleSheets=[this.sheet,...e.adoptedStyleSheets],je.set(i,this)}else{this.styleTag=i.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);let n=e.head||e;n.insertBefore(this.styleTag,n.firstChild)}this.modules=[],e[$e]=this}mount(e){let t=this.sheet,i=0,n=0;for(let s=0;s-1&&(this.modules.splice(o,1),n--,o=-1),-1==o){if(this.modules.splice(n++,0,r),t)for(let e=0;e",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Fe="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),He="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),Xe=0;Xe<10;Xe++)Ve[48+Xe]=Ve[96+Xe]=String(Xe);for(Xe=1;Xe<=24;Xe++)Ve[Xe+111]="F"+Xe;for(Xe=65;Xe<=90;Xe++)Ve[Xe]=String.fromCharCode(Xe+32),Ue[Xe]=String.fromCharCode(Xe);for(var Ye in Ve)Ue.hasOwnProperty(Ye)||(Ue[Ye]=Ve[Ye]);function Ge(e){let t;return t=11==e.nodeType?e.getSelection?e:e.ownerDocument:e,t.getSelection()}function Ze(e,t){return!!t&&(e==t||e.contains(1!=t.nodeType?t.parentNode:t))}function Ke(e,t){if(!t.anchorNode)return!1;try{return Ze(e,t.anchorNode)}catch(e){return!1}}function Je(e){return 3==e.nodeType?ct(e,0,e.nodeValue.length).getClientRects():1==e.nodeType?e.getClientRects():[]}function et(e,t,i,n){return!!i&&(it(e,t,i,n,-1)||it(e,t,i,n,1))}function tt(e){for(var t=0;;t++)if(!(e=e.previousSibling))return t}function it(e,t,i,n,s){for(;;){if(e==i&&t==n)return!0;if(t==(s<0?0:nt(e))){if("DIV"==e.nodeName)return!1;let i=e.parentNode;if(!i||1!=i.nodeType)return!1;t=tt(e)+(s<0?0:1),e=i}else{if(1!=e.nodeType)return!1;if(1==(e=e.childNodes[t+(s<0?-1:0)]).nodeType&&"false"==e.contentEditable)return!1;t=s<0?nt(e):0}}}function nt(e){return 3==e.nodeType?e.nodeValue.length:e.childNodes.length}function st(e,t){let i=t?e.left:e.right;return{left:i,right:i,top:e.top,bottom:e.bottom}}function rt(e){return{left:0,right:e.innerWidth,top:0,bottom:e.innerHeight}}class ot{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:t,focusNode:i}=e;this.set(t,Math.min(e.anchorOffset,t?nt(t):0),i,Math.min(e.focusOffset,i?nt(i):0))}set(e,t,i,n){this.anchorNode=e,this.anchorOffset=t,this.focusNode=i,this.focusOffset=n}}let at,lt=null;function ht(e){if(e.setActive)return e.setActive();if(lt)return e.focus(lt);let t=[];for(let i=e;i&&(t.push(i,i.scrollTop,i.scrollLeft),i!=i.ownerDocument);i=i.parentNode);if(e.focus(null==lt?{get preventScroll(){return lt={preventScroll:!0},!0}}:void 0),!lt){lt=!1;for(let e=0;eMath.max(1,e.scrollHeight-e.clientHeight-4)}class ft{constructor(e,t,i=!0){this.node=e,this.offset=t,this.precise=i}static before(e,t){return new ft(e.parentNode,tt(e),t)}static after(e,t){return new ft(e.parentNode,tt(e)+1,t)}}const mt=[];class gt{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e){let t=this.posAtStart;for(let i of this.children){if(i==e)return t;t+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}sync(e,t){if(2&this.flags){let i,n=this.dom,s=null;for(let r of this.children){if(7&r.flags){if(!r.dom&&(i=s?s.nextSibling:n.firstChild)){let e=gt.get(i);(!e||!e.parent&&e.canReuseDOM(r))&&r.reuseDOM(i)}r.sync(e,t),r.flags&=-8}if(i=s?s.nextSibling:n.firstChild,t&&!t.written&&t.node==n&&i!=r.dom&&(t.written=!0),r.dom.parentNode==n)for(;i&&i!=r.dom;)i=vt(i);else n.insertBefore(r.dom,i);s=r.dom}for(i=s?s.nextSibling:n.firstChild,i&&t&&t.node==n&&(t.written=!0);i;)i=vt(i)}else if(1&this.flags)for(let i of this.children)7&i.flags&&(i.sync(e,t),i.flags&=-8)}reuseDOM(e){}localPosFromDOM(e,t){let i;if(e==this.dom)i=this.dom.childNodes[t];else{let n=0==nt(e)?0:0==t?-1:1;for(;;){let t=e.parentNode;if(t==this.dom)break;0==n&&t.firstChild!=t.lastChild&&(n=e==t.firstChild?-1:1),e=t}i=n<0?e:e.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!gt.get(i);)i=i.nextSibling;if(!i)return this.length;for(let e=0,t=0;;e++){let n=this.children[e];if(n.dom==i)return t;t+=n.length+n.breakAfter}}domBoundsAround(e,t,i=0){let n=-1,s=-1,r=-1,o=-1;for(let a=0,l=i,h=i;at)return i.domBoundsAround(e,t,l);if(c>=e&&-1==n&&(n=a,s=l),l>t&&i.dom.parentNode==this.dom){r=a,o=h;break}h=c,l=c+i.breakAfter}return{from:s,to:o<0?i+this.length:o,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:r=0?this.children[r].dom:null}}markDirty(e=!1){this.flags|=2,this.markParentsDirty(e)}markParentsDirty(e){for(let t=this.parent;t;t=t.parent){if(e&&(t.flags|=2),1&t.flags)return;t.flags|=1,e=!1}}setParent(e){this.parent!=e&&(this.parent=e,7&this.flags&&this.markParentsDirty(!0))}setDOM(e){this.dom!=e&&(this.dom&&(this.dom.cmView=null),this.dom=e,e.cmView=this)}get rootView(){for(let e=this;;){let t=e.parent;if(!t)return e;e=t}}replaceChildren(e,t,i=mt){this.markDirty();for(let i=e;ithis.pos||e==this.pos&&(t>0||0==this.i||this.children[this.i-1].breakAfter))return this.off=e-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}}function bt(e,t,i,n,s,r,o,a,l){let{children:h}=e,c=h.length?h[t]:null,d=r.length?r[r.length-1]:null,u=d?d.breakAfter:o;if(!(t==n&&c&&!o&&!u&&r.length<2&&c.merge(i,s,r.length?d:null,0==i,a,l))){if(n0&&(!o&&r.length&&c.merge(i,c.length,r[0],!1,a,0)?c.breakAfter=r.shift().breakAfter:(i2);var Rt={mac:At||/Mac/.test(yt.platform),windows:/Win/.test(yt.platform),linux:/Linux|X11/.test(yt.platform),ie:Tt,ie_version:St?wt.documentMode||6:kt?+kt[1]:xt?+xt[1]:0,gecko:Ct,gecko_version:Ct?+(/Firefox\/(\d+)/.exec(yt.userAgent)||[0,0])[1]:0,chrome:!!Pt,chrome_version:Pt?+Pt[1]:0,ios:At,android:/Android\b/.test(yt.userAgent),webkit:Mt,safari:Et,webkit_version:Mt?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0,tabSize:null!=wt.documentElement.style.tabSize?"tab-size":"-moz-tab-size"};class Dt extends gt{constructor(e){super(),this.text=e}get length(){return this.text.length}createDOM(e){this.setDOM(e||document.createTextNode(this.text))}sync(e,t){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(t&&t.node==this.dom&&(t.written=!0),this.dom.nodeValue=this.text)}reuseDOM(e){3==e.nodeType&&this.createDOM(e)}merge(e,t,i){return!(8&this.flags||i&&(!(i instanceof Dt)||this.length-(t-e)+i.length>256||8&i.flags)||(this.text=this.text.slice(0,e)+(i?i.text:"")+this.text.slice(t),this.markDirty(),0))}split(e){let t=new Dt(this.text.slice(e));return this.text=this.text.slice(0,e),this.markDirty(),t.flags|=8&this.flags,t}localPosFromDOM(e,t){return e==this.dom?t:t?this.text.length:0}domAtPos(e){return new ft(this.dom,e)}domBoundsAround(e,t,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(e,t){return function(e,t,i){let n=e.nodeValue.length;t>n&&(t=n);let s=t,r=t,o=0;0==t&&i<0||t==n&&i>=0?Rt.chrome||Rt.gecko||(t?(s--,o=1):r=0)?0:a.length-1];return Rt.safari&&!o&&0==l.width&&(l=Array.prototype.find.call(a,(e=>e.width))||l),o?st(l,o<0):l||null}(this.dom,e,t)}}class It extends gt{constructor(e,t=[],i=0){super(),this.mark=e,this.children=t,this.length=i;for(let e of t)e.setParent(this)}setAttrs(e){if(ut(e),this.mark.class&&(e.className=this.mark.class),this.mark.attrs)for(let t in this.mark.attrs)e.setAttribute(t,this.mark.attrs[t]);return e}canReuseDOM(e){return super.canReuseDOM(e)&&!(8&(this.flags|e.flags))}reuseDOM(e){e.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(e),this.flags|=6)}sync(e,t){this.dom?4&this.flags&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(e,t)}merge(e,t,i,n,s,r){return!(i&&(!(i instanceof It&&i.mark.eq(this.mark))||e&&s<=0||te&&t.push(i=e&&(n=s),i=o,s++}let r=this.length-e;return this.length=e,n>-1&&(this.children.length=n,this.markDirty()),new It(this.mark,t,r)}domAtPos(e){return Nt(this,e)}coordsAt(e,t){return $t(this,e,t)}}class qt extends gt{static create(e,t,i){return new qt(e,t,i)}constructor(e,t,i){super(),this.widget=e,this.length=t,this.side=i,this.prevWidget=null}split(e){let t=qt.create(this.widget,this.length-e,this.side);return this.length-=e,t}sync(e){this.dom&&this.widget.updateDOM(this.dom,e)||(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(e)),this.dom.contentEditable="false")}getSide(){return this.side}merge(e,t,i,n,s,r){return!(i&&(!(i instanceof qt&&this.widget.compare(i.widget))||e>0&&s<=0||t0)?ft.before(this.dom):ft.after(this.dom,e==this.length)}domBoundsAround(){return null}coordsAt(e,t){let i=this.widget.coordsAt(this.dom,e,t);if(i)return i;let n=this.dom.getClientRects(),s=null;if(!n.length)return null;let r=this.side?this.side<0:e>0;for(let t=r?n.length-1:0;s=n[t],!(e>0?0==t:t==n.length-1||s.top0?ft.before(this.dom):ft.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(e){return this.dom.getBoundingClientRect()}get overrideDOMText(){return e.empty}get isHidden(){return!0}}function Nt(e,t){let i=e.dom,{children:n}=e,s=0;for(let e=0;se&&t0;e--){let t=n[e-1];if(t.dom.parentNode==i)return t.domAtPos(t.length)}for(let e=s;e0&&t instanceof It&&s.length&&(n=s[s.length-1])instanceof It&&n.mark.eq(t.mark)?Bt(n,t.children[0],i-1):(s.push(t),t.setParent(e)),e.length+=t.length}function $t(e,t,i){let n=null,s=-1,r=null,o=-1;!function e(t,a){for(let l=0,h=0;l=a&&(c.children.length?e(c,a-h):(!r||r.isHidden&&i>0)&&(d>a||h==d&&c.getSide()>0)?(r=c,o=a-h):(h-1?1:0)!=s.length-(i&&s.indexOf(i)>-1?1:0))return!1;for(let r of n)if(r!=i&&(-1==s.indexOf(r)||e[r]!==t[r]))return!1;return!0}function Wt(e,t,i){let n=!1;if(t)for(let s in t)i&&s in i||(n=!0,"style"==s?e.style.cssText="":e.removeAttribute(s));if(i)for(let s in i)t&&t[s]==i[s]||(n=!0,"style"==s?e.style.cssText=i[s]:e.setAttribute(s,i[s]));return n}function Vt(e){let t=Object.create(null);for(let i=0;i0&&0==this.children[i-1].length;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=e,t}transferDOM(e){this.dom&&(this.markDirty(),e.setDOM(this.dom),e.prevAttrs=void 0===this.prevAttrs?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(e){jt(this.attrs,e)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=e)}append(e,t){Bt(this,e,t)}addLineDeco(e){let t=e.spec.attributes,i=e.spec.class;t&&(this.attrs=Qt(t,this.attrs||{})),i&&(this.attrs=Qt({class:i},this.attrs||{}))}domAtPos(e){return Nt(this,e)}reuseDOM(e){"DIV"==e.nodeName&&(this.setDOM(e),this.flags|=6)}sync(e,t){var i;this.dom?4&this.flags&&(ut(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),void 0!==this.prevAttrs&&(Wt(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(e,t);let n=this.dom.lastChild;for(;n&>.get(n)instanceof It;)n=n.lastChild;if(!(n&&this.length&&("BR"==n.nodeName||0!=(null===(i=gt.get(n))||void 0===i?void 0:i.isEditable)||Rt.ios&&this.children.some((e=>e instanceof Dt))))){let e=document.createElement("BR");e.cmIgnore=!0,this.dom.appendChild(e)}}measureTextSize(){if(0==this.children.length||this.length>20)return null;let e,t=0;for(let i of this.children){if(!(i instanceof Dt)||/[^ -~]/.test(i.text))return null;let n=Je(i.dom);if(1!=n.length)return null;t+=n[0].width,e=n[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(e,t){let i=$t(this,e,t);if(!this.children.length&&i&&this.parent){let{heightOracle:e}=this.parent.view.viewState,t=i.bottom-i.top;if(Math.abs(t-e.lineHeight)<2&&e.textHeight=t){if(s instanceof Ut)return s;if(r>t)break}n=r+s.breakAfter}return null}}class Ft extends gt{constructor(e,t,i){super(),this.widget=e,this.length=t,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(e,t,i,n,s,r){return!(i&&(!(i instanceof Ft&&this.widget.compare(i.widget))||e>0&&s<=0||t0)}}class Ht{eq(e){return!1}updateDOM(e,t){return!1}compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(e){return!0}coordsAt(e,t,i){return null}get isHidden(){return!1}destroy(e){}}var Xt=function(e){return e[e.Text=0]="Text",e[e.WidgetBefore=1]="WidgetBefore",e[e.WidgetAfter=2]="WidgetAfter",e[e.WidgetRange=3]="WidgetRange",e}(Xt||(Xt={}));class Yt extends _e{constructor(e,t,i,n){super(),this.startSide=e,this.endSide=t,this.widget=i,this.spec=n}get heightRelevant(){return!1}static mark(e){return new Gt(e)}static widget(e){let t=Math.max(-1e4,Math.min(1e4,e.side||0)),i=!!e.block;return t+=i&&!e.inlineOrder?t>0?3e8:-4e8:t>0?1e8:-1e8,new Kt(e,t,t,i,e.widget||null,!1)}static replace(e){let t,i,n=!!e.block;if(e.isBlockGap)t=-5e8,i=4e8;else{let{start:s,end:r}=Jt(e,n);t=(s?n?-3e8:-1:5e8)-1,i=1+(r?n?2e8:1:-6e8)}return new Kt(e,t,i,n,e.widget||null,!0)}static line(e){return new Zt(e)}static set(e,t=!1){return Se.of(e,t)}hasHeight(){return!!this.widget&&this.widget.estimatedHeight>-1}}Yt.none=Se.empty;class Gt extends Yt{constructor(e){let{start:t,end:i}=Jt(e);super(t?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.class=e.class||"",this.attrs=e.attributes||null}eq(e){var t,i;return this==e||e instanceof Gt&&this.tagName==e.tagName&&(this.class||(null===(t=this.attrs)||void 0===t?void 0:t.class))==(e.class||(null===(i=e.attrs)||void 0===i?void 0:i.class))&&jt(this.attrs,e.attrs,"class")}range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be empty");return super.range(e,t)}}Gt.prototype.point=!1;class Zt extends Yt{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof Zt&&this.spec.class==e.spec.class&&jt(this.spec.attributes,e.spec.attributes)}range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,t)}}Zt.prototype.mapMode=w.TrackBefore,Zt.prototype.point=!0;class Kt extends Yt{constructor(e,t,i,n,s,r){super(t,i,s,e),this.block=n,this.isReplace=r,this.mapMode=n?t<=0?w.TrackBefore:w.TrackAfter:w.TrackDel}get type(){return this.startSide!=this.endSide?Xt.WidgetRange:this.startSide<=0?Xt.WidgetBefore:Xt.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof Kt&&((t=this.widget)==(i=e.widget)||!!(t&&i&&t.compare(i)))&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide;var t,i}range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&t!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,t)}}function Jt(e,t=!1){let{inclusiveStart:i,inclusiveEnd:n}=e;return null==i&&(i=e.inclusive),null==n&&(n=e.inclusive),{start:null!=i?i:t,end:null!=n?n:t}}function ei(e,t,i,n=0){let s=i.length-1;s>=0&&i[s]+n>=e?i[s]=Math.max(i[s],t):i.push(e,t)}Kt.prototype.point=!0;class ti{constructor(e,t,i,n){this.doc=e,this.pos=t,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=e.iter(),this.skip=t}posCovered(){if(0==this.content.length)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let e=this.content[this.content.length-1];return!(e.breakAfter||e instanceof Ft&&e.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Ut),this.atCursorPos=!0),this.curLine}flushBuffer(e=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(ii(new Lt(-1),e),e.length),this.pendingBuffer=0)}addBlockWidget(e){this.flushBuffer(),this.curLine=null,this.content.push(e)}finish(e){this.pendingBuffer&&e<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,this.posCovered()||e&&this.content.length&&this.content[this.content.length-1]instanceof Ft||this.getLine()}buildText(e,t,i){for(;e>0;){if(this.textOff==this.text.length){let{value:t,lineBreak:i,done:n}=this.cursor.next(this.skip);if(this.skip=0,n)throw new Error("Ran out of text content when drawing inline views");if(i){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,e--;continue}this.text=t,this.textOff=0}let n=Math.min(this.text.length-this.textOff,e,512);this.flushBuffer(t.slice(t.length-i)),this.getLine().append(ii(new Dt(this.text.slice(this.textOff,this.textOff+n)),t),i),this.atCursorPos=!0,this.textOff+=n,e-=n,i=0}}span(e,t,i,n){this.buildText(t-e,i,n),this.pos=t,this.openStart<0&&(this.openStart=n)}point(e,t,i,n,s,r){if(this.disallowBlockEffectsFor[r]&&i instanceof Kt){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(t>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let o=t-e;if(i instanceof Kt)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new Ft(i.widget||new ni("div"),o,i));else{let r=qt.create(i.widget||new ni("span"),o,o?0:i.startSide),a=this.atCursorPos&&!r.isEditable&&s<=n.length&&(e0),l=!r.isEditable&&(en.length||i.startSide<=0),h=this.getLine();2!=this.pendingBuffer||a||r.isEditable||(this.pendingBuffer=0),this.flushBuffer(n),a&&(h.append(ii(new Lt(1),n),s),s=n.length+Math.max(0,s-n.length)),h.append(ii(r,n),s),this.atCursorPos=l,this.pendingBuffer=l?en.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);o&&(this.textOff+o<=this.text.length?this.textOff+=o:(this.skip+=o-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=t),this.openStart<0&&(this.openStart=s)}static build(e,t,i,n,s){let r=new ti(e,t,i,s);return r.openEnd=Se.spans(n,t,i,r),r.openStart<0&&(r.openStart=r.openEnd),r.finish(r.openEnd),r}}function ii(e,t){for(let i of t)e=new It(i,[e],e.length);return e}class ni extends Ht{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}const si=q.define(),ri=q.define(),oi=q.define(),ai=q.define(),li=q.define(),hi=q.define(),ci=q.define(),di=q.define({combine:e=>e.some((e=>e))}),ui=q.define({combine:e=>e.some((e=>e))});class pi{constructor(e,t="nearest",i="nearest",n=5,s=5){this.range=e,this.y=t,this.x=i,this.yMargin=n,this.xMargin=s}map(e){return e.empty?this:new pi(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin)}}const fi=ae.define({map:(e,t)=>e.map(t)});function mi(e,t,i){let n=e.facet(ai);n.length?n[0](t):window.onerror?window.onerror(String(t),i,void 0,void 0,t):i?console.error(i+":",t):console.error(t)}const gi=q.define({combine:e=>!e.length||e[0]});let vi=0;const Oi=q.define();class bi{constructor(e,t,i,n,s){this.id=e,this.create=t,this.domEventHandlers=i,this.domEventObservers=n,this.extension=s(this)}static define(e,t){const{eventHandlers:i,eventObservers:n,provide:s,decorations:r}=t||{};return new bi(vi++,e,i,n,(e=>{let t=[Oi.of(e)];return r&&t.push(xi.of((t=>{let i=t.plugin(e);return i?r(i):Yt.none}))),s&&t.push(s(e)),t}))}static fromClass(e,t){return bi.define((t=>new e(t)),t)}}class _i{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}update(e){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(t){if(mi(e.state,t,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(e){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(e)}catch(t){mi(e.state,t,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var t;if(null===(t=this.value)||void 0===t?void 0:t.destroy)try{this.value.destroy()}catch(t){mi(e.state,t,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const yi=q.define(),wi=q.define(),xi=q.define(),Si=q.define(),ki=q.define();function Ti(e,t,i){let n=e.state.facet(ki);if(!n.length)return n;let s=n.map((t=>t instanceof Function?t(e):t)),r=[];return Se.spans(s,t,i,{point(){},span(e,t,i,n){let s=r;for(let r=i.length-1;r>=0;r--,n--){let o,a=i[r].spec.bidiIsolate;if(null!=a)if(n>0&&s.length&&(o=s[s.length-1]).to==e&&o.direction==a)o.to=t,s=o.inner;else{let i={from:e,to:t,direction:a,inner:[]};s.push(i),s=i.inner}}}}),r}const Ci=q.define();function Pi(e){let t=0,i=0,n=0,s=0;for(let r of e.state.facet(Ci)){let o=r(e);o&&(null!=o.left&&(t=Math.max(t,o.left)),null!=o.right&&(i=Math.max(i,o.right)),null!=o.top&&(n=Math.max(n,o.top)),null!=o.bottom&&(s=Math.max(s,o.bottom)))}return{left:t,right:i,top:n,bottom:s}}const Mi=q.define();class Ei{constructor(e,t,i,n){this.fromA=e,this.toA=t,this.fromB=i,this.toB=n}join(e){return new Ei(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let t=e.length,i=this;for(;t>0;t--){let n=e[t-1];if(!(n.fromA>i.toA)){if(n.toAh)break;s+=2}if(!a)return i;new Ei(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),r=a.toA,o=a.toB}}}class Ai{constructor(e,t,i){this.view=e,this.state=t,this.transactions=i,this.flags=0,this.startState=e.state,this.changes=S.empty(this.startState.doc.length);for(let e of i)this.changes=this.changes.compose(e.changes);let n=[];this.changes.iterChangedRanges(((e,t,i,s)=>n.push(new Ei(e,t,i,s)))),this.changedRanges=n}static create(e,t,i){return new Ai(e,t,i)}get viewportChanged(){return(4&this.flags)>0}get heightChanged(){return(2&this.flags)>0}get geometryChanged(){return this.docChanged||(10&this.flags)>0}get focusChanged(){return(1&this.flags)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some((e=>e.selection))}get empty(){return 0==this.flags&&0==this.transactions.length}}var Ri=function(e){return e[e.LTR=0]="LTR",e[e.RTL=1]="RTL",e}(Ri||(Ri={}));const Di=Ri.LTR,Ii=Ri.RTL;function qi(e){let t=[];for(let i=0;i=t){if(o.level==i)return r;(s<0||(0!=n?n<0?o.fromt:e[s].level>o.level))&&(s=r)}}if(s<0)throw new RangeError("Index out of range");return s}}function ji(e,t){if(e.length!=t.length)return!1;for(let i=0;il&&o.push(new zi(l,f.from,u)),Ui(e,f.direction==Di!=!(u%2)?n+1:n,s,f.inner,f.from,f.to,o),l=f.to),p=f.to}else{if(p==i||(t?Wi[p]!=a:Wi[p]==a))break;p++}d?Vi(e,l,p,n+1,s,d,o):lt;){let i=!0,c=!1;if(!h||l>r[h-1].to){let e=Wi[l-1];e!=a&&(i=!1,c=16==e)}let d=i||1!=a?null:[],u=i?n:n+1,p=l;e:for(;;)if(h&&p==r[h-1].to){if(c)break e;let f=r[--h];if(!i)for(let e=f.from,i=h;;){if(e==t)break e;if(!i||r[i-1].to!=e){if(Wi[e-1]==a)break e;break}e=r[--i].from}d?d.push(f):(f.to=0;e-=3)if($i[e+1]==-i){let t=$i[e+2],i=2&t?s:4&t?1&t?r:s:0;i&&(Wi[o]=Wi[$i[e]]=i),a=e;break}}else{if(189==$i.length)break;$i[a++]=o,$i[a++]=t,$i[a++]=l}else if(2==(n=Wi[o])||1==n){let e=n==s;l=e?0:1;for(let t=a-3;t>=0;t-=3){let i=$i[t+2];if(2&i)break;if(e)$i[t+2]|=2;else{if(4&i)break;$i[t+2]|=4}}}}}(e,s,r,n,a),function(e,t,i,n){for(let s=0,r=n;s<=i.length;s++){let o=s?i[s-1].to:e,a=sl;)t==r&&(t=i[--n].from,r=n?i[n-1].to:e),Wi[--t]=c;l=o}else r=o,l++}}}(s,r,n,a),Vi(e,s,r,t,i,n,o)}function Fi(e){return[new zi(0,e,0)]}let Hi="";function Xi(e,t,i,n,s){var r;let o=n.head-e.from,a=-1;if(0==o){if(!s||!e.length)return null;t[0].level!=i&&(o=t[0].side(!1,i),a=0)}else if(o==e.length){if(s)return null;let e=t[t.length-1];e.level!=i&&(o=e.side(!0,i),a=t.length-1)}a<0&&(a=zi.find(t,o,null!==(r=n.bidiLevel)&&void 0!==r?r:-1,n.assoc));let l=t[a];o==l.side(s,i)&&(l=t[a+=s?1:-1],o=l.side(!s,i));let h=s==(l.dir==i),c=p(e.text,o,h);if(Hi=e.text.slice(Math.min(o,c),Math.max(o,c)),c!=l.side(s,i))return R.cursor(c+e.from,h?-1:1,l.level);let d=a==(s?t.length-1:0)?null:t[a+(s?1:-1)];return d||l.level==i?d&&d.level0&&i.length&&(i.every((({fromA:e,toA:t})=>tthis.minWidthTo))?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0);let n=-1;this.view.inputState.composing>=0&&((null===(t=this.domChanged)||void 0===t?void 0:t.newSel)?n=this.domChanged.newSel.head:function(e,t){let i=!1;return t&&e.iterChangedRanges(((e,n)=>{et.from&&(i=!0)})),i}(e.changes,this.hasComposition)||e.selectionSet||(n=e.state.selection.main.head));let s=n>-1?function(e,t,i){let n=Zi(e,i);if(!n)return null;let{node:s,from:r,to:o}=n,a=s.nodeValue;if(/[\n\r]/.test(a))return null;if(e.state.doc.sliceString(n.from,n.to)!=a)return null;let l=t.invertedDesc,h=new Ei(l.mapPos(r),l.mapPos(o),r,o),c=[];for(let t=s.parentNode;;t=t.parentNode){let i=gt.get(t);if(i instanceof It)c.push({node:t,deco:i.mark});else{if(i instanceof Ut||"DIV"==t.nodeName&&t.parentNode==e.contentDOM)return{range:h,text:s,marks:c,line:t};if(t==e.contentDOM)return null;c.push({node:t,deco:new Gt({inclusive:!0,attributes:Vt(t),tagName:t.tagName.toLowerCase()})})}}}(this.view,e.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:t,to:n}=this.hasComposition;i=new Ei(t,n,e.changes.mapPos(t,-1),e.changes.mapPos(n,1)).addToSet(i.slice())}this.hasComposition=s?{from:s.range.fromB,to:s.range.toB}:null,(Rt.ie||Rt.chrome)&&!s&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let r=function(e,t,i){let n=new Ji;return Se.compare(e,t,i,n),n.changes}(this.decorations,this.updateDeco(),e.changes);return i=Ei.extendWithRanges(i,r),!!(7&this.flags||0!=i.length)&&(this.updateInner(i,e.startState.doc.length,s),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,t,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(e,t,i);let{observer:n}=this.view;n.ignore((()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let e=Rt.chrome||Rt.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,e),this.flags&=-8,e&&(e.written||n.selectionRange.focusNode!=e.node)&&(this.forceSelection=!0),this.dom.style.height=""})),this.markedForComposition.forEach((e=>e.flags&=-9));let s=[];if(this.view.viewport.from||this.view.viewport.to=0?n[e]:null;if(!t)break;let r,o,a,l,{fromA:h,toA:c,fromB:d,toB:u}=t;if(i&&i.range.fromBd){let e=ti.build(this.view.state.doc,d,i.range.fromB,this.decorations,this.dynamicDecorationMap),t=ti.build(this.view.state.doc,i.range.toB,u,this.decorations,this.dynamicDecorationMap);o=e.breakAtStart,a=e.openStart,l=t.openEnd;let n=this.compositionView(i);t.breakAtStart?n.breakAfter=1:t.content.length&&n.merge(n.length,n.length,t.content[0],!1,t.openStart,0)&&(n.breakAfter=t.content[0].breakAfter,t.content.shift()),e.content.length&&n.merge(0,0,e.content[e.content.length-1],!0,0,e.openEnd)&&e.content.pop(),r=e.content.concat(n).concat(t.content)}else({content:r,breakAtStart:o,openStart:a,openEnd:l}=ti.build(this.view.state.doc,d,u,this.decorations,this.dynamicDecorationMap));let{i:p,off:f}=s.findPos(c,1),{i:m,off:g}=s.findPos(h,-1);bt(this,m,g,p,f,r,o,a,l)}i&&this.fixCompositionDOM(i)}compositionView(e){let t=new Dt(e.text.nodeValue);t.flags|=8;for(let{deco:i}of e.marks)t=new It(i,[t],t.length);let i=new Ut;return i.append(t,0),i}fixCompositionDOM(e){let t=(e,t)=>{t.flags|=8|(t.children.some((e=>7&e.flags))?1:0),this.markedForComposition.add(t);let i=gt.get(e);i&&i!=t&&(i.dom=null),t.setDOM(e)},i=this.childPos(e.range.fromB,1),n=this.children[i.i];t(e.line,n);for(let s=e.marks.length-1;s>=-1;s--)i=n.childPos(i.off,1),n=n.children[i.i],t(s>=0?e.marks[s].node:e.text,n)}updateSelection(e=!1,t=!1){!e&&this.view.observer.selectionRange.focusNode||this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,s=!n&&Ke(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||t||s))return;let r=this.forceSelection;this.forceSelection=!1;let o=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(o.anchor)),l=o.empty?a:this.moveToLine(this.domAtPos(o.head));if(Rt.gecko&&o.empty&&!this.hasComposition&&1==(h=a).node.nodeType&&h.node.firstChild&&(0==h.offset||"false"==h.node.childNodes[h.offset-1].contentEditable)&&(h.offset==h.node.childNodes.length||"false"==h.node.childNodes[h.offset].contentEditable)){let e=document.createTextNode("");this.view.observer.ignore((()=>a.node.insertBefore(e,a.node.childNodes[a.offset]||null))),a=l=new ft(e,0),r=!0}var h;let c=this.view.observer.selectionRange;!r&&c.focusNode&&et(a.node,a.offset,c.anchorNode,c.anchorOffset)&&et(l.node,l.offset,c.focusNode,c.focusOffset)||(this.view.observer.ignore((()=>{Rt.android&&Rt.chrome&&this.dom.contains(c.focusNode)&&function(e,t){for(let i=e;i&&i!=t;i=i.assignedSlot||i.parentNode)if(1==i.nodeType&&"false"==i.contentEditable)return!0;return!1}(c.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let e=Ge(this.view.root);if(e)if(o.empty){if(Rt.gecko){let e=(t=a.node,n=a.offset,1!=t.nodeType?0:(n&&"false"==t.childNodes[n-1].contentEditable?1:0)|(no.head&&([a,l]=[l,a]),t.setEnd(l.node,l.offset),t.setStart(a.node,a.offset),e.removeAllRanges(),e.addRange(t)}var t,n;s&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())})),this.view.observer.setSelectionRange(a,l)),this.impreciseAnchor=a.precise?null:new ft(c.anchorNode,c.anchorOffset),this.impreciseHead=l.precise?null:new ft(c.focusNode,c.focusOffset)}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e.state.selection.main,i=Ge(e.root),{anchorNode:n,anchorOffset:s}=e.observer.selectionRange;if(!(i&&t.empty&&t.assoc&&i.modify))return;let r=Ut.find(this,t.head);if(!r)return;let o=r.posAtStart;if(t.head==o||t.head==o+r.length)return;let a=this.coordsAt(t.head,-1),l=this.coordsAt(t.head,1);if(!a||!l||a.bottom>l.top)return;let h=this.domAtPos(t.head+t.assoc);i.collapse(h.node,h.offset),i.modify("move",t.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let c=e.observer.selectionRange;e.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=t.from&&i.collapse(n,s)}moveToLine(e){let t,i=this.dom;if(e.node!=i)return e;for(let n=e.offset;!t&&n=0;n--){let e=gt.get(i.childNodes[n]);e instanceof Ut&&(t=e.domAtPos(e.length))}return t?new ft(t.node,t.offset,!0):e}nearest(e){for(let t=e;t;){let e=gt.get(t);if(e&&e.rootView==this)return e;t=t.parentNode}return null}posFromDOM(e,t){let i=this.nearest(e);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(e,t)+i.posAtStart}domAtPos(e){let{i:t,off:i}=this.childCursor().findPos(e,-1);for(;t=0;r--){let o=this.children[r],a=s-o.breakAfter,l=a-o.length;if(ae||o.covers(1))&&(!i||o instanceof Ut&&!(i instanceof Ut&&t>=0))&&(i=o,n=l),s=l}return i?i.coordsAt(e-n,t):null}coordsForChar(e){let{i:t,off:i}=this.childPos(e,1),n=this.children[t];if(!(n instanceof Ut))return null;for(;n.children.length;){let{i:e,off:t}=n.childPos(i,1);for(;;e++){if(e==n.children.length)return null;if((n=n.children[e]).length)break}i=t}if(!(n instanceof Dt))return null;let s=p(n.text,i);if(s==i)return null;let r=ct(n.dom,i,s).getClientRects();for(let e=0;eMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,o=-1,a=this.view.textDirection==Ri.LTR;for(let e=0,l=0;ln)break;if(e>=i){let i=h.dom.getBoundingClientRect();if(t.push(i.height),r){let t=h.dom.lastChild,n=t?Je(t):[];if(n.length){let t=n[n.length-1],r=a?t.right-i.left:i.right-t.left;r>o&&(o=r,this.minWidth=s,this.minWidthFrom=e,this.minWidthTo=c)}}}e=c+h.breakAfter}return t}textDirectionAt(e){let{i:t}=this.childPos(e,1);return"rtl"==getComputedStyle(this.children[t].dom).direction?Ri.RTL:Ri.LTR}measureTextSize(){for(let e of this.children)if(e instanceof Ut){let t=e.measureTextSize();if(t)return t}let e,t,i,n=document.createElement("div");return n.className="cm-line",n.style.width="99999px",n.style.position="absolute",n.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore((()=>{this.dom.appendChild(n);let s=Je(n.firstChild)[0];e=n.getBoundingClientRect().height,t=s?s.width/27:7,i=s?s.height:e,n.remove()})),{lineHeight:e,charWidth:t,textHeight:i}}childCursor(e=this.length){let t=this.children.length;return t&&(e-=this.children[--t].length),new Ot(this.children,e,t)}computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let i=0,n=0;;n++){let s=n==t.viewports.length?null:t.viewports[n],r=s?s.from-1:this.length;if(r>i){let n=(t.lineBlockAt(r).bottom-t.lineBlockAt(i).top)/this.view.scaleY;e.push(Yt.replace({widget:new Gi(n),block:!0,inclusive:!0,isBlockGap:!0}).range(i,r))}if(!s)break;i=s.to+1}return Yt.set(e)}updateDeco(){let e=this.view.state.facet(xi).map(((e,t)=>(this.dynamicDecorationMap[t]="function"==typeof e)?e(this.view):e));for(let t=e.length;ti.anchor?-1:1);if(!n)return;!i.empty&&(t=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,t.left),top:Math.min(n.top,t.top),right:Math.max(n.right,t.right),bottom:Math.max(n.bottom,t.bottom)});let s=Pi(this.view),r={left:n.left-s.left,top:n.top-s.top,right:n.right+s.right,bottom:n.bottom+s.bottom};!function(e,t,i,n,s,r,o,a){let l=e.ownerDocument,h=l.defaultView||window;for(let c=e,d=!1;c&&!d;)if(1==c.nodeType){let e,u=c==l.body,p=1,f=1;if(u)e=rt(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(d=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let t=c.getBoundingClientRect();p=t.width/c.offsetWidth,f=t.height/c.offsetHeight,e={left:t.left,right:t.left+c.clientWidth*p,top:t.top,bottom:t.top+c.clientHeight*f}}let m=0,g=0;if("nearest"==s)t.top0&&t.bottom>e.bottom+g&&(g=t.bottom-e.bottom+g+o)):t.bottom>e.bottom&&(g=t.bottom-e.bottom+o,i<0&&t.top-g0&&t.right>e.right+m&&(m=t.right-e.right+m+r)):t.right>e.right&&(m=t.right-e.right+r,i<0&&t.left0))break;i=i.childNodes[n-1],n=nt(i)}if(i>=0)for(let n=e,s=t;;){if(3==n.nodeType)return{node:n,offset:s};if(!(1==n.nodeType&&s=0))break;n=n.childNodes[s],s=0}return null}let Ji=class{constructor(){this.changes=[]}compareRange(e,t){ei(e,t,this.changes)}comparePoint(e,t){ei(e,t,this.changes)}};function en(e,t){return t.left>e?t.left-e:Math.max(0,e-t.right)}function tn(e,t){return t.top>e?t.top-e:Math.max(0,e-t.bottom)}function nn(e,t){return e.topt.top+1}function sn(e,t){return te.bottom?{top:e.top,left:e.left,right:e.right,bottom:t}:e}function on(e,t,i){let n,s,r,o,a,l,h,c,d=!1;for(let u=e.firstChild;u;u=u.nextSibling){let e=Je(u);for(let p=0;pg||o==g&&r>m){n=u,s=f,r=m,o=g;let a=g?i0?p0)}0==m?i>f.bottom&&(!h||h.bottomf.top)&&(l=u,c=f):h&&nn(h,f)?h=rn(h,f.bottom):c&&nn(c,f)&&(c=sn(c,f.top))}}if(h&&h.bottom>=i?(n=a,s=h):c&&c.top<=i&&(n=l,s=c),!n)return{node:e,offset:0};let u=Math.max(s.left,Math.min(s.right,t));return 3==n.nodeType?an(n,u,i):d&&"false"!=n.contentEditable?on(n,u,i):{node:e,offset:Array.prototype.indexOf.call(e.childNodes,n)+(t>=(s.left+s.right)/2?1:0)}}function an(e,t,i){let n=e.nodeValue.length,s=-1,r=1e9,o=0;for(let a=0;ai?h.top-i:i-h.bottom)-1;if(h.left-1<=t&&h.right+1>=t&&c=(h.left+h.right)/2,n=i;if((Rt.chrome||Rt.gecko)&&ct(e,a).getBoundingClientRect().left==h.right&&(n=!i),c<=0)return{node:e,offset:a+(n?1:0)};s=a+(n?1:0),r=c}}}return{node:e,offset:s>-1?s:o>0?e.nodeValue.length:0}}function ln(e,t,i,n=-1){var s,r;let o,a=e.contentDOM.getBoundingClientRect(),l=a.top+e.viewState.paddingTop,{docHeight:h}=e.viewState,{x:c,y:d}=t,u=d-l;if(u<0)return 0;if(u>h)return e.state.doc.length;for(let t=e.viewState.heightOracle.textHeight/2,s=!1;o=e.elementAtHeight(u),o.type!=Xt.Text;)for(;u=n>0?o.bottom+t:o.top-t,!(u>=0&&u<=h);){if(s)return i?null:0;s=!0,n=-n}d=l+u;let p=o.from;if(pe.viewport.to)return e.viewport.to==e.state.doc.length?e.state.doc.length:i?null:hn(e,a,o,c,d);let f=e.dom.ownerDocument,m=e.root.elementFromPoint?e.root:f,g=m.elementFromPoint(c,d);g&&!e.contentDOM.contains(g)&&(g=null),g||(c=Math.max(a.left+1,Math.min(a.right-1,c)),g=m.elementFromPoint(c,d),g&&!e.contentDOM.contains(g)&&(g=null));let v,O=-1;if(g&&0!=(null===(s=e.docView.nearest(g))||void 0===s?void 0:s.isEditable))if(f.caretPositionFromPoint){let e=f.caretPositionFromPoint(c,d);e&&({offsetNode:v,offset:O}=e)}else if(f.caretRangeFromPoint){let t=f.caretRangeFromPoint(c,d);t&&(({startContainer:v,startOffset:O}=t),(!e.contentDOM.contains(v)||Rt.safari&&function(e,t,i){let n;if(3!=e.nodeType||t!=(n=e.nodeValue.length))return!1;for(let t=e.nextSibling;t;t=t.nextSibling)if(1!=t.nodeType||"BR"!=t.nodeName)return!1;return ct(e,n-1,n).getBoundingClientRect().left>i}(v,O,c)||Rt.chrome&&function(e,t,i){if(0!=t)return!1;for(let t=e;;){let e=t.parentNode;if(!e||1!=e.nodeType||e.firstChild!=t)return!1;if(e.classList.contains("cm-line"))break;t=e}return i-(1==e.nodeType?e.getBoundingClientRect():ct(e,0,Math.max(e.nodeValue.length,1)).getBoundingClientRect()).left>5}(v,O,c))&&(v=void 0))}if(!v||!e.docView.dom.contains(v)){let t=Ut.find(e.docView,p);if(!t)return u>o.top+o.height/2?o.to:o.from;({node:v,offset:O}=on(t.dom,c,d))}let b=e.docView.nearest(v);if(!b)return null;if(b.isWidget&&1==(null===(r=b.dom)||void 0===r?void 0:r.nodeType)){let e=b.dom.getBoundingClientRect();return t.y1.5*e.defaultLineHeight){let t=e.viewState.heightOracle.textHeight;r+=Math.floor((s-i.top-.5*(e.defaultLineHeight-t))/t)*e.viewState.heightOracle.lineLength}let o=e.state.sliceDoc(i.from,i.to);return i.from+Ne(o,r,e.state.tabSize)}function cn(e,t){let i=e.lineBlockAt(t);if(Array.isArray(i.type))for(let e of i.type)if(e.to>t||e.to==t&&(e.to==i.to||e.type==Xt.Text))return e;return i}function dn(e,t,i,n){let s=e.state.doc.lineAt(t.head),r=e.bidiSpans(s),o=e.textDirectionAt(s.from);for(let a=t,l=null;;){let t=Xi(s,r,o,a,i),h=Hi;if(!t){if(s.number==(i?e.state.doc.lines:1))return a;h="\n",s=e.state.doc.line(s.number+(i?1:-1)),r=e.bidiSpans(s),t=R.cursor(i?s.from:s.to)}if(l){if(!l(h))return a}else{if(!n)return t;l=n(h)}a=t}}function un(e,t,i){for(;;){let n=0;for(let s of e)s.between(t-1,t+1,((e,s,r)=>{if(t>e&&tt(e))),i.from,t.head>i.from?-1:1);return n==i.from?i:R.cursor(n,nnull)),Rt.gecko&&function(e){zn.has(e)||(zn.add(e),e.addEventListener("copy",(()=>{})),e.addEventListener("cut",(()=>{})))}(e.contentDOM.ownerDocument)}handleEvent(e){(function(e,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let i,n=t.target;n!=e.contentDOM;n=n.parentNode)if(!n||11==n.nodeType||(i=gt.get(n))&&i.ignoreEvent(t))return!1;return!0})(this.view,e)&&!this.ignoreDuringComposition(e)&&("keydown"==e.type&&this.keydown(e)||this.runHandlers(e.type,e))}runHandlers(e,t){let i=this.handlers[e];if(i){for(let e of i.observers)e(this.view,t);for(let e of i.handlers){if(t.defaultPrevented)break;if(e(this.view,t)){t.preventDefault();break}}}}ensureHandlers(e){let t=gn(e),i=this.handlers,n=this.view.contentDOM;for(let e in t)if("scroll"!=e){let s=!t[e].handlers.length,r=i[e];r&&s!=!r.handlers.length&&(n.removeEventListener(e,this.handleEvent),r=null),r||n.addEventListener(e,this.handleEvent,{passive:s})}for(let e in i)"scroll"==e||t[e]||n.removeEventListener(e,this.handleEvent);this.handlers=t}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),9==e.keyCode&&Date.now()t.keyCode==e.keyCode)))&&!e.ctrlKey||On.indexOf(e.key)>-1&&e.ctrlKey&&!e.shiftKey)?(229!=e.keyCode&&this.view.observer.forceFlush(),!1):(this.pendingIOSKey=t||e,setTimeout((()=>this.flushIOSKey()),250),!0)}flushIOSKey(){let e=this.pendingIOSKey;return!!e&&(this.pendingIOSKey=void 0,dt(this.view.contentDOM,e.key,e.keyCode))}ignoreDuringComposition(e){return!!/^key/.test(e.type)&&(this.composing>0||!!(Rt.safari&&!Rt.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100)&&(this.compositionPendingKey=!1,!0))}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.mouseSelection&&this.mouseSelection.update(e),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function mn(e,t){return(i,n)=>{try{return t.call(e,n,i)}catch(e){mi(i.state,e)}}}function gn(e){let t=Object.create(null);function i(e){return t[e]||(t[e]={observers:[],handlers:[]})}for(let t of e){let e=t.spec;if(e&&e.domEventHandlers)for(let n in e.domEventHandlers){let s=e.domEventHandlers[n];s&&i(n).handlers.push(mn(t.value,s))}if(e&&e.domEventObservers)for(let n in e.domEventObservers){let s=e.domEventObservers[n];s&&i(n).observers.push(mn(t.value,s))}}for(let e in wn)i(e).handlers.push(wn[e]);for(let e in xn)i(e).observers.push(xn[e]);return t}const vn=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],On="dthko",bn=[16,17,18,20,91,92,224,225];function _n(e){return.7*Math.max(0,e)+8}class yn{constructor(e,t,i,n){this.view=e,this.startEvent=t,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=t,this.scrollParent=function(e){let t=e.ownerDocument;for(let i=e.parentNode;i&&i!=t.body;)if(1==i.nodeType){if(i.scrollHeight>i.clientHeight||i.scrollWidth>i.clientWidth)return i;i=i.assignedSlot||i.parentNode}else{if(11!=i.nodeType)break;i=i.host}return null}(e.contentDOM),this.atoms=e.state.facet(Si).map((t=>t(e)));let s=e.contentDOM.ownerDocument;s.addEventListener("mousemove",this.move=this.move.bind(this)),s.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=t.shiftKey,this.multiple=e.state.facet(Oe.allowMultipleSelections)&&function(e,t){let i=e.state.facet(si);return i.length?i[0](t):Rt.mac?t.metaKey:t.ctrlKey}(e,t),this.dragging=!(!function(e,t){let{main:i}=e.state.selection;if(i.empty)return!1;let n=Ge(e.root);if(!n||0==n.rangeCount)return!0;let s=n.getRangeAt(0).getClientRects();for(let e=0;e=t.clientX&&i.top<=t.clientY&&i.bottom>=t.clientY)return!0}return!1}(e,t)||1!=qn(t))&&null}start(e){!1===this.dragging&&this.select(e)}move(e){var t,i,n;if(0==e.buttons)return this.destroy();if(this.dragging||null==this.dragging&&(i=this.startEvent,n=e,Math.max(Math.abs(i.clientX-n.clientX),Math.abs(i.clientY-n.clientY))<10))return;this.select(this.lastEvent=e);let s=0,r=0,o=(null===(t=this.scrollParent)||void 0===t?void 0:t.getBoundingClientRect())||{left:0,top:0,right:this.view.win.innerWidth,bottom:this.view.win.innerHeight},a=Pi(this.view);e.clientX-a.left<=o.left+6?s=-_n(o.left-e.clientX):e.clientX+a.right>=o.right-6&&(s=_n(e.clientX-o.right)),e.clientY-a.top<=o.top+6?r=-_n(o.top-e.clientY):e.clientY+a.bottom>=o.bottom-6&&(r=_n(e.clientY-o.bottom)),this.setScrollSpeed(s,r)}up(e){null==this.dragging&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=null}setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(this.scrolling=setInterval((()=>this.scroll()),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){this.scrollParent?(this.scrollParent.scrollLeft+=this.scrollSpeed.x,this.scrollParent.scrollTop+=this.scrollSpeed.y):this.view.win.scrollBy(this.scrollSpeed.x,this.scrollSpeed.y),!1===this.dragging&&this.select(this.lastEvent)}skipAtoms(e){let t=null;for(let i=0;ithis.select(this.lastEvent)),20)}}const wn=Object.create(null),xn=Object.create(null),Sn=Rt.ie&&Rt.ie_version<15||Rt.ios&&Rt.webkit_version<604;function kn(e,t){let i,{state:n}=e,s=1,r=n.toText(t),o=r.lines==n.selection.ranges.length;if(null!=Nn&&n.selection.ranges.every((e=>e.empty))&&Nn==r.toString()){let e=-1;i=n.changeByRange((i=>{let a=n.doc.lineAt(i.from);if(a.from==e)return{range:i};e=a.from;let l=n.toText((o?r.line(s++).text:t)+n.lineBreak);return{changes:{from:a.from,insert:l},range:R.cursor(i.from+l.length)}}))}else i=o?n.changeByRange((e=>{let t=r.line(s++);return{changes:{from:e.from,to:e.to,insert:t.text},range:R.cursor(e.from+t.length)}})):n.replaceSelection(r);e.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}function Tn(e,t,i,n){if(1==n)return R.cursor(t,i);if(2==n)return function(e,t,i=1){let n=e.charCategorizer(t),s=e.doc.lineAt(t),r=t-s.from;if(0==s.length)return R.cursor(t);0==r?i=1:r==s.length&&(i=-1);let o=r,a=r;i<0?o=p(s.text,r,!1):a=p(s.text,r);let l=n(s.text.slice(o,a));for(;o>0;){let e=p(s.text,o,!1);if(n(s.text.slice(e,o))!=l)break;o=e}for(;a{e.inputState.lastScrollTop=e.scrollDOM.scrollTop,e.inputState.lastScrollLeft=e.scrollDOM.scrollLeft},wn.keydown=(e,t)=>(e.inputState.setSelectionOrigin("select"),27==t.keyCode&&(e.inputState.lastEscPress=Date.now()),!1),xn.touchstart=(e,t)=>{e.inputState.lastTouchTime=Date.now(),e.inputState.setSelectionOrigin("select.pointer")},xn.touchmove=e=>{e.inputState.setSelectionOrigin("select.pointer")},wn.mousedown=(e,t)=>{if(e.observer.flush(),e.inputState.lastTouchTime>Date.now()-2e3)return!1;let i=null;for(let n of e.state.facet(oi))if(i=n(e,t),i)break;if(i||0!=t.button||(i=function(e,t){let i=En(e,t),n=qn(t),s=e.state.selection;return{update(e){e.docChanged&&(i.pos=e.changes.mapPos(i.pos),s=s.map(e.changes))},get(t,r,o){let a,l=En(e,t),h=Tn(e,l.pos,l.bias,n);if(i.pos!=l.pos&&!r){let t=Tn(e,i.pos,i.bias,n),s=Math.min(t.from,h.from),r=Math.max(t.to,h.to);h=s1&&(a=function(e,t){for(let i=0;i=t)return R.create(e.ranges.slice(0,i).concat(e.ranges.slice(i+1)),e.mainIndex==i?0:e.mainIndex-(e.mainIndex>i?1:0))}return null}(s,l.pos))?a:o?s.addRange(h):R.create([h])}}}(e,t)),i){let n=!e.hasFocus;e.inputState.startMouseSelection(new yn(e,t,i,n)),n&&e.observer.ignore((()=>ht(e.contentDOM)));let s=e.inputState.mouseSelection;if(s)return s.start(t),!1===s.dragging}return!1};let Cn=(e,t)=>e>=t.top&&e<=t.bottom,Pn=(e,t,i)=>Cn(t,i)&&e>=i.left&&e<=i.right;function Mn(e,t,i,n){let s=Ut.find(e.docView,t);if(!s)return 1;let r=t-s.posAtStart;if(0==r)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&Pn(i,n,o))return-1;let a=s.coordsAt(r,1);return a&&Pn(i,n,a)?1:o&&Cn(n,o)?-1:1}function En(e,t){let i=e.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:i,bias:Mn(e,i,t.clientX,t.clientY)}}const An=Rt.ie&&Rt.ie_version<=11;let Rn=null,Dn=0,In=0;function qn(e){if(!An)return e.detail;let t=Rn,i=In;return Rn=e,In=Date.now(),Dn=!t||i>Date.now()-400&&Math.abs(t.clientX-e.clientX)<2&&Math.abs(t.clientY-e.clientY)<2?(Dn+1)%3:1}function Ln(e,t,i,n){if(!i)return;let s=e.posAtCoords({x:t.clientX,y:t.clientY},!1),{mouseSelection:r}=e.inputState,o=n&&r&&r.dragging&&function(e,t){let i=e.state.facet(ri);return i.length?i[0](t):Rt.mac?!t.altKey:!t.ctrlKey}(e,t)?{from:r.dragging.from,to:r.dragging.to}:null,a={from:s,insert:i},l=e.state.changes(o?[o,a]:a);e.focus(),e.dispatch({changes:l,selection:{anchor:l.mapPos(s,-1),head:l.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"})}wn.dragstart=(e,t)=>{let{selection:{main:i}}=e.state,{mouseSelection:n}=e.inputState;return n&&(n.dragging=i),t.dataTransfer&&(t.dataTransfer.setData("Text",e.state.sliceDoc(i.from,i.to)),t.dataTransfer.effectAllowed="copyMove"),!1},wn.drop=(e,t)=>{if(!t.dataTransfer)return!1;if(e.state.readOnly)return!0;let i=t.dataTransfer.files;if(i&&i.length){let n=Array(i.length),s=0,r=()=>{++s==i.length&&Ln(e,t,n.filter((e=>null!=e)).join(e.state.lineBreak),!1)};for(let e=0;e{/[\x00-\x08\x0e-\x1f]{2}/.test(t.result)||(n[e]=t.result),r()},t.readAsText(i[e])}return!0}{let i=t.dataTransfer.getData("Text");if(i)return Ln(e,t,i,!0),!0}return!1},wn.paste=(e,t)=>{if(e.state.readOnly)return!0;e.observer.flush();let i=Sn?null:t.clipboardData;return i?(kn(e,i.getData("text/plain")||i.getData("text/uri-text")),!0):(function(e){let t=e.dom.parentNode;if(!t)return;let i=t.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.focus(),setTimeout((()=>{e.focus(),i.remove(),kn(e,i.value)}),50)}(e),!1)};let Nn=null;wn.copy=wn.cut=(e,t)=>{let{text:i,ranges:n,linewise:s}=function(e){let t=[],i=[],n=!1;for(let n of e.selection.ranges)n.empty||(t.push(e.sliceDoc(n.from,n.to)),i.push(n));if(!t.length){let s=-1;for(let{from:n}of e.selection.ranges){let r=e.doc.lineAt(n);r.number>s&&(t.push(r.text),i.push({from:r.from,to:Math.min(e.doc.length,r.to+1)})),s=r.number}n=!0}return{text:t.join(e.lineBreak),ranges:i,linewise:n}}(e.state);if(!i&&!s)return!1;Nn=s?i:null,"cut"!=t.type||e.state.readOnly||e.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let r=Sn?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",i),!0):(function(e,t){let i=e.dom.parentNode;if(!i)return;let n=i.appendChild(document.createElement("textarea"));n.style.cssText="position: fixed; left: -10000px; top: 10px",n.value=t,n.focus(),n.selectionEnd=t.length,n.selectionStart=0,setTimeout((()=>{n.remove(),e.focus()}),50)}(e,i),!1)};const Bn=se.define();function $n(e,t){let i=[];for(let n of e.facet(ci)){let s=n(e,t);s&&i.push(s)}return i?e.update({effects:i,annotations:Bn.of(!0)}):null}function Qn(e){setTimeout((()=>{let t=e.hasFocus;if(t!=e.inputState.notifiedFocused){let i=$n(e.state,t);i?e.dispatch(i):e.update([])}}),10)}xn.focus=e=>{e.inputState.lastFocusTime=Date.now(),e.scrollDOM.scrollTop||!e.inputState.lastScrollTop&&!e.inputState.lastScrollLeft||(e.scrollDOM.scrollTop=e.inputState.lastScrollTop,e.scrollDOM.scrollLeft=e.inputState.lastScrollLeft),Qn(e)},xn.blur=e=>{e.observer.clearSelectionRange(),Qn(e)},xn.compositionstart=xn.compositionupdate=e=>{null==e.inputState.compositionFirstChange&&(e.inputState.compositionFirstChange=!0),e.inputState.composing<0&&(e.inputState.composing=0)},xn.compositionend=e=>{e.inputState.composing=-1,e.inputState.compositionEndedAt=Date.now(),e.inputState.compositionPendingKey=!0,e.inputState.compositionPendingChange=e.observer.pendingRecords().length>0,e.inputState.compositionFirstChange=null,Rt.chrome&&Rt.android?e.observer.flushSoon():e.inputState.compositionPendingChange?Promise.resolve().then((()=>e.observer.flush())):setTimeout((()=>{e.inputState.composing<0&&e.docView.hasComposition&&e.update([])}),50)},xn.contextmenu=e=>{e.inputState.lastContextMenu=Date.now()},wn.beforeinput=(e,t)=>{var i;let n;if(Rt.chrome&&Rt.android&&(n=vn.find((e=>e.inputType==t.inputType)))&&(e.observer.delayAndroidKey(n.key,n.keyCode),"Backspace"==n.key||"Delete"==n.key)){let t=(null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0;setTimeout((()=>{var i;((null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0)>t+10&&e.hasFocus&&(e.contentDOM.blur(),e.focus())}),100)}return!1};const zn=new Set,jn=["pre-wrap","normal","pre-line","break-spaces"];class Wn{constructor(t){this.lineWrapping=t,this.doc=e.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30,this.heightChanged=!1}heightForGap(e,t){let i=this.doc.lineAt(t).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((t-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return jn.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let t=!1;for(let i=0;i-1,a=Math.round(t)!=Math.round(this.lineHeight)||this.lineWrapping!=o;if(this.lineWrapping=o,this.lineHeight=t,this.charWidth=i,this.textHeight=n,this.lineLength=s,a){this.heightSamples={};for(let e=0;e0}set outdated(e){this.flags=(e?2:0)|-3&this.flags}setHeight(e,t){this.height!=t&&(Math.abs(this.height-t)>Hn&&(e.heightChanged=!0),this.height=t)}replace(e,t,i){return Xn.of(i)}decomposeLeft(e,t){t.push(this)}decomposeRight(e,t){t.push(this)}applyChanges(e,t,i,n){let s=this,r=i.doc;for(let o=n.length-1;o>=0;o--){let{fromA:a,toA:l,fromB:h,toB:c}=n[o],d=s.lineAt(a,Fn.ByPosNoHeight,i.setDoc(t),0,0),u=d.to>=l?d:s.lineAt(l,Fn.ByPosNoHeight,i,0,0);for(c+=u.to-l,l=u.to;o>0&&d.from<=n[o-1].toA;)a=n[o-1].fromA,h=n[o-1].fromB,o--,a2*s){let s=e[t-1];s.break?e.splice(--t,1,s.left,null,s.right):e.splice(--t,1,s.left,s.right),i+=1+s.break,n-=s.size}else{if(!(s>2*n))break;{let t=e[i];t.break?e.splice(i,1,t.left,null,t.right):e.splice(i,1,t.left,t.right),i+=2+t.break,s-=t.size}}else if(n=s&&r(this.blockAt(0,i,n,s))}updateHeight(e,t=0,i=!1,n){return n&&n.from<=t&&n.more&&this.setHeight(e,n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}}class Gn extends Yn{constructor(e,t){super(e,t,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(e,t,i,n){return new Un(n,this.length,i,this.height,this.breaks)}replace(e,t,i){let n=i[0];return 1==i.length&&(n instanceof Gn||n instanceof Zn&&4&n.flags)&&Math.abs(this.length-n.length)<10?(n instanceof Zn?n=new Gn(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):Xn.of(i)}updateHeight(e,t=0,i=!1,n){return n&&n.from<=t&&n.more?this.setHeight(e,n.heights[n.index++]):(i||this.outdated)&&this.setHeight(e,Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class Zn extends Xn{constructor(e){super(e,0)}heightMetrics(e,t){let i,n=e.doc.lineAt(t).number,s=e.doc.lineAt(t+this.length).number,r=s-n+1,o=0;if(e.lineWrapping){let t=Math.min(this.height,e.lineHeight*r);i=t/r,this.length>r+1&&(o=(this.height-t)/(this.length-r-1))}else i=this.height/r;return{firstLine:n,lastLine:s,perLine:i,perChar:o}}blockAt(e,t,i,n){let{firstLine:s,lastLine:r,perLine:o,perChar:a}=this.heightMetrics(t,n);if(t.lineWrapping){let s=n+Math.round(Math.max(0,Math.min(1,(e-i)/this.height))*this.length),r=t.doc.lineAt(s),l=o+r.length*a,h=Math.max(i,e-l/2);return new Un(r.from,r.length,h,l,0)}{let n=Math.max(0,Math.min(r-s,Math.floor((e-i)/o))),{from:a,length:l}=t.doc.line(s+n);return new Un(a,l,i+o*n,o,0)}}lineAt(e,t,i,n,s){if(t==Fn.ByHeight)return this.blockAt(e,i,n,s);if(t==Fn.ByPosNoHeight){let{from:t,to:n}=i.doc.lineAt(e);return new Un(t,n-t,0,0,0)}let{firstLine:r,perLine:o,perChar:a}=this.heightMetrics(i,s),l=i.doc.lineAt(e),h=o+l.length*a,c=l.number-r,d=n+o*c+a*(l.from-s-c);return new Un(l.from,l.length,Math.max(n,Math.min(d,n+this.height-h)),h,0)}forEachLine(e,t,i,n,s,r){e=Math.max(e,s),t=Math.min(t,s+this.length);let{firstLine:o,perLine:a,perChar:l}=this.heightMetrics(i,s);for(let h=e,c=n;h<=t;){let t=i.doc.lineAt(h);if(h==e){let i=t.number-o;c+=a*i+l*(e-s-i)}let n=a+l*t.length;r(new Un(t.from,t.length,c,n,0)),c+=n,h=t.to+1}}replace(e,t,i){let n=this.length-t;if(n>0){let e=i[i.length-1];e instanceof Zn?i[i.length-1]=new Zn(e.length+n):i.push(null,new Zn(n-1))}if(e>0){let t=i[0];t instanceof Zn?i[0]=new Zn(e+t.length):i.unshift(new Zn(e-1),null)}return Xn.of(i)}decomposeLeft(e,t){t.push(new Zn(e-1),null)}decomposeRight(e,t){t.push(null,new Zn(this.length-e-1))}updateHeight(e,t=0,i=!1,n){let s=t+this.length;if(n&&n.from<=t+this.length&&n.more){let i=[],r=Math.max(t,n.from),o=-1;for(n.from>t&&i.push(new Zn(n.from-t-1).updateHeight(e,t));r<=s&&n.more;){let t=e.doc.lineAt(r).length;i.length&&i.push(null);let s=n.heights[n.index++];-1==o?o=s:Math.abs(s-o)>=Hn&&(o=-2);let a=new Gn(t,s);a.outdated=!1,i.push(a),r+=t+1}r<=s&&i.push(null,new Zn(s-r).updateHeight(e,r));let a=Xn.of(i);return(o<0||Math.abs(a.height-this.height)>=Hn||Math.abs(o-this.heightMetrics(e,t).perLine)>=Hn)&&(e.heightChanged=!0),a}return(i||this.outdated)&&(this.setHeight(e,e.heightForGap(t,t+this.length)),this.outdated=!1),this}toString(){return`gap(${this.length})`}}class Kn extends Xn{constructor(e,t,i){super(e.length+t+i.length,e.height+i.height,t|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return 1&this.flags}blockAt(e,t,i,n){let s=i+this.left.height;return eo))return l;let h=t==Fn.ByPosNoHeight?Fn.ByPosNoHeight:Fn.ByPos;return a?l.join(this.right.lineAt(o,h,i,r,o)):this.left.lineAt(o,h,i,n,s).join(l)}forEachLine(e,t,i,n,s,r){let o=n+this.left.height,a=s+this.left.length+this.break;if(this.break)e=a&&this.right.forEachLine(e,t,i,o,a,r);else{let l=this.lineAt(a,Fn.ByPos,i,n,s);e=e&&l.from<=t&&r(l),t>l.to&&this.right.forEachLine(l.to+1,t,i,o,a,r)}}replace(e,t,i){let n=this.left.length+this.break;if(tthis.left.length)return this.balanced(this.left,this.right.replace(e-n,t-n,i));let s=[];e>0&&this.decomposeLeft(e,s);let r=s.length;for(let e of i)s.push(e);if(e>0&&Jn(s,r-1),t=i&&t.push(null)),e>i&&this.right.decomposeLeft(e-i,t)}decomposeRight(e,t){let i=this.left.length,n=i+this.break;if(e>=n)return this.right.decomposeRight(e-n,t);e2*t.size||t.size>2*e.size?Xn.of(this.break?[e,null,t]:[e,t]):(this.left=e,this.right=t,this.height=e.height+t.height,this.outdated=e.outdated||t.outdated,this.size=e.size+t.size,this.length=e.length+this.break+t.length,this)}updateHeight(e,t=0,i=!1,n){let{left:s,right:r}=this,o=t+s.length+this.break,a=null;return n&&n.from<=t+s.length&&n.more?a=s=s.updateHeight(e,t,i,n):s.updateHeight(e,t,i),n&&n.from<=o+r.length&&n.more?a=r=r.updateHeight(e,o,i,n):r.updateHeight(e,o,i),a?this.balanced(s,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function Jn(e,t){let i,n;null==e[t]&&(i=e[t-1])instanceof Zn&&(n=e[t+1])instanceof Zn&&e.splice(t-1,3,new Zn(i.length+1+n.length))}class es{constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,t){if(this.lineStart>-1){let e=Math.min(t,this.lineEnd),i=this.nodes[this.nodes.length-1];i instanceof Gn?i.length+=e-this.pos:(e>this.pos||!this.isCovered)&&this.nodes.push(new Gn(e-this.pos,-1)),this.writtenTo=e,t>e&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=t}point(e,t,i){if(e=5)&&this.addLineDeco(n,s,r)}else t>e&&this.span(e,t);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:t}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=t,this.writtenToe&&this.nodes.push(new Gn(this.pos-e,-1)),this.writtenTo=this.pos}blankContent(e,t){let i=new Zn(t-e);return this.oracle.doc.lineAt(e).to==t&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof Gn)return e;let t=new Gn(0,-1);return this.nodes.push(t),t}addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,t&&t.endSide>0&&(this.covering=e)}addLineDeco(e,t,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,e),n.breaks+=t,this.writtenTo=this.pos=this.pos+i}finish(e){let t=0==this.nodes.length?null:this.nodes[this.nodes.length-1];!(this.lineStart>-1)||t instanceof Gn||this.isCovered?(this.writtenToi.clientHeight||i.scrollWidth>i.clientWidth)&&"visible"!=n.overflow){let n=i.getBoundingClientRect();r=Math.max(r,n.left),o=Math.min(o,n.right),a=Math.max(a,n.top),l=t==e.parentNode?n.bottom:Math.min(l,n.bottom)}t="absolute"==n.position||"fixed"==n.position?i.offsetParent:i.parentNode}else{if(11!=t.nodeType)break;t=t.host}return{left:r-i.left,right:Math.max(r,o)-i.left,top:a-(i.top+t),bottom:Math.max(a,l)-(i.top+t)}}function ns(e,t){let i=e.getBoundingClientRect();return{left:0,right:i.right-i.left,top:t,bottom:i.bottom-(i.top+t)}}class ss{constructor(e,t,i){this.from=e,this.to=t,this.size=i}static same(e,t){if(e.length!=t.length)return!1;for(let i=0;i"function"!=typeof e&&"cm-lineWrapping"==e.class));this.heightOracle=new Wn(i),this.stateDeco=t.facet(xi).filter((e=>"function"!=typeof e)),this.heightMap=Xn.empty().applyChanges(this.stateDeco,e.empty,this.heightOracle.setDoc(t.doc),[new Ei(0,0,0,t.doc.length)]),this.viewport=this.getViewport(0,null),this.updateViewportLines(),this.updateForViewport(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=Yt.set(this.lineGaps.map((e=>e.draw(this,!1)))),this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;for(let i=0;i<=1;i++){let n=i?t.head:t.anchor;if(!e.some((({from:e,to:t})=>n>=e&&n<=t))){let{from:t,to:i}=this.lineBlockAt(n);e.push(new as(t,i))}}this.viewports=e.sort(((e,t)=>e.from-t.from)),this.scaler=this.heightMap.height<=7e6?ds:new us(this.heightOracle,this.heightMap,this.viewports)}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,(e=>{this.viewportLines.push(1==this.scaler.scale?e:ps(e,this.scaler))}))}update(e,t=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=this.state.facet(xi).filter((e=>"function"!=typeof e));let n=e.changedRanges,s=Ei.extendWithRanges(n,function(e,t,i){let n=new ts;return Se.compare(e,t,i,n,0),n.changes}(i,this.stateDeco,e?e.changes:S.empty(this.state.doc.length))),r=this.heightMap.height,o=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),s),this.heightMap.height!=r&&(e.flags|=2),o?(this.scrollAnchorPos=e.changes.mapPos(o.from,-1),this.scrollAnchorHeight=o.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let a=s.length?this.mapViewport(this.viewport,e.changes):this.viewport;(t&&(t.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,t));let l=!e.changes.empty||2&e.flags||a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,this.updateForViewport(),l&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(),t&&(this.scrollTarget=t),!this.mustEnforceCursorAssoc&&e.selectionSet&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(ui)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let i=t.contentDOM,n=window.getComputedStyle(i),s=this.heightOracle,r=n.whiteSpace;this.defaultTextDirection="rtl"==n.direction?Ri.RTL:Ri.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),a=i.getBoundingClientRect(),l=o||this.mustMeasureContent||this.contentDOMHeight!=a.height;this.contentDOMHeight=a.height,this.mustMeasureContent=!1;let h=0,c=0;if(a.width&&a.height){let e=a.width/i.offsetWidth,t=a.height/i.offsetHeight;(e>.995&&e<1.005||!isFinite(e)||Math.abs(a.width-i.offsetWidth)<1)&&(e=1),(t>.995&&t<1.005||!isFinite(t)||Math.abs(a.height-i.offsetHeight)<1)&&(t=1),this.scaleX==e&&this.scaleY==t||(this.scaleX=e,this.scaleY=t,h|=8,o=l=!0)}let d=(parseInt(n.paddingTop)||0)*this.scaleY,u=(parseInt(n.paddingBottom)||0)*this.scaleY;this.paddingTop==d&&this.paddingBottom==u||(this.paddingTop=d,this.paddingBottom=u,h|=10),this.editorWidth!=t.scrollDOM.clientWidth&&(s.lineWrapping&&(l=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=8);let p=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=p&&(this.scrollAnchorHeight=-1,this.scrollTop=p),this.scrolledToBottom=pt(t.scrollDOM);let f=(this.printing?ns:is)(i,this.paddingTop),m=f.top-this.pixelViewport.top,g=f.bottom-this.pixelViewport.bottom;this.pixelViewport=f;let v=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(v!=this.inView&&(this.inView=v,v&&(l=!0)),!this.inView&&!this.scrollTarget)return 0;let O=a.width;if(this.contentDOMWidth==O&&this.editorHeight==t.scrollDOM.clientHeight||(this.contentDOMWidth=a.width,this.editorHeight=t.scrollDOM.clientHeight,h|=8),l){let i=t.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(i)&&(o=!0),o||s.lineWrapping&&Math.abs(O-this.contentDOMWidth)>s.charWidth){let{lineHeight:e,charWidth:n,textHeight:a}=t.docView.measureTextSize();o=e>0&&s.refresh(r,e,n,a,O/n,i),o&&(t.docView.minWidth=0,h|=8)}m>0&&g>0?c=Math.max(m,g):m<0&&g<0&&(c=Math.min(m,g)),s.heightChanged=!1;for(let n of this.viewports){let r=n.from==this.viewport.from?i:t.docView.measureVisibleLineHeights(n);this.heightMap=(o?Xn.empty().applyChanges(this.stateDeco,e.empty,this.heightOracle,[new Ei(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new Vn(n.from,r))}s.heightChanged&&(h|=2)}let b=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return b&&(this.viewport=this.getViewport(c,this.scrollTarget)),this.updateForViewport(),(2&h||b)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,t){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),n=this.heightMap,s=this.heightOracle,{visibleTop:r,visibleBottom:o}=this,a=new as(n.lineAt(r-1e3*i,Fn.ByHeight,s,0,0).from,n.lineAt(o+1e3*(1-i),Fn.ByHeight,s,0,0).to);if(t){let{head:e}=t.range;if(ea.to){let i,r=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),o=n.lineAt(e,Fn.ByPos,s,0,0);i="center"==t.y?(o.top+o.bottom)/2-r/2:"start"==t.y||"nearest"==t.y&&e=o+Math.max(10,Math.min(i,250)))&&n>r-2e3&&s>1,r=n<<1;if(this.defaultTextDirection!=Ri.LTR&&!i)return[];let o=[],a=(n,r,l,h)=>{if(r-nn&&ee.from>=l.from&&e.to<=l.to&&Math.abs(e.from-n)e.fromt))));if(!u){if(re.from<=r&&e.to>=r))){let e=t.moveToLineBoundary(R.cursor(r),!1,!0).head;e>n&&(r=e)}u=new ss(n,r,this.gapSize(l,n,r,h))}o.push(u)};for(let e of this.viewportLines){if(e.lengthe.from&&a(e.from,s,e,t),oe.draw(this,this.heightOracle.lineWrapping)))))}computeVisibleRanges(){let e=this.stateDeco;this.lineGaps.length&&(e=e.concat(this.lineGapDeco));let t=[];Se.spans(e,this.viewport.from,this.viewport.to,{span(e,i){t.push({from:e,to:i})},point(){}},20);let i=t.length!=this.visibleRanges.length||this.visibleRanges.some(((e,i)=>e.from!=t[i].from||e.to!=t[i].to));return this.visibleRanges=t,i?4:0}lineBlockAt(e){return e>=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find((t=>t.from<=e&&t.to>=e))||ps(this.heightMap.lineAt(e,Fn.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return ps(this.heightMap.lineAt(this.scaler.fromDOM(e),Fn.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+8);return t.from>=this.viewport.from||this.viewportLines[0].top-e>200?t:this.viewportLines[0]}elementAtHeight(e){return ps(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class as{constructor(e,t){this.from=e,this.to=t}}function ls(e,t,i){let n=[],s=e,r=0;return Se.spans(i,e,t,{span(){},point(e,t){e>s&&(n.push({from:s,to:e}),r+=e-s),s=t}},20),s=1)return t[t.length-1].to;let n=Math.floor(e*i);for(let e=0;;e++){let{from:i,to:s}=t[e],r=s-i;if(n<=r)return i+n;n-=r}}function cs(e,t){let i=0;for(let{from:n,to:s}of e.ranges){if(t<=s){i+=t-n;break}i+=s-n}return i/e.total}const ds={toDOM:e=>e,fromDOM:e=>e,scale:1};class us{constructor(e,t,i){let n=0,s=0,r=0;this.viewports=i.map((({from:i,to:s})=>{let r=t.lineAt(i,Fn.ByPos,e,0,0).top,o=t.lineAt(s,Fn.ByPos,e,0,0).bottom;return n+=o-r,{from:i,to:s,top:r,bottom:o,domTop:0,domBottom:0}})),this.scale=(7e6-n)/(t.height-n);for(let e of this.viewports)e.domTop=r+(e.top-s)*this.scale,r=e.domBottom=e.domTop+(e.bottom-e.top),s=e.bottom}toDOM(e){for(let t=0,i=0,n=0;;t++){let s=tps(e,t))):e._content)}const fs=q.define({combine:e=>e.join(" ")}),ms=q.define({combine:e=>e.indexOf(!0)>-1}),gs=ze.newName(),vs=ze.newName(),Os=ze.newName(),bs={"&light":"."+vs,"&dark":"."+Os};function _s(e,t,i){return new ze(t,{finish:t=>/&/.test(t)?t.replace(/&\w*/,(t=>{if("&"==t)return e;if(!i||!i[t])throw new RangeError(`Unsupported selector: ${t}`);return i[t]})):e+" "+t})}const ys=_s("."+gs,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:'url(\'data:image/svg+xml,\')',backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},bs),ws="￿";class xs{constructor(e,t){this.points=e,this.text="",this.lineSeparator=t.facet(Oe.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=ws}readRange(e,t){if(!e)return this;let i=e.parentNode;for(let n=e;;){this.findPointBefore(i,n);let e=this.text.length;this.readNode(n);let s=n.nextSibling;if(s==t)break;let r=gt.get(n),o=gt.get(s);(r&&o?r.breakAfter:(r?r.breakAfter:ks(n))||ks(s)&&("BR"!=n.nodeName||n.cmIgnore)&&this.text.length>e)&&this.lineBreak(),n=s}return this.findPointBefore(i,t),this}readTextNode(e){let t=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,t.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let s,r=-1,o=1;if(this.lineSeparator?(r=t.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(s=n.exec(t))&&(r=s.index,o=s[0].length),this.append(t.slice(i,r<0?t.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let t of this.points)t.node==e&&t.pos>this.text.length&&(t.pos-=o-1);i=r+o}}readNode(e){if(e.cmIgnore)return;let t=gt.get(e),i=t&&t.overrideDOMText;if(null!=i){this.findPointInside(e,i.length);for(let e=i.iter();!e.next().done;)e.lineBreak?this.lineBreak():this.append(e.value)}else 3==e.nodeType?this.readTextNode(e):"BR"==e.nodeName?e.nextSibling&&this.lineBreak():1==e.nodeType&&this.readRange(e.firstChild,null)}findPointBefore(e,t){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==t&&(i.pos=this.text.length)}findPointInside(e,t){for(let i of this.points)(3==e.nodeType?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(Ss(e,i.node,i.offset)?t:0))}}function Ss(e,t,i){for(;;){if(!t||i-1)this.newSel=null;else if(t>-1&&(this.bounds=e.docView.domBoundsAround(t,i,0))){let t=s||r?[]:function(e){let t=[];if(e.root.activeElement!=e.contentDOM)return t;let{anchorNode:i,anchorOffset:n,focusNode:s,focusOffset:r}=e.observer.selectionRange;return i&&(t.push(new Ts(i,n)),s==i&&r==n||t.push(new Ts(s,r))),t}(e),i=new xs(t,e.state);i.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=i.text,this.newSel=function(e,t){if(0==e.length)return null;let i=e[0].pos,n=2==e.length?e[1].pos:i;return i>-1&&n>-1?R.single(i+t,n+t):null}(t,this.bounds.from)}else{let t=e.observer.selectionRange,i=s&&s.node==t.focusNode&&s.offset==t.focusOffset||!Ze(e.contentDOM,t.focusNode)?e.state.selection.main.head:e.docView.posFromDOM(t.focusNode,t.focusOffset),n=r&&r.node==t.anchorNode&&r.offset==t.anchorOffset||!Ze(e.contentDOM,t.anchorNode)?e.state.selection.main.anchor:e.docView.posFromDOM(t.anchorNode,t.anchorOffset);this.newSel=R.single(n,i)}}}function Ps(t,i){let n,{newSel:s}=i,r=t.state.selection.main,o=t.inputState.lastKeyTime>Date.now()-100?t.inputState.lastKeyCode:-1;if(i.bounds){let{from:s,to:a}=i.bounds,l=r.from,h=null;(8===o||Rt.android&&i.text.length0&&a>0&&e.charCodeAt(o-1)==t.charCodeAt(a-1);)o--,a--;return"end"==n&&(i-=o+Math.max(0,r-Math.min(o,a))-r),o=o?r-i:0,a=r+(a-o),o=r):a=a?r-i:0,o=r+(o-a),a=r),{from:r,toA:o,toB:a}}(t.state.doc.sliceString(s,a,ws),i.text,l-s,h);c&&(Rt.chrome&&13==o&&c.toB==c.from+2&&i.text.slice(c.from,c.toB)==ws+ws&&c.toB--,n={from:s+c.from,to:s+c.toA,insert:e.of(i.text.slice(c.from,c.toB).split(ws))})}else s&&(!t.hasFocus&&t.state.facet(gi)||s.main.eq(r))&&(s=null);if(!n&&!s)return!1;if(!n&&i.typeOver&&!r.empty&&s&&s.main.empty?n={from:r.from,to:r.to,insert:t.state.doc.slice(r.from,r.to)}:n&&n.from>=r.from&&n.to<=r.to&&(n.from!=r.from||n.to!=r.to)&&r.to-r.from-(n.to-n.from)<=4?n={from:r.from,to:r.to,insert:t.state.doc.slice(r.from,n.from).append(n.insert).append(t.state.doc.slice(n.to,r.to))}:(Rt.mac||Rt.android)&&n&&n.from==n.to&&n.from==r.head-1&&/^\. ?$/.test(n.insert.toString())&&"off"==t.contentDOM.getAttribute("autocorrect")?(s&&2==n.insert.length&&(s=R.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:e.of([" "])}):Rt.chrome&&n&&n.from==n.to&&n.from==r.head&&"\n "==n.insert.toString()&&t.lineWrapping&&(s&&(s=R.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:e.of([" "])}),n){if(Rt.ios&&t.inputState.flushIOSKey())return!0;if(Rt.android&&(n.from==r.from&&n.to==r.to&&1==n.insert.length&&2==n.insert.lines&&dt(t.contentDOM,"Enter",13)||(n.from==r.from-1&&n.to==r.to&&0==n.insert.length||8==o&&n.insert.lengthr.head)&&dt(t.contentDOM,"Backspace",8)||n.from==r.from&&n.to==r.to+1&&0==n.insert.length&&dt(t.contentDOM,"Delete",46)))return!0;let e,i=n.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let a=()=>e||(e=function(e,t,i){let n,s=e.state,r=s.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!i||i.main.empty&&i.main.from==t.from+t.insert.length)&&e.inputState.composing<0){let i=r.fromt.to?s.sliceDoc(t.to,r.to):"";n=s.replaceSelection(e.state.toText(i+t.insert.sliceString(0,void 0,e.state.lineBreak)+o))}else{let o=s.changes(t),a=i&&i.main.to<=o.newLength?i.main:void 0;if(s.selection.ranges.length>1&&e.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let l,h=e.state.sliceDoc(t.from,t.to),c=i&&Zi(e,i.main.head);if(c){let e=t.insert.length-(t.to-t.from);l={from:c.from,to:c.to-e}}else l=e.state.doc.lineAt(r.head);let d=r.to-t.to,u=r.to-r.from;n=s.changeByRange((i=>{if(i.from==r.from&&i.to==r.to)return{changes:o,range:a||i.map(o)};let n=i.to-d,c=n-h.length;if(i.to-i.from!=u||e.state.sliceDoc(c,n)!=h||i.to>=l.from&&i.from<=l.to)return{range:i};let p=s.changes({from:c,to:n,insert:t.insert}),f=i.to-r.to;return{changes:p,range:a?R.range(Math.max(0,a.anchor+f),Math.max(0,a.head+f)):i.map(p)}}))}else n={changes:o,selection:a&&s.selection.replaceRange(a)}}let o="input.type";return(e.composing||e.inputState.compositionPendingChange&&e.inputState.compositionEndedAt>Date.now()-50)&&(e.inputState.compositionPendingChange=!1,o+=".compose",e.inputState.compositionFirstChange&&(o+=".start",e.inputState.compositionFirstChange=!1)),s.update(n,{userEvent:o,scrollIntoView:!0})}(t,n,s));return t.state.facet(hi).some((e=>e(t,n.from,n.to,i,a)))||t.dispatch(a()),!0}if(s&&!s.main.eq(r)){let e=!1,i="select";return t.inputState.lastSelectionTime>Date.now()-50&&("select"==t.inputState.lastSelectionOrigin&&(e=!0),i=t.inputState.lastSelectionOrigin),t.dispatch({selection:s,scrollIntoView:e,userEvent:i}),!0}return!1}const Ms={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Es=Rt.ie&&Rt.ie_version<=11;class As{constructor(e){this.view=e,this.active=!1,this.selectionRange=new ot,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver((t=>{for(let e of t)this.queue.push(e);(Rt.ie&&Rt.ie_version<=11||Rt.ios&&e.composing)&&t.some((e=>"childList"==e.type&&e.removedNodes.length||"characterData"==e.type&&e.oldValue.length>e.target.nodeValue.length))?this.flushSoon():this.flush()})),Es&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),"function"==typeof ResizeObserver&&(this.resizeScroll=new ResizeObserver((()=>{var e;(null===(e=this.view.docView)||void 0===e?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))}),{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver((e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))}),{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout((()=>{this.resizeTimeout=-1,this.view.requestMeasure()}),50))}onPrint(){this.view.viewState.printing=!0,this.view.measure(),setTimeout((()=>{this.view.viewState.printing=!1,this.view.requestMeasure()}),500)}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some(((t,i)=>t!=e[i])))){this.gapIntersection.disconnect();for(let t of e)this.gapIntersection.observe(t);this.gaps=e}}onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(gi)?i.root.activeElement!=this.dom:!Ke(i.dom,n))return;let s=n.anchorNode&&i.docView.nearest(n.anchorNode);s&&s.ignoreEvent(e)?t||(this.selectionChanged=!1):(Rt.ie&&Rt.ie_version<=11||Rt.android&&Rt.chrome)&&!i.state.selection.main.empty&&n.focusNode&&et(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,t=Rt.safari&&11==e.root.nodeType&&function(e){let t=e.activeElement;for(;t&&t.shadowRoot;)t=t.shadowRoot.activeElement;return t}(this.dom.ownerDocument)==this.dom&&function(e){let t=null;function i(e){e.preventDefault(),e.stopImmediatePropagation(),t=e.getTargetRanges()[0]}if(e.contentDOM.addEventListener("beforeinput",i,!0),e.dom.ownerDocument.execCommand("indent"),e.contentDOM.removeEventListener("beforeinput",i,!0),!t)return null;let n=t.startContainer,s=t.startOffset,r=t.endContainer,o=t.endOffset,a=e.docView.domAtPos(e.state.selection.main.anchor);return et(a.node,a.offset,r,o)&&([n,s,r,o]=[r,o,n,s]),{anchorNode:n,anchorOffset:s,focusNode:r,focusOffset:o}}(this.view)||Ge(e.root);if(!t||this.selectionRange.eq(t))return!1;let i=Ke(this.dom,t);return i&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let e=this.delayedAndroidKey;e&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=e.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&e.force&&dt(this.dom,e.key,e.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(e)}this.delayedAndroidKey&&"Enter"!=e||(this.delayedAndroidKey={key:e,keyCode:t,force:this.lastChange{this.delayedFlush=-1,this.flush()})))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let t=-1,i=-1,n=!1;for(let s of e){let e=this.readMutation(s);e&&(e.typeOver&&(n=!0),-1==t?({from:t,to:i}=e):(t=Math.min(e.from,t),i=Math.max(e.to,i)))}return{from:t,to:i,typeOver:n}}readChange(){let{from:e,to:t,typeOver:i}=this.processRecords(),n=this.selectionChanged&&Ke(this.dom,this.selectionRange);if(e<0&&!n)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let s=new Cs(this.view,e,t,i);return this.view.docView.domChanged={newSel:s.newSel?s.newSel.main:null},s}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let t=this.readChange();if(!t)return this.view.requestMeasure(),!1;let i=this.view.state,n=Ps(this.view,t);return this.view.state==i&&this.view.update([]),n}readMutation(e){let t=this.view.docView.nearest(e.target);if(!t||t.ignoreMutation(e))return null;if(t.markDirty("attributes"==e.type),"attributes"==e.type&&(t.flags|=4),"childList"==e.type){let i=Rs(t,e.previousSibling||e.target.previousSibling,-1),n=Rs(t,e.nextSibling||e.target.nextSibling,1);return{from:i?t.posAfter(i):t.posAtStart,to:n?t.posBefore(n):t.posAtEnd,typeOver:!1}}return"characterData"==e.type?{from:t.posAtStart,to:t.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}destroy(){var e,t,i;this.stop(),null===(e=this.intersection)||void 0===e||e.disconnect(),null===(t=this.gapIntersection)||void 0===t||t.disconnect(),null===(i=this.resizeScroll)||void 0===i||i.disconnect();for(let e of this.scrollTargets)e.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey)}}function Rs(e,t,i){for(;t;){let n=gt.get(t);if(n&&n.parent==e)return n;let s=t.parentNode;t=s!=e.dom?s:i>0?t.nextSibling:t.previousSibling}return null}class Ds{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.style.cssText="position: fixed; top: -10000px",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM);let{dispatch:t}=e;this.dispatchTransactions=e.dispatchTransactions||t&&(e=>e.forEach((e=>t(e,this))))||(e=>this.update(e)),this.dispatch=this.dispatch.bind(this),this._root=e.root||function(e){for(;e;){if(e&&(9==e.nodeType||11==e.nodeType&&e.host))return e;e=e.assignedSlot||e.parentNode}return null}(e.parent)||document,this.viewState=new os(e.state||Oe.create(e)),this.plugins=this.state.facet(Oi).map((e=>new _i(e)));for(let e of this.plugins)e.update(this);this.observer=new As(this),this.inputState=new fn(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Yi(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),e.parent&&e.parent.appendChild(this.dom)}dispatch(...e){let t=1==e.length&&e[0]instanceof le?e:1==e.length&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(t,this)}update(e){if(0!=this.updateState)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t,i=!1,n=!1,s=this.state;for(let t of e){if(t.startState!=s)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");s=t.state}if(this.destroyed)return void(this.viewState.state=s);let r=this.hasFocus,o=0,a=null;e.some((e=>e.annotation(Bn)))?(this.inputState.notifiedFocused=r,o=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,a=$n(s,r),a||(o=1));let l=this.observer.delayedAndroidKey,h=null;if(l?(this.observer.clearDelayedAndroidKey(),h=this.observer.readChange(),(h&&!this.state.doc.eq(s.doc)||!this.state.selection.eq(s.selection))&&(h=null)):this.observer.clear(),s.facet(Oe.phrases)!=this.state.facet(Oe.phrases))return this.setState(s);t=Ai.create(this,s,e),t.flags|=o;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let t of e){if(c&&(c=c.map(t.changes)),t.scrollIntoView){let{main:e}=t.state.selection;c=new pi(e.empty?e:R.cursor(e.head,e.head>e.anchor?-1:1))}for(let e of t.effects)e.is(fi)&&(c=e.value)}this.viewState.update(t,c),this.bidiCache=Ls.update(this.bidiCache,t.changes),t.empty||(this.updatePlugins(t),this.inputState.update(t)),i=this.docView.update(t),this.state.facet(Mi)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(i,e.some((e=>e.isUserEvent("select.pointer"))))}finally{this.updateState=0}if(t.startState.facet(fs)!=t.state.facet(fs)&&(this.viewState.mustMeasureContent=!0),(i||n||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),!t.empty)for(let e of this.state.facet(li))e(t);(a||h)&&Promise.resolve().then((()=>{a&&this.state==a.startState&&this.dispatch(a),h&&!Ps(this,h)&&l.force&&dt(this.contentDOM,l.key,l.keyCode)}))}setState(e){if(0!=this.updateState)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed)return void(this.viewState.state=e);this.updateState=2;let t=this.hasFocus;try{for(let e of this.plugins)e.destroy(this);this.viewState=new os(e),this.plugins=e.facet(Oi).map((e=>new _i(e))),this.pluginMap.clear();for(let e of this.plugins)e.update(this);this.docView=new Yi(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(e){let t=e.startState.facet(Oi),i=e.state.facet(Oi);if(t!=i){let n=[];for(let s of i){let i=t.indexOf(s);if(i<0)n.push(new _i(s));else{let t=this.plugins[i];t.mustUpdate=e,n.push(t)}}for(let t of this.plugins)t.mustUpdate!=e&&t.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let t of this.plugins)t.mustUpdate=e;for(let e=0;e-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey)return this.measureScheduled=-1,void this.requestMeasure();this.measureScheduled=0,e&&this.observer.forceFlush();let t=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:s,scrollAnchorHeight:r}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let e=0;;e++){if(r<0)if(pt(i))s=-1,r=this.viewState.heightMap.height;else{let e=this.viewState.scrollAnchorAt(n);s=e.from,r=e.top}this.updateState=1;let o=this.viewState.measure(this);if(!o&&!this.measureRequests.length&&null==this.viewState.scrollTarget)break;if(e>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let a=[];4&o||([this.measureRequests,a]=[a,this.measureRequests]);let l=a.map((e=>{try{return e.read(this)}catch(e){return mi(this.state,e),qs}})),h=Ai.create(this,this.state,[]),c=!1;h.flags|=o,t?t.flags|=o:t=h,this.updateState=2,h.empty||(this.updatePlugins(h),this.inputState.update(h),this.updateAttrs(),c=this.docView.update(h));for(let e=0;e1||e<-1){n+=e,i.scrollTop=n/this.scaleY,r=-1;continue}}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let e of this.state.facet(li))e(t)}get themeClasses(){return gs+" "+(this.state.facet(ms)?Os:vs)+" "+this.state.facet(fs)}updateAttrs(){let e=Ns(this,yi,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(gi)?"true":"false",class:"cm-content",style:`${Rt.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),Ns(this,wi,t);let i=this.observer.ignore((()=>{let i=Wt(this.contentDOM,this.contentAttrs,t),n=Wt(this.dom,this.editorAttrs,e);return i||n}));return this.editorAttrs=e,this.contentAttrs=t,i}showAnnouncements(e){let t=!0;for(let i of e)for(let e of i.effects)e.is(Ds.announce)&&(t&&(this.announceDOM.textContent=""),t=!1,this.announceDOM.appendChild(document.createElement("div")).textContent=e.value)}mountStyles(){this.styleModules=this.state.facet(Mi);let e=this.state.facet(Ds.cspNonce);ze.mount(this.root,this.styleModules.concat(ys).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(2==this.updateState)throw new Error("Reading the editor layout isn't allowed during an update");0==this.updateState&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame((()=>this.measure()))),e){if(this.measureRequests.indexOf(e)>-1)return;if(null!=e.key)for(let t=0;tt.spec==e))||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,t,i){return pn(this,e,dn(this,e,t,i))}moveByGroup(e,t){return pn(this,e,dn(this,e,t,(t=>function(e,t,i){let n=e.state.charCategorizer(t),s=n(i);return e=>{let t=n(e);return s==me.Space&&(s=t),s==t}}(this,e.head,t))))}moveToLineBoundary(e,t,i=!0){return function(e,t,i,n){let s=cn(e,t.head),r=n&&s.type==Xt.Text&&(e.lineWrapping||s.widgetLineBreaks)?e.coordsAtPos(t.assoc<0&&t.head>s.from?t.head-1:t.head):null;if(r){let t=e.dom.getBoundingClientRect(),n=e.textDirectionAt(s.from),o=e.posAtCoords({x:i==(n==Ri.LTR)?t.right-1:t.left+1,y:(r.top+r.bottom)/2});if(null!=o)return R.cursor(o,i?-1:1)}return R.cursor(i?s.to:s.from,i?-1:1)}(this,e,t,i)}moveVertically(e,t,i){return pn(this,e,function(e,t,i,n){let s=t.head,r=i?1:-1;if(s==(i?e.state.doc.length:0))return R.cursor(s,t.assoc);let o,a=t.goalColumn,l=e.contentDOM.getBoundingClientRect(),h=e.coordsAtPos(s,t.assoc||-1),c=e.documentTop;if(h)null==a&&(a=h.left-l.left),o=r<0?h.top:h.bottom;else{let t=e.viewState.lineBlockAt(s);null==a&&(a=Math.min(l.right-l.left,e.defaultCharacterWidth*(s-t.from))),o=(r<0?t.top:t.bottom)+c}let d=l.left+a,u=null!=n?n:e.viewState.heightOracle.textHeight>>1;for(let t=0;;t+=10){let i=o+(u+t)*r,n=ln(e,{x:d,y:i},!1,r);if(il.bottom||(r<0?ns)){let t=e.docView.coordsForChar(n),s=!t||i0)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(di)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>Is)return Fi(e.length);let t,i=this.textDirectionAt(e.from);for(let n of this.bidiCache)if(n.from==e.from&&n.dir==i&&(n.fresh||ji(n.isolates,t=Ti(this,e.from,e.to))))return n.order;t||(t=Ti(this,e.from,e.to));let n=function(e,t,i){if(!e)return[new zi(0,0,t==Ii?1:0)];if(t==Di&&!i.length&&!Qi.test(e))return Fi(e.length);if(i.length)for(;e.length>Wi.length;)Wi[Wi.length]=256;let n=[],s=t==Di?0:1;return Ui(e,s,s,i,0,e.length,n),n}(e.text,i,t);return this.bidiCache.push(new Ls(e.from,e.to,i,t,!0,n)),n}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||Rt.safari&&(null===(e=this.inputState)||void 0===e?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore((()=>{ht(this.contentDOM),this.docView.updateSelection()}))}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((9==e.nodeType?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,t={}){return fi.of(new pi("number"==typeof e?R.cursor(e):e,t.y,t.x,t.yMargin,t.xMargin))}static domEventHandlers(e){return bi.define((()=>({})),{eventHandlers:e})}static domEventObservers(e){return bi.define((()=>({})),{eventObservers:e})}static theme(e,t){let i=ze.newName(),n=[fs.of(i),Mi.of(_s(`.${i}`,e))];return t&&t.dark&&n.push(ms.of(!0)),n}static baseTheme(e){return V.lowest(Mi.of(_s("."+gs,e,bs)))}static findFromDOM(e){var t;let i=e.querySelector(".cm-content"),n=i&>.get(i)||gt.get(e);return(null===(t=null==n?void 0:n.rootView)||void 0===t?void 0:t.view)||null}}Ds.styleModule=Mi,Ds.inputHandler=hi,Ds.focusChangeEffect=ci,Ds.perLineTextDirection=di,Ds.exceptionSink=ai,Ds.updateListener=li,Ds.editable=gi,Ds.mouseSelectionStyle=oi,Ds.dragMovesSelection=ri,Ds.clickAddsSelectionRange=si,Ds.decorations=xi,Ds.atomicRanges=Si,Ds.bidiIsolatedRanges=ki,Ds.scrollMargins=Ci,Ds.darkTheme=ms,Ds.cspNonce=q.define({combine:e=>e.length?e[0]:""}),Ds.contentAttributes=wi,Ds.editorAttributes=yi,Ds.lineWrapping=Ds.contentAttributes.of({class:"cm-lineWrapping"}),Ds.announce=ae.define();const Is=4096,qs={};class Ls{constructor(e,t,i,n,s,r){this.from=e,this.to=t,this.dir=i,this.isolates=n,this.fresh=s,this.order=r}static update(e,t){if(t.empty&&!e.some((e=>e.fresh)))return e;let i=[],n=e.length?e[e.length-1].dir:Ri.LTR;for(let s=Math.max(0,e.length-10);s=0;s--){let t=n[s],r="function"==typeof t?t(e):t;r&&Qt(r,i)}return i}const Bs=Rt.mac?"mac":Rt.windows?"win":Rt.linux?"linux":"key";function $s(e,t,i){return t.altKey&&(e="Alt-"+e),t.ctrlKey&&(e="Ctrl-"+e),t.metaKey&&(e="Meta-"+e),!1!==i&&t.shiftKey&&(e="Shift-"+e),e}const Qs=V.default(Ds.domEventHandlers({keydown:(e,t)=>Fs(Ws(t.state),e,t,"editor")})),zs=q.define({enables:Qs}),js=new WeakMap;function Ws(e){let t=e.facet(zs),i=js.get(t);return i||js.set(t,i=function(e,t=Bs){let i=Object.create(null),n=Object.create(null),s=(e,t)=>{let i=n[e];if(null==i)n[e]=t;else if(i!=t)throw new Error("Key binding "+e+" is used both as a regular binding and as a multi-stroke prefix")},r=(e,n,r,o,a)=>{var l,h;let c=i[e]||(i[e]=Object.create(null)),d=n.split(/ (?!$)/).map((e=>function(e,t){const i=e.split(/-(?!$)/);let n,s,r,o,a=i[i.length-1];"Space"==a&&(a=" ");for(let e=0;e{let n=Vs={view:t,prefix:i,scope:e};return setTimeout((()=>{Vs==n&&(Vs=null)}),Us),!0}]})}let u=d.join(" ");s(u,!1);let p=c[u]||(c[u]={preventDefault:!1,stopPropagation:!1,run:(null===(h=null===(l=c._any)||void 0===l?void 0:l.run)||void 0===h?void 0:h.slice())||[]});r&&p.run.push(r),o&&(p.preventDefault=!0),a&&(p.stopPropagation=!0)};for(let n of e){let e=n.scope?n.scope.split(" "):["editor"];if(n.any)for(let t of e){let e=i[t]||(i[t]=Object.create(null));e._any||(e._any={preventDefault:!1,stopPropagation:!1,run:[]});for(let t in e)e[t].run.push(n.any)}let s=n[t]||n.key;if(s)for(let t of e)r(t,s,n.run,n.preventDefault,n.stopPropagation),n.shift&&r(t,"Shift-"+s,n.shift,n.preventDefault,n.stopPropagation)}return i}(t.reduce(((e,t)=>e.concat(t)),[]))),i}let Vs=null;const Us=4e3;function Fs(e,t,i,n){let s=function(e){var t=!(Fe&&e.metaKey&&e.shiftKey&&!e.ctrlKey&&!e.altKey||He&&e.shiftKey&&e.key&&1==e.key.length||"Unidentified"==e.key)&&e.key||(e.shiftKey?Ue:Ve)[e.keyCode]||e.key||"Unidentified";return"Esc"==t&&(t="Escape"),"Del"==t&&(t="Delete"),"Left"==t&&(t="ArrowLeft"),"Up"==t&&(t="ArrowUp"),"Right"==t&&(t="ArrowRight"),"Down"==t&&(t="ArrowDown"),t}(t),r=_(O(s,0))==s.length&&" "!=s,o="",a=!1,l=!1,h=!1;Vs&&Vs.view==i&&Vs.scope==n&&(o=Vs.prefix+" ",bn.indexOf(t.keyCode)<0&&(l=!0,Vs=null));let c,d,u=new Set,p=e=>{if(e){for(let n of e.run)if(!u.has(n)&&(u.add(n),n(i,t)))return e.stopPropagation&&(h=!0),!0;e.preventDefault&&(e.stopPropagation&&(h=!0),l=!0)}return!1},f=e[n];return f&&(p(f[o+$s(s,t,!r)])?a=!0:r&&(t.altKey||t.metaKey||t.ctrlKey)&&!(Rt.windows&&t.ctrlKey&&t.altKey)&&(c=Ve[t.keyCode])&&c!=s?(p(f[o+$s(c,t,!0)])||t.shiftKey&&(d=Ue[t.keyCode])!=s&&d!=c&&p(f[o+$s(d,t,!1)]))&&(a=!0):r&&t.shiftKey&&p(f[o+$s(s,t,!0)])&&(a=!0),!a&&p(f._any)&&(a=!0)),l&&(a=!0),a&&h&&t.stopPropagation(),a}class Hs{constructor(e,t,i,n,s){this.className=e,this.left=t,this.top=i,this.width=n,this.height=s}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,t){return t.className==this.className&&(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",null!=this.width&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,t,i){if(i.empty){let n=e.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let s=Xs(e);return[new Hs(t,n.left-s.left,n.top-s.top,null,n.bottom-n.top)]}return function(e,t,i){if(i.to<=e.viewport.from||i.from>=e.viewport.to)return[];let n=Math.max(i.from,e.viewport.from),s=Math.min(i.to,e.viewport.to),r=e.textDirection==Ri.LTR,o=e.contentDOM,a=o.getBoundingClientRect(),l=Xs(e),h=o.querySelector(".cm-line"),c=h&&window.getComputedStyle(h),d=a.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),u=a.right-(c?parseInt(c.paddingRight):0),p=cn(e,n),f=cn(e,s),m=p.type==Xt.Text?p:null,g=f.type==Xt.Text?f:null;if(m&&(e.lineWrapping||p.widgetLineBreaks)&&(m=Ys(e,n,m)),g&&(e.lineWrapping||f.widgetLineBreaks)&&(g=Ys(e,s,g)),m&&g&&m.from==g.from)return O(b(i.from,i.to,m));{let t=m?b(i.from,null,m):_(p,!1),n=g?b(null,i.to,g):_(f,!0),s=[];return(m||p).to<(g||f).from-(m&&g?1:0)||p.widgetLineBreaks>1&&t.bottom+e.defaultLineHeight/2h&&n.from=r)break;a>s&&l(Math.max(e,s),null==t&&e<=h,Math.min(a,r),null==i&&a>=c,o.dir)}if(s=n.to+1,s>=r)break}return 0==a.length&&l(h,null==t,c,null==i,e.textDirection),{top:s,bottom:o,horizontal:a}}function _(e,t){let i=a.top+(t?e.top:e.bottom);return{top:i,bottom:i,horizontal:[]}}}(e,t,i)}}function Xs(e){let t=e.scrollDOM.getBoundingClientRect();return{left:(e.textDirection==Ri.LTR?t.left:t.right-e.scrollDOM.clientWidth*e.scaleX)-e.scrollDOM.scrollLeft*e.scaleX,top:t.top-e.scrollDOM.scrollTop*e.scaleY}}function Ys(e,t,i){let n=R.cursor(t);return{from:Math.max(i.from,e.moveToLineBoundary(n,!1,!0).from),to:Math.min(i.to,e.moveToLineBoundary(n,!0,!0).from),type:Xt.Text}}class Gs{constructor(e,t){this.view=e,this.layer=t,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),t.above&&this.dom.classList.add("cm-layer-above"),t.class&&this.dom.classList.add(t.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),t.mount&&t.mount(this.dom,e)}update(e){e.startState.facet(Zs)!=e.state.facet(Zs)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}setOrder(e){let t=0,i=e.facet(Zs);for(;t{return i=e,n=this.drawn[t],!(i.constructor==n.constructor&&i.eq(n));var i,n}))){let t=this.dom.firstChild,i=0;for(let n of e)n.update&&t&&n.constructor&&this.drawn[i].constructor&&n.update(t,this.drawn[i])?(t=t.nextSibling,i++):this.dom.insertBefore(n.draw(),t);for(;t;){let e=t.nextSibling;t.remove(),t=e}this.drawn=e}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const Zs=q.define();function Ks(e){return[bi.define((t=>new Gs(t,e))),Zs.of(e)]}const Js=!Rt.ios,er=q.define({combine:e=>be(e,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(e,t)=>Math.min(e,t),drawRangeCursor:(e,t)=>e||t})});function tr(e={}){return[er.of(e),nr,rr,ar,ui.of(!0)]}function ir(e){return e.startState.facet(er)!=e.state.facet(er)}const nr=Ks({above:!0,markers(e){let{state:t}=e,i=t.facet(er),n=[];for(let s of t.selection.ranges){let r=s==t.selection.main;if(s.empty?!r||Js:i.drawRangeCursor){let t=r?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",i=s.empty?s:R.cursor(s.head,s.head>s.anchor?-1:1);for(let s of Hs.forRange(e,t,i))n.push(s)}}return n},update(e,t){e.transactions.some((e=>e.selection))&&(t.style.animationName="cm-blink"==t.style.animationName?"cm-blink2":"cm-blink");let i=ir(e);return i&&sr(e.state,t),e.docChanged||e.selectionSet||i},mount(e,t){sr(t.state,e)},class:"cm-cursorLayer"});function sr(e,t){t.style.animationDuration=e.facet(er).cursorBlinkRate+"ms"}const rr=Ks({above:!1,markers:e=>e.state.selection.ranges.map((t=>t.empty?[]:Hs.forRange(e,"cm-selectionBackground",t))).reduce(((e,t)=>e.concat(t))),update:(e,t)=>e.docChanged||e.selectionSet||e.viewportChanged||ir(e),class:"cm-selectionLayer"}),or={".cm-line":{"& ::selection":{backgroundColor:"transparent !important"},"&::selection":{backgroundColor:"transparent !important"}}};Js&&(or[".cm-line"].caretColor="transparent !important");const ar=V.highest(Ds.theme(or)),lr=ae.define({map:(e,t)=>null==e?null:t.mapPos(e)}),hr=j.define({create:()=>null,update:(e,t)=>(null!=e&&(e=t.changes.mapPos(e)),t.effects.reduce(((e,t)=>t.is(lr)?t.value:e),e))}),cr=bi.fromClass(class{constructor(e){this.view=e,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(e){var t;let i=e.state.field(hr);null==i?null!=this.cursor&&(null===(t=this.cursor)||void 0===t||t.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(e.startState.field(hr)!=i||e.docChanged||e.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:e}=this,t=e.state.field(hr),i=null!=t&&e.coordsAtPos(t);if(!i)return null;let n=e.scrollDOM.getBoundingClientRect();return{left:i.left-n.left+e.scrollDOM.scrollLeft*e.scaleX,top:i.top-n.top+e.scrollDOM.scrollTop*e.scaleY,height:i.bottom-i.top}}drawCursor(e){if(this.cursor){let{scaleX:t,scaleY:i}=this.view;e?(this.cursor.style.left=e.left/t+"px",this.cursor.style.top=e.top/i+"px",this.cursor.style.height=e.height/i+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(e){this.view.state.field(hr)!=e&&this.view.dispatch({effects:lr.of(e)})}},{eventObservers:{dragover(e){this.setDropPos(this.view.posAtCoords({x:e.clientX,y:e.clientY}))},dragleave(e){e.target!=this.view.contentDOM&&this.view.contentDOM.contains(e.relatedTarget)||this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function dr(e,t,i,n,s){t.lastIndex=0;for(let r,o=e.iterRange(i,n),a=i;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=t.exec(o.value);)s(a+r.index,r)}class ur{constructor(e){const{regexp:t,decoration:i,decorate:n,boundary:s,maxLength:r=1e3}=e;if(!t.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=t,n)this.addMatch=(e,t,i,s)=>n(s,i,i+e[0].length,e,t);else if("function"==typeof i)this.addMatch=(e,t,n,s)=>{let r=i(e,t,n);r&&s(n,n+e[0].length,r)};else{if(!i)throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.addMatch=(e,t,n,s)=>s(n,n+e[0].length,i)}this.boundary=s,this.maxLength=r}createDeco(e){let t=new ke,i=t.add.bind(t);for(let{from:t,to:n}of function(e,t){let i=e.visibleRanges;if(1==i.length&&i[0].from==e.viewport.from&&i[0].to==e.viewport.to)return i;let n=[];for(let{from:s,to:r}of i)s=Math.max(e.state.doc.lineAt(s).from,s-t),r=Math.min(e.state.doc.lineAt(r).to,r+t),n.length&&n[n.length-1].to>=s?n[n.length-1].to=r:n.push({from:s,to:r});return n}(e,this.maxLength))dr(e.state.doc,this.regexp,t,n,((t,n)=>this.addMatch(n,e,t,i)));return t.finish()}updateDeco(e,t){let i=1e9,n=-1;return e.docChanged&&e.changes.iterChanges(((t,s,r,o)=>{o>e.view.viewport.from&&r1e3?this.createDeco(e.view):n>-1?this.updateRange(e.view,t.map(e.changes),i,n):t}updateRange(e,t,i,n){for(let s of e.visibleRanges){let r=Math.max(s.from,i),o=Math.min(s.to,n);if(o>r){let i=e.state.doc.lineAt(r),n=i.toi.from;r--)if(this.boundary.test(i.text[r-1-i.from])){a=r;break}for(;oc.push(i.range(e,t));if(i==n)for(this.regexp.lastIndex=a-i.from;(h=this.regexp.exec(i.text))&&h.indexthis.addMatch(i,e,t,d)));t=t.update({filterFrom:a,filterTo:l,filter:(e,t)=>el,add:c})}}return t}}const pr=null!=/x/.unicode?"gu":"g",fr=new RegExp("[\0-\b\n--Ÿ­؜​‎‏\u2028\u2029‭‮⁦⁧⁩\ufeff-]",pr),mr={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"};let gr=null;const vr=q.define({combine(e){let t=be(e,{render:null,specialChars:fr,addSpecialChars:null});return(t.replaceTabs=!function(){var e;if(null==gr&&"undefined"!=typeof document&&document.body){let t=document.body.style;gr=null!=(null!==(e=t.tabSize)&&void 0!==e?e:t.MozTabSize)}return gr||!1}())&&(t.specialChars=new RegExp("\t|"+t.specialChars.source,pr)),t.addSpecialChars&&(t.specialChars=new RegExp(t.specialChars.source+"|"+t.addSpecialChars.source,pr)),t}});function Or(e={}){return[vr.of(e),br||(br=bi.fromClass(class{constructor(e){this.view=e,this.decorations=Yt.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(e.state.facet(vr)),this.decorations=this.decorator.createDeco(e)}makeDecorator(e){return new ur({regexp:e.specialChars,decoration:(t,i,n)=>{let{doc:s}=i.state,r=O(t[0],0);if(9==r){let e=s.lineAt(n),t=i.state.tabSize,r=Le(e.text,t,n-e.from);return Yt.replace({widget:new yr((t-r%t)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[r]||(this.decorationCache[r]=Yt.replace({widget:new _r(e,r)}))},boundary:e.replaceTabs?void 0:/[^]/})}update(e){let t=e.state.facet(vr);e.startState.facet(vr)!=t?(this.decorator=this.makeDecorator(t),this.decorations=this.decorator.createDeco(e.view)):this.decorations=this.decorator.updateDeco(e,this.decorations)}},{decorations:e=>e.decorations}))]}let br=null;class _r extends Ht{constructor(e,t){super(),this.options=e,this.code=t}eq(e){return e.code==this.code}toDOM(e){let t=function(e){return e>=32?"•":10==e?"␤":String.fromCharCode(9216+e)}(this.code),i=e.state.phrase("Control character")+" "+(mr[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,t);if(n)return n;let s=document.createElement("span");return s.textContent=t,s.title=i,s.setAttribute("aria-label",i),s.className="cm-specialChar",s}ignoreEvent(){return!1}}class yr extends Ht{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent="\t",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}}const wr=Yt.line({class:"cm-activeLine"}),xr=bi.fromClass(class{constructor(e){this.decorations=this.getDeco(e)}update(e){(e.docChanged||e.selectionSet)&&(this.decorations=this.getDeco(e.view))}getDeco(e){let t=-1,i=[];for(let n of e.state.selection.ranges){let s=e.lineBlockAt(n.head);s.from>t&&(i.push(wr.range(s.from)),t=s.from)}return Yt.set(i)}},{decorations:e=>e.decorations}),Sr=2e3;function kr(e,t){let i=e.posAtCoords({x:t.clientX,y:t.clientY},!1),n=e.state.doc.lineAt(i),s=i-n.from,r=s>Sr?-1:s==n.length?function(e,t){let i=e.coordsAtPos(e.viewport.from);return i?Math.round(Math.abs((i.left-t)/e.defaultCharacterWidth)):-1}(e,t.clientX):Le(n.text,e.state.tabSize,i-n.from);return{line:n.number,col:r,off:s}}function Tr(e){let t=(null==e?void 0:e.eventFilter)||(e=>e.altKey&&0==e.button);return Ds.mouseSelectionStyle.of(((e,i)=>t(i)?function(e,t){let i=kr(e,t),n=e.state.selection;return i?{update(e){if(e.docChanged){let t=e.changes.mapPos(e.startState.doc.line(i.line).from),s=e.state.doc.lineAt(t);i={line:s.number,col:i.col,off:Math.min(i.off,s.length)},n=n.map(e.changes)}},get(t,s,r){let o=kr(e,t);if(!o)return n;let a=function(e,t,i){let n=Math.min(t.line,i.line),s=Math.max(t.line,i.line),r=[];if(t.off>Sr||i.off>Sr||t.col<0||i.col<0){let o=Math.min(t.off,i.off),a=Math.max(t.off,i.off);for(let t=n;t<=s;t++){let i=e.doc.line(t);i.length<=a&&r.push(R.range(i.from+o,i.to+a))}}else{let o=Math.min(t.col,i.col),a=Math.max(t.col,i.col);for(let t=n;t<=s;t++){let i=e.doc.line(t),n=Ne(i.text,o,e.tabSize,!0);if(n<0)r.push(R.cursor(i.to));else{let t=Ne(i.text,a,e.tabSize);r.push(R.range(i.from+n,i.from+t))}}}return r}(e.state,i,o);return a.length?r?R.create(a.concat(n.ranges)):R.create(a):n}}:null}(e,i):null))}const Cr={Alt:[18,e=>!!e.altKey],Control:[17,e=>!!e.ctrlKey],Shift:[16,e=>!!e.shiftKey],Meta:[91,e=>!!e.metaKey]},Pr={style:"cursor: crosshair"};function Mr(e={}){let[t,i]=Cr[e.key||"Alt"],n=bi.fromClass(class{constructor(e){this.view=e,this.isDown=!1}set(e){this.isDown!=e&&(this.isDown=e,this.view.update([]))}},{eventObservers:{keydown(e){this.set(e.keyCode==t||i(e))},keyup(e){e.keyCode!=t&&i(e)||this.set(!1)},mousemove(e){this.set(i(e))}}});return[n,Ds.contentAttributes.of((e=>{var t;return(null===(t=e.plugin(n))||void 0===t?void 0:t.isDown)?Pr:null}))]}const Er="-10000px";class Ar{constructor(e,t,i){this.facet=t,this.createTooltipView=i,this.input=e.state.facet(t),this.tooltips=this.input.filter((e=>e)),this.tooltipViews=this.tooltips.map(i)}update(e,t){var i;let n=e.state.facet(this.facet),s=n.filter((e=>e));if(n===this.input){for(let t of this.tooltipViews)t.update&&t.update(e);return!1}let r=[],o=t?[]:null;for(let i=0;it[i]=e)),t.length=o.length),this.input=n,this.tooltips=s,this.tooltipViews=r,!0}}function Rr(e){let{win:t}=e;return{top:0,left:0,bottom:t.innerHeight,right:t.innerWidth}}const Dr=q.define({combine:e=>{var t,i,n;return{position:Rt.ios?"absolute":(null===(t=e.find((e=>e.position)))||void 0===t?void 0:t.position)||"fixed",parent:(null===(i=e.find((e=>e.parent)))||void 0===i?void 0:i.parent)||null,tooltipSpace:(null===(n=e.find((e=>e.tooltipSpace)))||void 0===n?void 0:n.tooltipSpace)||Rr}}}),Ir=new WeakMap,qr=bi.fromClass(class{constructor(e){this.view=e,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let t=e.state.facet(Dr);this.position=t.position,this.parent=t.parent,this.classes=e.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.manager=new Ar(e,Br,(e=>this.createTooltip(e))),this.intersectionObserver="function"==typeof IntersectionObserver?new IntersectionObserver((e=>{Date.now()>this.lastTransaction-50&&e.length>0&&e[e.length-1].intersectionRatio<1&&this.measureSoon()}),{threshold:[1]}):null,this.observeIntersection(),e.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let e of this.manager.tooltipViews)this.intersectionObserver.observe(e.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout((()=>{this.measureTimeout=-1,this.maybeMeasure()}),50))}update(e){e.transactions.length&&(this.lastTransaction=Date.now());let t=this.manager.update(e,this.above);t&&this.observeIntersection();let i=t||e.geometryChanged,n=e.state.facet(Dr);if(n.position!=this.position&&!this.madeAbsolute){this.position=n.position;for(let e of this.manager.tooltipViews)e.dom.style.position=this.position;i=!0}if(n.parent!=this.parent){this.parent&&this.container.remove(),this.parent=n.parent,this.createContainer();for(let e of this.manager.tooltipViews)this.container.appendChild(e.dom);i=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);i&&this.maybeMeasure()}createTooltip(e){let t=e.create(this.view);if(t.dom.classList.add("cm-tooltip"),e.arrow&&!t.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let e=document.createElement("div");e.className="cm-tooltip-arrow",t.dom.appendChild(e)}return t.dom.style.position=this.position,t.dom.style.top=Er,t.dom.style.left="0px",this.container.appendChild(t.dom),t.mount&&t.mount(this.view),t}destroy(){var e,t;this.view.win.removeEventListener("resize",this.measureSoon);for(let t of this.manager.tooltipViews)t.dom.remove(),null===(e=t.destroy)||void 0===e||e.call(t);this.parent&&this.container.remove(),null===(t=this.intersectionObserver)||void 0===t||t.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let e=this.view.dom.getBoundingClientRect(),t=1,i=1,n=!1;if("fixed"==this.position&&this.manager.tooltipViews.length){let{dom:e}=this.manager.tooltipViews[0];if(Rt.gecko)n=e.offsetParent!=this.container.ownerDocument.body;else if(1!=this.view.scaleX||1!=this.view.scaleY)n=!0;else if(e.style.top==Er&&"0px"==e.style.left){let t=e.getBoundingClientRect();n=Math.abs(t.top+1e4)>1||Math.abs(t.left)>1}}if(n||"absolute"==this.position)if(this.parent){let e=this.parent.getBoundingClientRect();e.width&&e.height&&(t=e.width/this.parent.offsetWidth,i=e.height/this.parent.offsetHeight)}else({scaleX:t,scaleY:i}=this.view.viewState);return{editor:e,parent:this.parent?this.container.getBoundingClientRect():e,pos:this.manager.tooltips.map(((e,t)=>{let i=this.manager.tooltipViews[t];return i.getCoords?i.getCoords(e.pos):this.view.coordsAtPos(e.pos)})),size:this.manager.tooltipViews.map((({dom:e})=>e.getBoundingClientRect())),space:this.view.state.facet(Dr).tooltipSpace(this.view),scaleX:t,scaleY:i,makeAbsolute:n}}writeMeasure(e){var t;if(e.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let e of this.manager.tooltipViews)e.dom.style.position="absolute"}let{editor:i,space:n,scaleX:s,scaleY:r}=e,o=[];for(let a=0;a=Math.min(i.bottom,n.bottom)||d.rightMath.min(i.right,n.right)+.1){c.style.top=Er;continue}let p=l.arrow?h.dom.querySelector(".cm-tooltip-arrow"):null,f=p?7:0,m=u.right-u.left,g=null!==(t=Ir.get(h))&&void 0!==t?t:u.bottom-u.top,v=h.offset||Nr,O=this.view.textDirection==Ri.LTR,b=u.width>n.right-n.left?O?n.left:n.right-u.width:O?Math.min(d.left-(p?14:0)+v.x,n.right-m):Math.max(n.left,d.left-m+(p?14:0)-v.x),_=this.above[a];!l.strictSide&&(_?d.top-(u.bottom-u.top)-v.yn.bottom)&&_==n.bottom-d.bottom>d.top-n.top&&(_=this.above[a]=!_);let y=(_?d.top-n.top:n.bottom-d.bottom)-f;if(yb&&e.topw&&(w=_?e.top-g-2-f:e.bottom+f+2);if("absolute"==this.position?(c.style.top=(w-e.parent.top)/r+"px",c.style.left=(b-e.parent.left)/s+"px"):(c.style.top=w/r+"px",c.style.left=b/s+"px"),p){let e=d.left+(O?v.x:-v.x)-(b+14-7);p.style.left=e/s+"px"}!0!==h.overlap&&o.push({left:b,top:w,right:x,bottom:w+g}),c.classList.toggle("cm-tooltip-above",_),c.classList.toggle("cm-tooltip-below",!_),h.positioned&&h.positioned(e.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let e of this.manager.tooltipViews)e.dom.style.top=Er}},{eventObservers:{scroll(){this.maybeMeasure()}}}),Lr=Ds.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),Nr={x:0,y:0},Br=q.define({enables:[qr,Lr]}),$r=q.define();class Qr{static create(e){return new Qr(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new Ar(e,$r,(e=>this.createHostedView(e)))}createHostedView(e){let t=e.create(this.view);return t.dom.classList.add("cm-tooltip-section"),this.dom.appendChild(t.dom),this.mounted&&t.mount&&t.mount(this.view),t}mount(e){for(let t of this.manager.tooltipViews)t.mount&&t.mount(e);this.mounted=!0}positioned(e){for(let t of this.manager.tooltipViews)t.positioned&&t.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let t of this.manager.tooltipViews)null===(e=t.destroy)||void 0===e||e.call(t)}passProp(e){let t;for(let i of this.manager.tooltipViews){let n=i[e];if(void 0!==n)if(void 0===t)t=n;else if(t!==n)return}return t}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}}const zr=Br.compute([$r],(e=>{let t=e.facet($r).filter((e=>e));return 0===t.length?null:{pos:Math.min(...t.map((e=>e.pos))),end:Math.max(...t.filter((e=>null!=e.end)).map((e=>e.end))),create:Qr.create,above:t[0].above,arrow:t.some((e=>e.arrow))}}));class jr{constructor(e,t,i,n,s){this.view=e,this.source=t,this.field=i,this.setHover=n,this.hoverTime=s,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout((()=>this.startHover()),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active)return;let e=Date.now()-this.lastMove.time;ei.bottom||t.xi.right+e.defaultCharacterWidth)return;let r=e.bidiSpans(e.state.doc.lineAt(n)).find((e=>e.from<=n&&e.to>=n)),o=r&&r.dir==Ri.RTL?-1:1;s=t.x{this.pending==t&&(this.pending=null,i&&e.dispatch({effects:this.setHover.of(i)}))}),(t=>mi(e.state,t,"hover tooltip")))}else r&&e.dispatch({effects:this.setHover.of(r)})}mousemove(e){var t;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let i=this.active;if(i&&!Wr(this.lastMove.target)||this.pending){let{pos:n}=i||this.pending,s=null!==(t=null==i?void 0:i.end)&&void 0!==t?t:n;(n==s?this.view.posAtCoords(this.lastMove)==n:function(e,t,i,n,s,r){let o=e.scrollDOM.getBoundingClientRect(),a=e.documentTop+e.documentPadding.top+e.contentHeight;if(o.left>n||o.rights||Math.min(o.bottom,a)=t&&l<=i}(this.view,n,s,e.clientX,e.clientY))||(this.view.dispatch({effects:this.setHover.of(null)}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1,this.active&&!Wr(e.relatedTarget)&&this.view.dispatch({effects:this.setHover.of(null)})}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}}function Wr(e){for(let t=e;t;t=t.parentNode)if(1==t.nodeType&&t.classList.contains("cm-tooltip"))return!0;return!1}function Vr(e,t={}){let i=ae.define(),n=j.define({create:()=>null,update(e,n){if(e&&(t.hideOnChange&&(n.docChanged||n.selection)||t.hideOn&&t.hideOn(n,e)))return null;if(e&&n.docChanged){let t=n.changes.mapPos(e.pos,-1,w.TrackDel);if(null==t)return null;let i=Object.assign(Object.create(null),e);i.pos=t,null!=e.end&&(i.end=n.changes.mapPos(e.end)),e=i}for(let t of n.effects)t.is(i)&&(e=t.value),t.is(Fr)&&(e=null);return e},provide:e=>$r.from(e)});return[n,bi.define((s=>new jr(s,e,n,i,t.hoverTime||300))),zr]}function Ur(e,t){let i=e.plugin(qr);if(!i)return null;let n=i.manager.tooltips.indexOf(t);return n<0?null:i.manager.tooltipViews[n]}const Fr=ae.define(),Hr=q.define({combine(e){let t,i;for(let n of e)t=t||n.topContainer,i=i||n.bottomContainer;return{topContainer:t,bottomContainer:i}}});function Xr(e,t){let i=e.plugin(Yr),n=i?i.specs.indexOf(t):-1;return n>-1?i.panels[n]:null}const Yr=bi.fromClass(class{constructor(e){this.input=e.state.facet(Kr),this.specs=this.input.filter((e=>e)),this.panels=this.specs.map((t=>t(e)));let t=e.state.facet(Hr);this.top=new Gr(e,!0,t.topContainer),this.bottom=new Gr(e,!1,t.bottomContainer),this.top.sync(this.panels.filter((e=>e.top))),this.bottom.sync(this.panels.filter((e=>!e.top)));for(let e of this.panels)e.dom.classList.add("cm-panel"),e.mount&&e.mount()}update(e){let t=e.state.facet(Hr);this.top.container!=t.topContainer&&(this.top.sync([]),this.top=new Gr(e.view,!0,t.topContainer)),this.bottom.container!=t.bottomContainer&&(this.bottom.sync([]),this.bottom=new Gr(e.view,!1,t.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let i=e.state.facet(Kr);if(i!=this.input){let t=i.filter((e=>e)),n=[],s=[],r=[],o=[];for(let i of t){let t,a=this.specs.indexOf(i);a<0?(t=i(e.view),o.push(t)):(t=this.panels[a],t.update&&t.update(e)),n.push(t),(t.top?s:r).push(t)}this.specs=t,this.panels=n,this.top.sync(s),this.bottom.sync(r);for(let e of o)e.dom.classList.add("cm-panel"),e.mount&&e.mount()}else for(let t of this.panels)t.update&&t.update(e)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:e=>Ds.scrollMargins.of((t=>{let i=t.plugin(e);return i&&{top:i.top.scrollMargin(),bottom:i.bottom.scrollMargin()}}))});class Gr{constructor(e,t,i){this.view=e,this.top=t,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let t of this.panels)t.destroy&&e.indexOf(t)<0&&t.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(0==this.panels.length)return void(this.dom&&(this.dom.remove(),this.dom=void 0));if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let e=this.container||this.view.dom;e.insertBefore(this.dom,this.top?e.firstChild:null)}let e=this.dom.firstChild;for(let t of this.panels)if(t.dom.parentNode==this.dom){for(;e!=t.dom;)e=Zr(e);e=e.nextSibling}else this.dom.insertBefore(t.dom,e);for(;e;)e=Zr(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(this.container&&this.classes!=this.view.themeClasses){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}}function Zr(e){let t=e.nextSibling;return e.remove(),t}const Kr=q.define({enables:Yr});class Jr extends _e{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}}Jr.prototype.elementClass="",Jr.prototype.toDOM=void 0,Jr.prototype.mapMode=w.TrackBefore,Jr.prototype.startSide=Jr.prototype.endSide=-1,Jr.prototype.point=!0;const eo=q.define(),to={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>Se.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}},io=q.define();function no(e){return[ro(),io.of(Object.assign(Object.assign({},to),e))]}const so=q.define({combine:e=>e.some((e=>e))});function ro(e){let t=[oo];return e&&!1===e.fixed&&t.push(so.of(!0)),t}const oo=bi.fromClass(class{constructor(e){this.view=e,this.prevViewport=e.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=e.state.facet(io).map((t=>new co(e,t)));for(let e of this.gutters)this.dom.appendChild(e.dom);this.fixed=!e.state.facet(so),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),e.scrollDOM.insertBefore(this.dom,e.contentDOM)}update(e){if(this.updateGutters(e)){let t=this.prevViewport,i=e.view.viewport,n=Math.min(t.to,i.to)-Math.max(t.from,i.from);this.syncGutters(n<.8*(i.to-i.from))}e.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(so)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=e.view.viewport}syncGutters(e){let t=this.dom.nextSibling;e&&this.dom.remove();let i=Se.iter(this.view.state.facet(eo),this.view.viewport.from),n=[],s=this.gutters.map((e=>new ho(e,this.view.viewport,-this.view.documentPadding.top)));for(let e of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(e.type)){let t=!0;for(let r of e.type)if(r.type==Xt.Text&&t){lo(i,n,r.from);for(let e of s)e.line(this.view,r,n);t=!1}else if(r.widget)for(let e of s)e.widget(this.view,r)}else if(e.type==Xt.Text){lo(i,n,e.from);for(let t of s)t.line(this.view,e,n)}else if(e.widget)for(let t of s)t.widget(this.view,e);for(let e of s)e.finish();e&&this.view.scrollDOM.insertBefore(this.dom,t)}updateGutters(e){let t=e.startState.facet(io),i=e.state.facet(io),n=e.docChanged||e.heightChanged||e.viewportChanged||!Se.eq(e.startState.facet(eo),e.state.facet(eo),e.view.viewport.from,e.view.viewport.to);if(t==i)for(let t of this.gutters)t.update(e)&&(n=!0);else{n=!0;let s=[];for(let n of i){let i=t.indexOf(n);i<0?s.push(new co(this.view,n)):(this.gutters[i].update(e),s.push(this.gutters[i]))}for(let e of this.gutters)e.dom.remove(),s.indexOf(e)<0&&e.destroy();for(let e of s)this.dom.appendChild(e.dom);this.gutters=s}return n}destroy(){for(let e of this.gutters)e.destroy();this.dom.remove()}},{provide:e=>Ds.scrollMargins.of((t=>{let i=t.plugin(e);return i&&0!=i.gutters.length&&i.fixed?t.textDirection==Ri.LTR?{left:i.dom.offsetWidth*t.scaleX}:{right:i.dom.offsetWidth*t.scaleX}:null}))});function ao(e){return Array.isArray(e)?e:[e]}function lo(e,t,i){for(;e.value&&e.from<=i;)e.from==i&&t.push(e.value),e.next()}class ho{constructor(e,t,i){this.gutter=e,this.height=i,this.i=0,this.cursor=Se.iter(e.markers,t.from)}addElement(e,t,i){let{gutter:n}=this,s=(t.top-this.height)/e.scaleY,r=t.height/e.scaleY;if(this.i==n.elements.length){let t=new uo(e,r,s,i);n.elements.push(t),n.dom.appendChild(t.dom)}else n.elements[this.i].update(e,r,s,i);this.height=t.bottom,this.i++}line(e,t,i){let n=[];lo(this.cursor,n,t.from),i.length&&(n=n.concat(i));let s=this.gutter.config.lineMarker(e,t,n);s&&n.unshift(s);let r=this.gutter;(0!=n.length||r.config.renderEmptyElements)&&this.addElement(e,t,n)}widget(e,t){let i=this.gutter.config.widgetMarker(e,t.widget,t);i&&this.addElement(e,t,[i])}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let t=e.elements.pop();e.dom.removeChild(t.dom),t.destroy()}}}class co{constructor(e,t){this.view=e,this.config=t,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in t.domEventHandlers)this.dom.addEventListener(i,(n=>{let s,r=n.target;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let e=r.getBoundingClientRect();s=(e.top+e.bottom)/2}else s=n.clientY;let o=e.lineBlockAtHeight(s-e.documentTop);t.domEventHandlers[i](e,o,n)&&n.preventDefault()}));this.markers=ao(t.markers(e)),t.initialSpacer&&(this.spacer=new uo(e,0,0,[t.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let t=this.markers;if(this.markers=ao(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let t=this.config.updateSpacer(this.spacer.markers[0],e);t!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[t])}let i=e.view.viewport;return!Se.eq(this.markers,t,i.from,i.to)||!!this.config.lineMarkerChange&&this.config.lineMarkerChange(e)}destroy(){for(let e of this.elements)e.destroy()}}class uo{constructor(e,t,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,t,i,n)}update(e,t,i,n){this.height!=t&&(this.height=t,this.dom.style.height=t+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),function(e,t){if(e.length!=t.length)return!1;for(let i=0;ibe(e,{formatNumber:String,domEventHandlers:{}},{domEventHandlers(e,t){let i=Object.assign({},e);for(let e in t){let n=i[e],s=t[e];i[e]=n?(e,t,i)=>n(e,t,i)||s(e,t,i):s}return i}})});class mo extends Jr{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}}function go(e,t){return e.state.facet(fo).formatNumber(t,e.state)}const vo=io.compute([fo],(e=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers:e=>e.state.facet(po),lineMarker:(e,t,i)=>i.some((e=>e.toDOM))?null:new mo(go(e,e.state.doc.lineAt(t.from).number)),widgetMarker:()=>null,lineMarkerChange:e=>e.startState.facet(fo)!=e.state.facet(fo),initialSpacer:e=>new mo(go(e,bo(e.state.doc.lines))),updateSpacer(e,t){let i=go(t.view,bo(t.view.state.doc.lines));return i==e.number?e:new mo(i)},domEventHandlers:e.facet(fo).domEventHandlers})));function Oo(e={}){return[fo.of(e),ro(),vo]}function bo(e){let t=9;for(;t{let t=[],i=-1;for(let n of e.selection.ranges){let s=e.doc.lineAt(n.head).from;s>i&&(i=s,t.push(_o.range(s)))}return Se.of(t)})),wo=1024;let xo=0;class So{constructor(e,t){this.from=e,this.to=t}}class ko{constructor(e={}){this.id=xo++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return"function"!=typeof e&&(e=Po.match(e)),t=>{let i=e(t);return void 0===i?null:[this,i]}}}ko.closedBy=new ko({deserialize:e=>e.split(" ")}),ko.openedBy=new ko({deserialize:e=>e.split(" ")}),ko.group=new ko({deserialize:e=>e.split(" ")}),ko.contextHash=new ko({perNode:!0}),ko.lookAhead=new ko({perNode:!0}),ko.mounted=new ko({perNode:!0});class To{constructor(e,t,i){this.tree=e,this.overlay=t,this.parser=i}static get(e){return e&&e.props&&e.props[ko.mounted.id]}}const Co=Object.create(null);class Po{constructor(e,t,i,n=0){this.name=e,this.props=t,this.id=i,this.flags=n}static define(e){let t=e.props&&e.props.length?Object.create(null):Co,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(null==e.name?8:0),n=new Po(e.name||"",t,e.id,i);if(e.props)for(let i of e.props)if(Array.isArray(i)||(i=i(n)),i){if(i[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[i[0].id]=i[1]}return n}prop(e){return this.props[e.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(e){if("string"==typeof e){if(this.name==e)return!0;let t=this.prop(ko.group);return!!t&&t.indexOf(e)>-1}return this.id==e}static match(e){let t=Object.create(null);for(let i in e)for(let n of i.split(" "))t[n]=e[i];return e=>{for(let i=e.prop(ko.group),n=-1;n<(i?i.length:0);n++){let s=t[n<0?e.name:i[n]];if(s)return s}}}}Po.none=new Po("",Object.create(null),0,8);class Mo{constructor(e){this.types=e;for(let t=0;t=t){let o=new $o(r.tree,r.overlay[0].from+e.from,0,null);(s||(s=[n])).push(No(o,t,i,!1))}}return s?Vo(s):n}(this,e,t)}iterate(e){let{enter:t,leave:i,from:n=0,to:s=this.length}=e,r=e.mode||0,o=(r&Ro.IncludeAnonymous)>0;for(let e=this.cursor(r|Ro.IncludeAnonymous);;){let r=!1;if(e.from<=s&&e.to>=n&&(!o&&e.type.isAnonymous||!1!==t(e))){if(e.firstChild())continue;r=!0}for(;r&&i&&(o||!e.type.isAnonymous)&&i(e),!e.nextSibling();){if(!e.parent())return;r=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:Go(Po.none,this.children,this.positions,0,this.children.length,0,this.length,((e,t,i)=>new Do(this.type,e,t,i,this.propValues)),e.makeTree||((e,t,i)=>new Do(Po.none,e,t,i)))}static build(e){return function(e){var t;let{buffer:i,nodeSet:n,maxBufferLength:s=wo,reused:r=[],minRepeatType:o=n.types.length}=e,a=Array.isArray(i)?new Io(i,i.length):i,l=n.types,h=0,c=0;function d(e,t,i,m,g){let{id:v,start:O,end:b,size:_}=a,y=c;for(;_<0;){if(a.next(),-1==_){let t=r[v];return i.push(t),void m.push(O-e)}if(-3==_)return void(h=v);if(-4==_)return void(c=v);throw new RangeError(`Unrecognized record size: ${_}`)}let w,x,S=l[v],k=O-e;if(b-O<=s&&(x=function(e,t){let i=a.fork(),n=0,r=0,l=0,h=i.end-s,c={size:0,start:0,skip:0};e:for(let s=i.pos-e;i.pos>s;){let e=i.size;if(i.id==t&&e>=0){c.size=n,c.start=r,c.skip=l,l+=4,n+=4,i.next();continue}let a=i.pos-e;if(e<0||a=o?4:0,u=i.start;for(i.next();i.pos>a;){if(i.size<0){if(-3!=i.size)break e;d+=4}else i.id>=o&&(d+=4);i.next()}r=u,n+=e,l+=d}return(t<0||n==e)&&(c.size=n,c.start=r,c.skip=l),c.size>4?c:void 0}(a.pos-t,g))){let t=new Uint16Array(x.size-x.skip),i=a.pos-x.size,s=t.length;for(;a.pos>i;)s=f(x.start,t,s);w=new qo(t,b-x.start,n),k=x.start-e}else{let e=a.pos-_;a.next();let t=[],i=[],n=v>=o?v:-1,r=0,l=b;for(;a.pos>e;)n>=0&&a.id==n&&a.size>=0?(a.end<=l-s&&(u(t,i,O,r,a.end,l,n,y),r=t.length,l=a.end),a.next()):d(O,e,t,i,n);if(n>=0&&r>0&&r-1&&r>0){let e=function(e){return(t,i,n)=>{let s,r,o=0,a=t.length-1;if(a>=0&&(s=t[a])instanceof Do){if(!a&&s.type==e&&s.length==n)return s;(r=s.prop(ko.lookAhead))&&(o=i[a]+s.length+r)}return p(e,t,i,n,o)}}(S);w=Go(S,t,i,0,t.length,0,b-O,e,e)}else w=p(S,t,i,b-O,y-b)}i.push(w),m.push(k)}function u(e,t,i,s,r,o,a,l){let h=[],c=[];for(;e.length>s;)h.push(e.pop()),c.push(t.pop()+i-r);e.push(p(n.types[a],h,c,o-r,l-o)),t.push(r-i)}function p(e,t,i,n,s=0,r){if(h){let e=[ko.contextHash,h];r=r?[e].concat(r):[e]}if(s>25){let e=[ko.lookAhead,s];r=r?[e].concat(r):[e]}return new Do(e,t,i,n,r)}function f(e,t,i){let{id:n,start:s,end:r,size:l}=a;if(a.next(),l>=0&&n4){let n=a.pos-(l-4);for(;a.pos>n;)i=f(e,t,i)}t[--i]=o,t[--i]=r-e,t[--i]=s-e,t[--i]=n}else-3==l?h=n:-4==l&&(c=n);return i}let m=[],g=[];for(;a.pos>0;)d(e.start||0,e.bufferStart||0,m,g,-1);let v=null!==(t=e.length)&&void 0!==t?t:m.length?g[0]+m[0].length:0;return new Do(l[e.topID],m.reverse(),g.reverse(),v)}(e)}}Do.empty=new Do(Po.none,[],[],0);class Io{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new Io(this.buffer,this.index)}}class qo{constructor(e,t,i){this.buffer=e,this.length=t,this.set=i}get type(){return Po.none}toString(){let e=[];for(let t=0;t0));a=r[a+3]);return o}slice(e,t,i){let n=this.buffer,s=new Uint16Array(t-e),r=0;for(let o=e,a=0;o=t&&it;case 1:return i<=t&&n>t;case 2:return n>t;case 4:return!0}}function No(e,t,i,n){for(var s;e.from==e.to||(i<1?e.from>=t:e.from>t)||(i>-1?e.to<=t:e.to0?o.length:-1;e!=l;e+=t){let l=o[e],h=a[e]+r.from;if(Lo(n,i,h,h+l.length))if(l instanceof qo){if(s&Ro.ExcludeBuffers)continue;let o=l.findChild(0,l.buffer.length,t,i-h,n);if(o>-1)return new Wo(new jo(r,l,e,h),null,o)}else if(s&Ro.IncludeAnonymous||!l.type.isAnonymous||Ho(l)){let o;if(!(s&Ro.IgnoreMounts)&&(o=To.get(l))&&!o.overlay)return new $o(o.tree,h,e,r);let a=new $o(l,h,e,r);return s&Ro.IncludeAnonymous||!a.type.isAnonymous?a:a.nextChild(t<0?l.children.length-1:0,t,i,n)}}if(s&Ro.IncludeAnonymous||!r.type.isAnonymous)return null;if(e=r.index>=0?r.index+t:t<0?-1:r._parent._tree.children.length,r=r._parent,!r)return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}enter(e,t,i=0){let n;if(!(i&Ro.IgnoreOverlays)&&(n=To.get(this._tree))&&n.overlay){let i=e-this.from;for(let{from:e,to:s}of n.overlay)if((t>0?e<=i:e=i:s>i))return new $o(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function Qo(e,t,i,n){let s=e.cursor(),r=[];if(!s.firstChild())return r;if(null!=i)for(;!s.type.is(i);)if(!s.nextSibling())return r;for(;;){if(null!=n&&s.type.is(n))return r;if(s.type.is(t)&&r.push(s.node),!s.nextSibling())return null==n?r:[]}}function zo(e,t,i=t.length-1){for(let n=e.parent;i>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(t[i]&&t[i]!=n.name)return!1;i--}}return!0}class jo{constructor(e,t,i,n){this.parent=e,this.buffer=t,this.index=i,this.start=n}}class Wo extends Bo{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,i){super(),this.context=e,this._parent=t,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,t,i){let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],e,t-this.context.start,i);return s<0?null:new Wo(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}enter(e,t,i=0){if(i&Ro.ExcludeBuffers)return null;let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return s<0?null:new Wo(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new Wo(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new Wo(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:i}=this.context,n=this.index+4,s=i.buffer[this.index+3];if(s>n){let r=i.buffer[this.index+1];e.push(i.slice(n,s,r)),t.push(0)}return new Do(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function Vo(e){if(!e.length)return null;if(1==e.length)return e[0];let t=0,i=e[0];for(let n=1;ni.from||s.to0){if(this.index-1)for(let n=t+e,s=e<0?-1:i._tree.children.length;n!=s;n+=e){let e=i._tree.children[n];if(this.mode&Ro.IncludeAnonymous||e instanceof qo||!e.type.isAnonymous||Ho(e))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let r=e;r;r=r._parent)if(r.index==n){if(n==this.index)return r;t=r,i=s+1;break e}n=this.stack[--s]}for(let e=i;e=0;s--){if(s<0)return zo(this.node,e,n);let r=i[t.buffer[this.stack[s]]];if(!r.isAnonymous){if(e[n]&&e[n]!=r.name)return!1;n--}}return!0}}function Ho(e){return e.children.some((e=>e instanceof qo||!e.type.isAnonymous||Ho(e)))}const Xo=new WeakMap;function Yo(e,t){if(!e.isAnonymous||t instanceof qo||t.type!=e)return 1;let i=Xo.get(t);if(null==i){i=1;for(let n of t.children){if(n.type!=e||!(n instanceof Do)){i=1;break}i+=Yo(e,n)}Xo.set(t,i)}return i}function Go(e,t,i,n,s,r,o,a,l){let h=0;for(let i=n;i=c)break;f+=t}if(h==s+1){if(f>c){let e=i[s];t(e.children,e.positions,0,e.children.length,n[s]+a);continue}d.push(i[s])}else{let t=n[h-1]+i[h-1].length-p;d.push(Go(e,i,n,s,h,p,t,null,l))}u.push(p+a-r)}}(t,i,n,s,0),(a||l)(d,u,o)}class Zo{constructor(){this.map=new WeakMap}setBuffer(e,t,i){let n=this.map.get(e);n||this.map.set(e,n=new Map),n.set(t,i)}getBuffer(e,t){let i=this.map.get(e);return i&&i.get(t)}set(e,t){e instanceof Wo?this.setBuffer(e.context.buffer,e.index,t):e instanceof $o&&this.map.set(e.tree,t)}get(e){return e instanceof Wo?this.getBuffer(e.context.buffer,e.index):e instanceof $o?this.map.get(e.tree):void 0}cursorSet(e,t){e.buffer?this.setBuffer(e.buffer.buffer,e.index,t):this.map.set(e.tree,t)}cursorGet(e){return e.buffer?this.getBuffer(e.buffer.buffer,e.index):this.map.get(e.tree)}}class Ko{constructor(e,t,i,n,s=!1,r=!1){this.from=e,this.to=t,this.tree=i,this.offset=n,this.open=(s?1:0)|(r?2:0)}get openStart(){return(1&this.open)>0}get openEnd(){return(2&this.open)>0}static addTree(e,t=[],i=!1){let n=[new Ko(0,e.length,e,0,!1,i)];for(let i of t)i.to>e.length&&n.push(i);return n}static applyChanges(e,t,i=128){if(!t.length)return e;let n=[],s=1,r=e.length?e[0]:null;for(let o=0,a=0,l=0;;o++){let h=o=i)for(;r&&r.from=t.from||c<=t.to||l){let e=Math.max(t.from,a)-l,i=Math.min(t.to,c)-l;t=e>=i?null:new Ko(e,i,t.tree,t.offset+l,o>0,!!h)}if(t&&n.push(t),r.to>c)break;r=snew So(e.from,e.to))):[new So(0,0)]:[new So(0,e.length)],this.createParse(e,t||[],i)}parse(e,t,i){let n=this.startParse(e,t,i);for(;;){let e=n.advance();if(e)return e}}}class ea{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}}new ko({perNode:!0});let ta=0;class ia{constructor(e,t,i){this.set=e,this.base=t,this.modified=i,this.id=ta++}static define(e){if(null==e?void 0:e.base)throw new Error("Can not derive from a modified tag");let t=new ia([],null,[]);if(t.set.push(t),e)for(let i of e.set)t.set.push(i);return t}static defineModifier(){let e=new sa;return t=>t.modified.indexOf(e)>-1?t:sa.get(t.base||t,t.modified.concat(e).sort(((e,t)=>e.id-t.id)))}}let na=0;class sa{constructor(){this.instances=[],this.id=na++}static get(e,t){if(!t.length)return e;let i=t[0].instances.find((i=>{return i.base==e&&(n=t,s=i.modified,n.length==s.length&&n.every(((e,t)=>e==s[t])));var n,s}));if(i)return i;let n=[],s=new ia(n,e,t);for(let e of t)e.instances.push(s);let r=function(e){let t=[[]];for(let i=0;it.length-e.length))}(t);for(let t of e.set)if(!t.modified.length)for(let e of r)n.push(sa.get(t,e));return s}}function ra(e){let t=Object.create(null);for(let i in e){let n=e[i];Array.isArray(n)||(n=[n]);for(let e of i.split(" "))if(e){let i=[],s=2,r=e;for(let t=0;;){if("..."==r&&t>0&&t+3==e.length){s=1;break}let n=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!n)throw new RangeError("Invalid path: "+e);if(i.push("*"==n[0]?"":'"'==n[0][0]?JSON.parse(n[0]):n[0]),t+=n[0].length,t==e.length)break;let o=e[t++];if(t==e.length&&"!"==o){s=0;break}if("/"!=o)throw new RangeError("Invalid path: "+e);r=e.slice(t)}let o=i.length-1,a=i[o];if(!a)throw new RangeError("Invalid path: "+e);let l=new aa(n,s,o>0?i.slice(0,o):null);t[a]=l.sort(t[a])}}return oa.add(t)}const oa=new ko;class aa{constructor(e,t,i,n){this.tags=e,this.mode=t,this.context=i,this.next=n}get opaque(){return 0==this.mode}get inherit(){return 1==this.mode}sort(e){return!e||e.depth{let t=s;for(let n of e)for(let e of n.set){let n=i[e.id];if(n){t=t?t+" "+n:n;break}}return t},scope:n}}function ha(e,t,i,n=0,s=e.length){let r=new ca(n,Array.isArray(t)?t:[t],i);r.highlightRange(e.cursor(),n,s,"",r.highlighters),r.flush(s)}aa.empty=new aa([],2,null);class ca{constructor(e,t,i){this.at=e,this.highlighters=t,this.span=i,this.class=""}startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=t)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,t,i,n,s){let{type:r,from:o,to:a}=e;if(o>=i||a<=t)return;r.isTop&&(s=this.highlighters.filter((e=>!e.scope||e.scope(r))));let l=n,h=function(e){let t=e.type.prop(oa);for(;t&&t.context&&!e.matchContext(t.context);)t=t.next;return t||null}(e)||aa.empty,c=function(e,t){let i=null;for(let n of e){let e=n.style(t);e&&(i=i?i+" "+e:e)}return i}(s,h.tags);if(c&&(l&&(l+=" "),l+=c,1==h.mode&&(n+=(n?" ":"")+c)),this.startSpan(Math.max(t,o),l),h.opaque)return;let d=e.tree&&e.tree.prop(ko.mounted);if(d&&d.overlay){let r=e.node.enter(d.overlay[0].from+o,1),h=this.highlighters.filter((e=>!e.scope||e.scope(d.tree.type))),c=e.firstChild();for(let u=0,p=o;;u++){let f=u=m)&&e.nextSibling()););if(!f||m>i)break;p=f.to+o,p>t&&(this.highlightRange(r.cursor(),Math.max(t,f.from+o),Math.min(i,p),"",h),this.startSpan(Math.min(i,p),l))}c&&e.parent()}else if(e.firstChild()){d&&(n="");do{if(!(e.to<=t)){if(e.from>=i)break;this.highlightRange(e,t,i,n,s),this.startSpan(Math.min(i,e.to),l)}}while(e.nextSibling());e.parent()}}}const da=ia.define,ua=da(),pa=da(),fa=da(pa),ma=da(pa),ga=da(),va=da(ga),Oa=da(ga),ba=da(),_a=da(ba),ya=da(),wa=da(),xa=da(),Sa=da(xa),ka=da(),Ta={comment:ua,lineComment:da(ua),blockComment:da(ua),docComment:da(ua),name:pa,variableName:da(pa),typeName:fa,tagName:da(fa),propertyName:ma,attributeName:da(ma),className:da(pa),labelName:da(pa),namespace:da(pa),macroName:da(pa),literal:ga,string:va,docString:da(va),character:da(va),attributeValue:da(va),number:Oa,integer:da(Oa),float:da(Oa),bool:da(ga),regexp:da(ga),escape:da(ga),color:da(ga),url:da(ga),keyword:ya,self:da(ya),null:da(ya),atom:da(ya),unit:da(ya),modifier:da(ya),operatorKeyword:da(ya),controlKeyword:da(ya),definitionKeyword:da(ya),moduleKeyword:da(ya),operator:wa,derefOperator:da(wa),arithmeticOperator:da(wa),logicOperator:da(wa),bitwiseOperator:da(wa),compareOperator:da(wa),updateOperator:da(wa),definitionOperator:da(wa),typeOperator:da(wa),controlOperator:da(wa),punctuation:xa,separator:da(xa),bracket:Sa,angleBracket:da(Sa),squareBracket:da(Sa),paren:da(Sa),brace:da(Sa),content:ba,heading:_a,heading1:da(_a),heading2:da(_a),heading3:da(_a),heading4:da(_a),heading5:da(_a),heading6:da(_a),contentSeparator:da(ba),list:da(ba),quote:da(ba),emphasis:da(ba),strong:da(ba),link:da(ba),monospace:da(ba),strikethrough:da(ba),inserted:da(),deleted:da(),changed:da(),invalid:da(),meta:ka,documentMeta:da(ka),annotation:da(ka),processingInstruction:da(ka),definition:ia.defineModifier(),constant:ia.defineModifier(),function:ia.defineModifier(),standard:ia.defineModifier(),local:ia.defineModifier(),special:ia.defineModifier()};var Ca;la([{tag:Ta.link,class:"tok-link"},{tag:Ta.heading,class:"tok-heading"},{tag:Ta.emphasis,class:"tok-emphasis"},{tag:Ta.strong,class:"tok-strong"},{tag:Ta.keyword,class:"tok-keyword"},{tag:Ta.atom,class:"tok-atom"},{tag:Ta.bool,class:"tok-bool"},{tag:Ta.url,class:"tok-url"},{tag:Ta.labelName,class:"tok-labelName"},{tag:Ta.inserted,class:"tok-inserted"},{tag:Ta.deleted,class:"tok-deleted"},{tag:Ta.literal,class:"tok-literal"},{tag:Ta.string,class:"tok-string"},{tag:Ta.number,class:"tok-number"},{tag:[Ta.regexp,Ta.escape,Ta.special(Ta.string)],class:"tok-string2"},{tag:Ta.variableName,class:"tok-variableName"},{tag:Ta.local(Ta.variableName),class:"tok-variableName tok-local"},{tag:Ta.definition(Ta.variableName),class:"tok-variableName tok-definition"},{tag:Ta.special(Ta.variableName),class:"tok-variableName2"},{tag:Ta.definition(Ta.propertyName),class:"tok-propertyName tok-definition"},{tag:Ta.typeName,class:"tok-typeName"},{tag:Ta.namespace,class:"tok-namespace"},{tag:Ta.className,class:"tok-className"},{tag:Ta.macroName,class:"tok-macroName"},{tag:Ta.propertyName,class:"tok-propertyName"},{tag:Ta.operator,class:"tok-operator"},{tag:Ta.comment,class:"tok-comment"},{tag:Ta.meta,class:"tok-meta"},{tag:Ta.invalid,class:"tok-invalid"},{tag:Ta.punctuation,class:"tok-punctuation"}]);const Pa=new ko;const Ma=new ko;class Ea{constructor(e,t,i=[],n=""){this.data=e,this.name=n,Oe.prototype.hasOwnProperty("tree")||Object.defineProperty(Oe.prototype,"tree",{get(){return Da(this)}}),this.parser=t,this.extension=[ja.of(this),Oe.languageData.of(((e,t,i)=>{let n=Aa(e,t,i),s=n.type.prop(Pa);if(!s)return[];let r=e.facet(s),o=n.type.prop(Ma);if(o){let s=n.resolve(t-n.from,i);for(let t of o)if(t.test(s,e)){let i=e.facet(t.facet);return"replace"==t.type?i:i.concat(r)}}return r}))].concat(i)}isActiveAt(e,t,i=-1){return Aa(e,t,i).type.prop(Pa)==this.data}findRegions(e){let t=e.facet(ja);if((null==t?void 0:t.data)==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let i=[],n=(e,t)=>{if(e.prop(Pa)==this.data)return void i.push({from:t,to:t+e.length});let s=e.prop(ko.mounted);if(s){if(s.tree.prop(Pa)==this.data){if(s.overlay)for(let e of s.overlay)i.push({from:e.from+t,to:e.to+t});else i.push({from:t,to:t+e.length});return}if(s.overlay){let e=i.length;if(n(s.tree,s.overlay[0].from+t),i.length>e)return}}for(let i=0;ie.concat(i):void 0}));var i;return new Ra(t,e.parser.configure({props:[Pa.add((e=>e.isTop?t:void 0))]}),e.name)}configure(e,t){return new Ra(this.data,this.parser.configure(e),t||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function Da(e){let t=e.field(Ea.state,!1);return t?t.tree:Do.empty}class Ia{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,t){let i=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-i,t-i)}}let qa=null;class La{constructor(e,t,i=[],n,s,r,o,a){this.parser=e,this.state=t,this.fragments=i,this.tree=n,this.treeLen=s,this.viewport=r,this.skipped=o,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(e,t,i){return new La(e,t,[],Do.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Ia(this.state.doc),this.fragments)}work(e,t){return null!=t&&t>=this.state.doc.length&&(t=void 0),this.tree!=Do.empty&&this.isDone(null!=t?t:this.state.doc.length)?(this.takeTree(),!0):this.withContext((()=>{var i;if("number"==typeof e){let t=Date.now()+e;e=()=>Date.now()>t}for(this.parse||(this.parse=this.startParse()),null!=t&&(null==this.parse.stoppedAt||this.parse.stoppedAt>t)&&t=this.treeLen&&((null==this.parse.stoppedAt||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext((()=>{for(;!(t=this.parse.advance()););})),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(Ko.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=qa;qa=this;try{return e()}finally{qa=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=Na(e,t.from,t.to);return e}changes(e,t){let{fragments:i,tree:n,treeLen:s,viewport:r,skipped:o}=this;if(this.takeTree(),!e.empty){let t=[];if(e.iterChangedRanges(((e,i,n,s)=>t.push({fromA:e,toA:i,fromB:n,toB:s}))),i=Ko.applyChanges(i,t),n=Do.empty,s=0,r={from:e.mapPos(r.from,-1),to:e.mapPos(r.to,1)},this.skipped.length){o=[];for(let t of this.skipped){let i=e.mapPos(t.from,1),n=e.mapPos(t.to,-1);ie.from&&(this.fragments=Na(this.fragments,i,n),this.skipped.splice(t--,1))}return!(this.skipped.length>=t||(this.reset(),0))}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends Jo{createParse(t,i,n){let s=n[0].from,r=n[n.length-1].to;return{parsedPos:s,advance(){let t=qa;if(t){for(let e of n)t.tempSkipped.push(e);e&&(t.scheduleOn=t.scheduleOn?Promise.all([t.scheduleOn,e]):e)}return this.parsedPos=r,new Do(Po.none,[],[],r-s)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&0==t[0].from&&t[0].to>=e}static get(){return qa}}function Na(e,t,i){return Ko.applyChanges(e,[{fromA:t,toA:i,fromB:t,toB:i}])}class Ba{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,i)||t.takeTree(),new Ba(t)}static init(e){let t=Math.min(3e3,e.doc.length),i=La.create(e.facet(ja).parser,e,{from:0,to:t});return i.work(20,t)||i.takeTree(),new Ba(i)}}Ea.state=j.define({create:Ba.init,update(e,t){for(let e of t.effects)if(e.is(Ea.setState))return e.value;return t.startState.facet(ja)!=t.state.facet(ja)?Ba.init(t.state):e.apply(t)}});let $a=e=>{let t=setTimeout((()=>e()),500);return()=>clearTimeout(t)};"undefined"!=typeof requestIdleCallback&&($a=e=>{let t=-1,i=setTimeout((()=>{t=requestIdleCallback(e,{timeout:400})}),100);return()=>t<0?clearTimeout(i):cancelIdleCallback(t)});const Qa="undefined"!=typeof navigator&&(null===(Ca=navigator.scheduling)||void 0===Ca?void 0:Ca.isInputPending)?()=>navigator.scheduling.isInputPending():null,za=bi.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(Ea.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(Ea.state);t.tree==t.context.tree&&t.context.isDone(e.doc.length)||(this.working=$a(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEndn+1e3,a=s.context.work((()=>Qa&&Qa()||Date.now()>r),n+(o?0:1e5));this.chunkBudget-=Date.now()-t,(a||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:Ea.setState.of(new Ba(s.context))})),this.chunkBudget>0&&(!a||o)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then((()=>this.scheduleWork())).catch((e=>mi(this.view.state,e))).then((()=>this.workScheduled--)),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),ja=q.define({combine:e=>e.length?e[0]:null,enables:e=>[Ea.state,za,Ds.contentAttributes.compute([e],(t=>{let i=t.facet(e);return i&&i.name?{"data-language":i.name}:{}}))]});class Wa{constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}}const Va=q.define(),Ua=q.define({combine:e=>{if(!e.length)return" ";let t=e[0];if(!t||/\S/.test(t)||Array.from(t).some((e=>e!=t[0])))throw new Error("Invalid indent unit: "+JSON.stringify(e[0]));return t}});function Fa(e){let t=e.facet(Ua);return 9==t.charCodeAt(0)?e.tabSize*t.length:t.length}function Ha(e,t){let i="",n=e.tabSize,s=e.facet(Ua)[0];if("\t"==s){for(;t>=n;)i+="\t",t-=n;s=" "}for(let e=0;e=t?function(e,t,i){let n=t.resolveStack(i),s=n.node.enterUnfinishedNodesBefore(i);if(s!=n.node){let e=[];for(let t=s;t!=n.node;t=t.parent)e.push(t);for(let t=e.length-1;t>=0;t--)n={node:e[t],next:n}}return Za(n,e,i)}(e,i,t):null}class Ya{constructor(e,t={}){this.state=e,this.options=t,this.unit=Fa(e)}lineAt(e,t=1){let i=this.state.doc.lineAt(e),{simulateBreak:n,simulateDoubleBreak:s}=this.options;return null!=n&&n>=i.from&&n<=i.to?s&&n==e?{text:"",from:e}:(t<0?n-1&&(s+=r-this.countColumn(i,i.search(/\S|$/))),s}countColumn(e,t=e.length){return Le(e,this.state.tabSize,t)}lineIndent(e,t=1){let{text:i,from:n}=this.lineAt(e,t),s=this.options.overrideIndentation;if(s){let e=s(n);if(e>-1)return e}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const Ga=new ko;function Za(e,t,i){for(let n=e;n;n=n.next){let e=Ka(n.node);if(e)return e(el.create(t,i,n))}return 0}function Ka(e){let t=e.type.prop(Ga);if(t)return t;let i,n=e.firstChild;if(n&&(i=n.type.prop(ko.closedBy))){let t=e.lastChild,n=t&&i.indexOf(t.name)>-1;return e=>nl(e,!0,1,void 0,n&&!function(e){return e.pos==e.options.simulateBreak&&e.options.simulateDoubleBreak}(e)?t.from:void 0)}return null==e.parent?Ja:null}function Ja(){return 0}class el extends Ya{constructor(e,t,i){super(e.state,e.options),this.base=e,this.pos=t,this.context=i}get node(){return this.context.node}static create(e,t,i){return new el(e,t,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let t=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(t.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(tl(i,e))break;t=this.state.doc.lineAt(i.from)}return this.lineIndent(t.from)}continue(){return Za(this.context.next,this.base,this.pos)}}function tl(e,t){for(let i=t;i;i=i.parent)if(e==i)return!0;return!1}function il({closing:e,align:t=!0,units:i=1}){return n=>nl(n,t,i,e)}function nl(e,t,i,n,s){let r=e.textAfter,o=r.match(/^\s*/)[0].length,a=n&&r.slice(o,o+n.length)==n||s==e.pos+o,l=t?function(e){let t=e.node,i=t.childAfter(t.from),n=t.lastChild;if(!i)return null;let s=e.options.simulateBreak,r=e.state.doc.lineAt(i.from),o=null==s||s<=r.from?r.to:Math.min(r.to,s);for(let e=i.to;;){let s=t.childAfter(e);if(!s||s==n)return null;if(!s.type.isSkipped)return s.fromi)continue;if(s&&o.from=t&&n.to>i&&(s=n)}}return s}(e,t,i)}function ll(e,t){let i=t.mapPos(e.from,1),n=t.mapPos(e.to,-1);return i>=n?void 0:{from:i,to:n}}const hl=ae.define({map:ll}),cl=ae.define({map:ll});function dl(e){let t=[];for(let{head:i}of e.state.selection.ranges)t.some((e=>e.from<=i&&e.to>=i))||t.push(e.lineBlockAt(i));return t}const ul=j.define({create:()=>Yt.none,update(e,t){e=e.map(t.changes);for(let i of t.effects)if(i.is(hl)&&!fl(e,i.value.from,i.value.to)){let{preparePlaceholder:n}=t.state.facet(bl),s=n?Yt.replace({widget:new xl(n(t.state,i.value))}):wl;e=e.update({add:[s.range(i.value.from,i.value.to)]})}else i.is(cl)&&(e=e.update({filter:(e,t)=>i.value.from!=e||i.value.to!=t,filterFrom:i.value.from,filterTo:i.value.to}));if(t.selection){let i=!1,{head:n}=t.selection.main;e.between(n,n,((e,t)=>{en&&(i=!0)})),i&&(e=e.update({filterFrom:n,filterTo:n,filter:(e,t)=>t<=n||e>=n}))}return e},provide:e=>Ds.decorations.from(e),toJSON(e,t){let i=[];return e.between(0,t.doc.length,((e,t)=>{i.push(e,t)})),i},fromJSON(e){if(!Array.isArray(e)||e.length%2)throw new RangeError("Invalid JSON for fold state");let t=[];for(let i=0;i{(!s||s.from>e)&&(s={from:e,to:t})})),s}function fl(e,t,i){let n=!1;return e.between(t,t,((e,s)=>{e==t&&s==i&&(n=!0)})),n}function ml(e,t){return e.field(ul,!1)?t:t.concat(ae.appendConfig.of(_l()))}function gl(e,t,i=!0){let n=e.state.doc.lineAt(t.from).number,s=e.state.doc.lineAt(t.to).number;return Ds.announce.of(`${e.state.phrase(i?"Folded lines":"Unfolded lines")} ${n} ${e.state.phrase("to")} ${s}.`)}const vl=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:e=>{for(let t of dl(e)){let i=al(e.state,t.from,t.to);if(i)return e.dispatch({effects:ml(e.state,[hl.of(i),gl(e,i)])}),!0}return!1}},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:e=>{if(!e.state.field(ul,!1))return!1;let t=[];for(let i of dl(e)){let n=pl(e.state,i.from,i.to);n&&t.push(cl.of(n),gl(e,n,!1))}return t.length&&e.dispatch({effects:t}),t.length>0}},{key:"Ctrl-Alt-[",run:e=>{let{state:t}=e,i=[];for(let n=0;n{let t=e.state.field(ul,!1);if(!t||!t.size)return!1;let i=[];return t.between(0,e.state.doc.length,((e,t)=>{i.push(cl.of({from:e,to:t}))})),e.dispatch({effects:i}),!0}}],Ol={placeholderDOM:null,preparePlaceholder:null,placeholderText:"…"},bl=q.define({combine:e=>be(e,Ol)});function _l(e){let t=[ul,Cl];return e&&t.push(bl.of(e)),t}function yl(e,t){let{state:i}=e,n=i.facet(bl),s=t=>{let i=e.lineBlockAt(e.posAtDOM(t.target)),n=pl(e.state,i.from,i.to);n&&e.dispatch({effects:cl.of(n)}),t.preventDefault()};if(n.placeholderDOM)return n.placeholderDOM(e,s,t);let r=document.createElement("span");return r.textContent=n.placeholderText,r.setAttribute("aria-label",i.phrase("folded code")),r.title=i.phrase("unfold"),r.className="cm-foldPlaceholder",r.onclick=s,r}const wl=Yt.replace({widget:new class extends Ht{toDOM(e){return yl(e,null)}}});class xl extends Ht{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return yl(e,this.value)}}const Sl={openText:"⌄",closedText:"›",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1};class kl extends Jr{constructor(e,t){super(),this.config=e,this.open=t}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let t=document.createElement("span");return t.textContent=this.open?this.config.openText:this.config.closedText,t.title=e.state.phrase(this.open?"Fold line":"Unfold line"),t}}function Tl(e={}){let t=Object.assign(Object.assign({},Sl),e),i=new kl(t,!0),n=new kl(t,!1),s=bi.fromClass(class{constructor(e){this.from=e.viewport.from,this.markers=this.buildMarkers(e)}update(e){(e.docChanged||e.viewportChanged||e.startState.facet(ja)!=e.state.facet(ja)||e.startState.field(ul,!1)!=e.state.field(ul,!1)||Da(e.startState)!=Da(e.state)||t.foldingChanged(e))&&(this.markers=this.buildMarkers(e.view))}buildMarkers(e){let t=new ke;for(let s of e.viewportLineBlocks){let r=pl(e.state,s.from,s.to)?n:al(e.state,s.from,s.to)?i:null;r&&t.add(s.from,s.from,r)}return t.finish()}}),{domEventHandlers:r}=t;return[s,no({class:"cm-foldGutter",markers(e){var t;return(null===(t=e.plugin(s))||void 0===t?void 0:t.markers)||Se.empty},initialSpacer:()=>new kl(t,!1),domEventHandlers:Object.assign(Object.assign({},r),{click:(e,t,i)=>{if(r.click&&r.click(e,t,i))return!0;let n=pl(e.state,t.from,t.to);if(n)return e.dispatch({effects:cl.of(n)}),!0;let s=al(e.state,t.from,t.to);return!!s&&(e.dispatch({effects:hl.of(s)}),!0)}})}),_l()]}const Cl=Ds.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}});class Pl{constructor(e,t){let i;function n(e){let t=ze.newName();return(i||(i=Object.create(null)))["."+t]=e,t}this.specs=e;const s="string"==typeof t.all?t.all:t.all?n(t.all):void 0,r=t.scope;this.scope=r instanceof Ea?e=>e.prop(Pa)==r.data:r?e=>e==r:void 0,this.style=la(e.map((e=>({tag:e.tag,class:e.class||n(Object.assign({},e,{tag:null}))}))),{all:s}).style,this.module=i?new ze(i):null,this.themeType=t.themeType}static define(e,t){return new Pl(e,t||{})}}const Ml=q.define(),El=q.define({combine:e=>e.length?[e[0]]:null});function Al(e){let t=e.facet(Ml);return t.length?t:e.facet(El)}function Rl(e,t){let i,n=[Il];return e instanceof Pl&&(e.module&&n.push(Ds.styleModule.of(e.module)),i=e.themeType),(null==t?void 0:t.fallback)?n.push(El.of(e)):i?n.push(Ml.computeN([Ds.darkTheme],(t=>t.facet(Ds.darkTheme)==("dark"==i)?[e]:[]))):n.push(Ml.of(e)),n}class Dl{constructor(e){this.markCache=Object.create(null),this.tree=Da(e.state),this.decorations=this.buildDeco(e,Al(e.state))}update(e){let t=Da(e.state),i=Al(e.state),n=i!=Al(e.startState);t.length{i.add(e,t,this.markCache[n]||(this.markCache[n]=Yt.mark({class:n})))}),n,s);return i.finish()}}const Il=V.high(bi.fromClass(Dl,{decorations:e=>e.decorations})),ql=Pl.define([{tag:Ta.meta,color:"#404740"},{tag:Ta.link,textDecoration:"underline"},{tag:Ta.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Ta.emphasis,fontStyle:"italic"},{tag:Ta.strong,fontWeight:"bold"},{tag:Ta.strikethrough,textDecoration:"line-through"},{tag:Ta.keyword,color:"#708"},{tag:[Ta.atom,Ta.bool,Ta.url,Ta.contentSeparator,Ta.labelName],color:"#219"},{tag:[Ta.literal,Ta.inserted],color:"#164"},{tag:[Ta.string,Ta.deleted],color:"#a11"},{tag:[Ta.regexp,Ta.escape,Ta.special(Ta.string)],color:"#e40"},{tag:Ta.definition(Ta.variableName),color:"#00f"},{tag:Ta.local(Ta.variableName),color:"#30a"},{tag:[Ta.typeName,Ta.namespace],color:"#085"},{tag:Ta.className,color:"#167"},{tag:[Ta.special(Ta.variableName),Ta.macroName],color:"#256"},{tag:Ta.definition(Ta.propertyName),color:"#00c"},{tag:Ta.comment,color:"#940"},{tag:Ta.invalid,color:"#f00"}]),Ll=Ds.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Nl=1e4,Bl="()[]{}",$l=q.define({combine:e=>be(e,{afterCursor:!0,brackets:Bl,maxScanDistance:Nl,renderMatch:jl})}),Ql=Yt.mark({class:"cm-matchingBracket"}),zl=Yt.mark({class:"cm-nonmatchingBracket"});function jl(e){let t=[],i=e.matched?Ql:zl;return t.push(i.range(e.start.from,e.start.to)),e.end&&t.push(i.range(e.end.from,e.end.to)),t}const Wl=j.define({create:()=>Yt.none,update(e,t){if(!t.docChanged&&!t.selection)return e;let i=[],n=t.state.facet($l);for(let e of t.state.selection.ranges){if(!e.empty)continue;let s=Yl(t.state,e.head,-1,n)||e.head>0&&Yl(t.state,e.head-1,1,n)||n.afterCursor&&(Yl(t.state,e.head,1,n)||e.headDs.decorations.from(e)}),Vl=[Wl,Ll];function Ul(e={}){return[$l.of(e),Vl]}const Fl=new ko;function Hl(e,t,i){let n=e.prop(t<0?ko.openedBy:ko.closedBy);if(n)return n;if(1==e.name.length){let n=i.indexOf(e.name);if(n>-1&&n%2==(t<0?1:0))return[i[n+t]]}return null}function Xl(e){let t=e.type.prop(Fl);return t?t(e.node):e}function Yl(e,t,i,n={}){let s=n.maxScanDistance||Nl,r=n.brackets||Bl,o=Da(e),a=o.resolveInner(t,i);for(let e=a;e;e=e.parent){let n=Hl(e.type,i,r);if(n&&e.from0?t>=s.from&&ts.from&&t<=s.to))return Gl(0,0,i,e,s,n,r)}}return function(e,t,i,n,s,r,o){let a=i<0?e.sliceDoc(t-1,t):e.sliceDoc(t,t+1),l=o.indexOf(a);if(l<0||l%2==0!=i>0)return null;let h={from:i<0?t-1:t,to:i>0?t+1:t},c=e.doc.iterRange(t,i>0?e.doc.length:0),d=0;for(let e=0;!c.next().done&&e<=r;){let r=c.value;i<0&&(e+=r.length);let a=t+e*i;for(let e=i>0?0:r.length-1,t=i>0?r.length:-1;e!=t;e+=i){let t=o.indexOf(r[e]);if(!(t<0||n.resolveInner(a+e,1).type!=s))if(t%2==0==i>0)d++;else{if(1==d)return{start:h,end:{from:a+e,to:a+e+1},matched:t>>1==l>>1};d--}}i>0&&(e+=r.length)}return c.done?{start:h,matched:!1}:null}(e,t,i,o,a.type,s,r)}function Gl(e,t,i,n,s,r,o){let a=n.parent,l={from:s.from,to:s.to},h=0,c=null==a?void 0:a.cursor();if(c&&(i<0?c.childBefore(n.from):c.childAfter(n.to)))do{if(i<0?c.to<=n.from:c.from>=n.to){if(0==h&&r.indexOf(c.type.name)>-1&&c.from-1||(Jl.push(e),console.warn(t))}function ih(e,t){let i=[];for(let n of t.split(" ")){let t=[];for(let i of n.split(".")){let n=e[i]||Ta[i];n?"function"==typeof n?t.length?t=t.map(n):th(i,`Modifier ${i} used at start of tag`):t.length?th(i,`Tag ${i} used as modifier`):t=Array.isArray(n)?n:[n]:th(i,`Unknown highlighting tag ${i}`)}for(let e of t)i.push(e)}if(!i.length)return 0;let n=t.replace(/ /g,"_"),s=Po.define({id:Kl.length,name:n,props:[ra({[n]:i})]});return Kl.push(s),s.id}function nh(e,t){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=e(t,i);return!!s&&(n(i.update(s)),!0)}}const sh=nh(ch,0),rh=nh(hh,0),oh=nh(((e,t)=>hh(e,t,function(e){let t=[];for(let i of e.selection.ranges){let n=e.doc.lineAt(i.from),s=i.to<=n.to?n:e.doc.lineAt(i.to),r=t.length-1;r>=0&&t[r].to>n.from?t[r].to=s.to:t.push({from:n.from+/^\s*/.exec(n.text)[0].length,to:s.to})}return t}(t))),0);function ah(e,t){let i=e.languageDataAt("commentTokens",t);return i.length?i[0]:{}}const lh=50;function hh(e,t,i=t.selection.ranges){let n=i.map((e=>ah(t,e.from).block));if(!n.every((e=>e)))return null;let s=i.map(((e,i)=>function(e,{open:t,close:i},n,s){let r,o,a=e.sliceDoc(n-lh,n),l=e.sliceDoc(s,s+lh),h=/\s*$/.exec(a)[0].length,c=/^\s*/.exec(l)[0].length,d=a.length-h;if(a.slice(d-t.length,d)==t&&l.slice(c,c+i.length)==i)return{open:{pos:n-h,margin:h&&1},close:{pos:s+c,margin:c&&1}};s-n<=2*lh?r=o=e.sliceDoc(n,s):(r=e.sliceDoc(n,n+lh),o=e.sliceDoc(s-lh,s));let u=/^\s*/.exec(r)[0].length,p=/\s*$/.exec(o)[0].length,f=o.length-p-i.length;return r.slice(u,u+t.length)==t&&o.slice(f,f+i.length)==i?{open:{pos:n+u+t.length,margin:/\s/.test(r.charAt(u+t.length))?1:0},close:{pos:s-p-i.length,margin:/\s/.test(o.charAt(f-1))?1:0}}:null}(t,n[i],e.from,e.to)));if(2!=e&&!s.every((e=>e)))return{changes:t.changes(i.map(((e,t)=>s[t]?[]:[{from:e.from,insert:n[t].open+" "},{from:e.to,insert:" "+n[t].close}])))};if(1!=e&&s.some((e=>e))){let e=[];for(let t,i=0;is&&(e==r||r>l.from)){s=l.from;let e=/^\s*/.exec(l.text)[0].length,t=e==l.length,i=l.text.slice(e,e+a.length)==a?e:-1;ee.comment<0&&(!e.empty||e.single)))){let e=[];for(let{line:t,token:i,indent:s,empty:r,single:o}of n)!o&&r||e.push({from:t.from+s,insert:i+" "});let i=t.changes(e);return{changes:i,selection:t.selection.map(i,1)}}if(1!=e&&n.some((e=>e.comment>=0))){let e=[];for(let{line:t,comment:i,token:s}of n)if(i>=0){let n=t.from+i,r=n+s.length;" "==t.text[r-t.from]&&r++,e.push({from:n,to:r})}return{changes:e}}return null}const dh=se.define(),uh=se.define(),ph=q.define(),fh=q.define({combine:e=>be(e,{minDepth:100,newGroupDelay:500,joinToEvent:(e,t)=>t},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(e,t)=>(i,n)=>e(i,n)||t(i,n)})}),mh=j.define({create:()=>Rh.empty,update(e,t){let i=t.state.facet(fh),n=t.annotation(dh);if(n){let s=t.docChanged?R.single(function(e){let t=0;return e.iterChangedRanges(((e,i)=>t=i)),t}(t.changes)):void 0,r=wh.fromTransaction(t,s),o=n.side,a=0==o?e.undone:e.done;return a=r?xh(a,a.length,i.minDepth,r):Ch(a,t.startState.selection),new Rh(0==o?n.rest:a,0==o?a:n.rest)}let s=t.annotation(uh);if("full"!=s&&"before"!=s||(e=e.isolate()),!1===t.annotation(le.addToHistory))return t.changes.empty?e:e.addMapping(t.changes.desc);let r=wh.fromTransaction(t),o=t.annotation(le.time),a=t.annotation(le.userEvent);return r?e=e.addChanges(r,o,a,i,t):t.selection&&(e=e.addSelection(t.startState.selection,o,a,i.newGroupDelay)),"full"!=s&&"after"!=s||(e=e.isolate()),e},toJSON:e=>({done:e.done.map((e=>e.toJSON())),undone:e.undone.map((e=>e.toJSON()))}),fromJSON:e=>new Rh(e.done.map(wh.fromJSON),e.undone.map(wh.fromJSON))});function gh(e={}){return[mh,fh.of(e),Ds.domEventHandlers({beforeinput(e,t){let i="historyUndo"==e.inputType?Oh:"historyRedo"==e.inputType?bh:null;return!!i&&(e.preventDefault(),i(t))}})]}function vh(e,t){return function({state:i,dispatch:n}){if(!t&&i.readOnly)return!1;let s=i.field(mh,!1);if(!s)return!1;let r=s.pop(e,i,t);return!!r&&(n(r),!0)}}const Oh=vh(0,!1),bh=vh(1,!1),_h=vh(0,!0),yh=vh(1,!0);class wh{constructor(e,t,i,n,s){this.changes=e,this.effects=t,this.mapped=i,this.startSelection=n,this.selectionsAfter=s}setSelAfter(e){return new wh(this.changes,this.effects,this.mapped,this.startSelection,e)}toJSON(){var e,t,i;return{changes:null===(e=this.changes)||void 0===e?void 0:e.toJSON(),mapped:null===(t=this.mapped)||void 0===t?void 0:t.toJSON(),startSelection:null===(i=this.startSelection)||void 0===i?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map((e=>e.toJSON()))}}static fromJSON(e){return new wh(e.changes&&S.fromJSON(e.changes),[],e.mapped&&x.fromJSON(e.mapped),e.startSelection&&R.fromJSON(e.startSelection),e.selectionsAfter.map(R.fromJSON))}static fromTransaction(e,t){let i=kh;for(let t of e.startState.facet(ph)){let n=t(e);n.length&&(i=i.concat(n))}return!i.length&&e.changes.empty?null:new wh(e.changes.invert(e.startState.doc),i,void 0,t||e.startState.selection,kh)}static selection(e){return new wh(void 0,kh,void 0,void 0,e)}}function xh(e,t,i,n){let s=t+1>i+20?t-i-1:0,r=e.slice(s,t);return r.push(n),r}function Sh(e,t){return e.length?t.length?e.concat(t):e:t}const kh=[],Th=200;function Ch(e,t){if(e.length){let i=e[e.length-1],n=i.selectionsAfter.slice(Math.max(0,i.selectionsAfter.length-Th));return n.length&&n[n.length-1].eq(t)?e:(n.push(t),xh(e,e.length-1,1e9,i.setSelAfter(n)))}return[wh.selection([t])]}function Ph(e){let t=e[e.length-1],i=e.slice();return i[e.length-1]=t.setSelAfter(t.selectionsAfter.slice(0,t.selectionsAfter.length-1)),i}function Mh(e,t){if(!e.length)return e;let i=e.length,n=kh;for(;i;){let s=Eh(e[i-1],t,n);if(s.changes&&!s.changes.empty||s.effects.length){let t=e.slice(0,i);return t[i-1]=s,t}t=s.mapped,i--,n=s.selectionsAfter}return n.length?[wh.selection(n)]:kh}function Eh(e,t,i){let n=Sh(e.selectionsAfter.length?e.selectionsAfter.map((e=>e.map(t))):kh,i);if(!e.changes)return wh.selection(n);let s=e.changes.map(t),r=t.mapDesc(e.changes,!0),o=e.mapped?e.mapped.composeDesc(r):r;return new wh(s,ae.mapEffects(e.effects,t),o,e.startSelection.map(r),n)}const Ah=/^(input\.type|delete)($|\.)/;class Rh{constructor(e,t,i=0,n=void 0){this.done=e,this.undone=t,this.prevTime=i,this.prevUserEvent=n}isolate(){return this.prevTime?new Rh(this.done,this.undone):this}addChanges(e,t,i,n,s){let r=this.done,o=r[r.length-1];return r=o&&o.changes&&!o.changes.empty&&e.changes&&(!i||Ah.test(i))&&(!o.selectionsAfter.length&&t-this.prevTimei.push(e,t))),t.iterChangedRanges(((e,t,s,r)=>{for(let e=0;e=t&&s<=o&&(n=!0)}})),n}(o.changes,e.changes))||"input.type.compose"==i)?xh(r,r.length-1,n.minDepth,new wh(e.changes.compose(o.changes),Sh(e.effects,o.effects),o.mapped,o.startSelection,kh)):xh(r,r.length,n.minDepth,e),new Rh(r,kh,t,i)}addSelection(e,t,i,n){let s=this.done.length?this.done[this.done.length-1].selectionsAfter:kh;return s.length>0&&t-this.prevTimee.empty!=o.ranges[t].empty)).length)?this:new Rh(Ch(this.done,e),this.undone,t,i);var r,o}addMapping(e){return new Rh(Mh(this.done,e),Mh(this.undone,e),this.prevTime,this.prevUserEvent)}pop(e,t,i){let n=0==e?this.done:this.undone;if(0==n.length)return null;let s=n[n.length-1];if(i&&s.selectionsAfter.length)return t.update({selection:s.selectionsAfter[s.selectionsAfter.length-1],annotations:dh.of({side:e,rest:Ph(n)}),userEvent:0==e?"select.undo":"select.redo",scrollIntoView:!0});if(s.changes){let i=1==n.length?kh:n.slice(0,n.length-1);return s.mapped&&(i=Mh(i,s.mapped)),t.update({changes:s.changes,selection:s.startSelection,effects:s.effects,annotations:dh.of({side:e,rest:i}),filter:!1,userEvent:0==e?"undo":"redo",scrollIntoView:!0})}return null}}Rh.empty=new Rh(kh,kh);const Dh=[{key:"Mod-z",run:Oh,preventDefault:!0},{key:"Mod-y",mac:"Mod-Shift-z",run:bh,preventDefault:!0},{linux:"Ctrl-Shift-z",run:bh,preventDefault:!0},{key:"Mod-u",run:_h,preventDefault:!0},{key:"Alt-u",mac:"Mod-Shift-u",run:yh,preventDefault:!0}];function Ih(e,t){return R.create(e.ranges.map(t),e.mainIndex)}function qh(e,t){return e.update({selection:t,scrollIntoView:!0,userEvent:"select"})}function Lh({state:e,dispatch:t},i){let n=Ih(e.selection,i);return!n.eq(e.selection)&&(t(qh(e,n)),!0)}function Nh(e,t){return R.cursor(t?e.to:e.from)}function Bh(e,t){return Lh(e,(i=>i.empty?e.moveByChar(i,t):Nh(i,t)))}function $h(e){return e.textDirectionAt(e.state.selection.main.head)==Ri.LTR}const Qh=e=>Bh(e,!$h(e)),zh=e=>Bh(e,$h(e));function jh(e,t){return Lh(e,(i=>i.empty?e.moveByGroup(i,t):Nh(i,t)))}function Wh(e,t,i){if(t.type.prop(i))return!0;let n=t.to-t.from;return n&&(n>2||/[^\s,.;:]/.test(e.sliceDoc(t.from,t.to)))||t.firstChild}function Vh(e,t,i){let n,s,r=Da(e).resolveInner(t.head),o=i?ko.closedBy:ko.openedBy;for(let n=t.head;;){let t=i?r.childAfter(n):r.childBefore(n);if(!t)break;Wh(e,t,o)?r=t:n=i?t.to:t.from}return s=r.type.prop(o)&&(n=i?Yl(e,r.from,1):Yl(e,r.to,-1))&&n.matched?i?n.end.to:n.end.from:i?r.to:r.from,R.cursor(s,i?-1:1)}function Uh(e,t){return Lh(e,(i=>{if(!i.empty)return Nh(i,t);let n=e.moveVertically(i,t);return n.head!=i.head?n:e.moveToLineBoundary(i,t)}))}"undefined"!=typeof Intl&&Intl.Segmenter;const Fh=e=>Uh(e,!1),Hh=e=>Uh(e,!0);function Xh(e){let t,i=e.scrollDOM.clientHeighti.empty?e.moveVertically(i,t,n.height):Nh(i,t)));if(r.eq(s.selection))return!1;if(n.selfScroll){let t=e.coordsAtPos(s.selection.main.head),o=e.scrollDOM.getBoundingClientRect(),a=o.top+n.marginTop,l=o.bottom-n.marginBottom;t&&t.top>a&&t.bottomYh(e,!1),Zh=e=>Yh(e,!0);function Kh(e,t,i){let n=e.lineBlockAt(t.head),s=e.moveToLineBoundary(t,i);if(s.head==t.head&&s.head!=(i?n.to:n.from)&&(s=e.moveToLineBoundary(t,i,!1)),!i&&s.head==n.from&&n.length){let i=/^\s*/.exec(e.state.sliceDoc(n.from,Math.min(n.from+100,n.to)))[0].length;i&&t.head!=n.from+i&&(s=R.cursor(n.from+i))}return s}function Jh(e,t){let i=Ih(e.state.selection,(e=>{let i=t(e);return R.range(e.anchor,i.head,i.goalColumn,i.bidiLevel||void 0)}));return!i.eq(e.state.selection)&&(e.dispatch(qh(e.state,i)),!0)}function ec(e,t){return Jh(e,(i=>e.moveByChar(i,t)))}const tc=e=>ec(e,!$h(e)),ic=e=>ec(e,$h(e));function nc(e,t){return Jh(e,(i=>e.moveByGroup(i,t)))}function sc(e,t){return Jh(e,(i=>e.moveVertically(i,t)))}const rc=e=>sc(e,!1),oc=e=>sc(e,!0);function ac(e,t){return Jh(e,(i=>e.moveVertically(i,t,Xh(e).height)))}const lc=e=>ac(e,!1),hc=e=>ac(e,!0),cc=({state:e,dispatch:t})=>(t(qh(e,{anchor:0})),!0),dc=({state:e,dispatch:t})=>(t(qh(e,{anchor:e.doc.length})),!0),uc=({state:e,dispatch:t})=>(t(qh(e,{anchor:e.selection.main.anchor,head:0})),!0),pc=({state:e,dispatch:t})=>(t(qh(e,{anchor:e.selection.main.anchor,head:e.doc.length})),!0);function fc(e,t){if(e.state.readOnly)return!1;let i="delete.selection",{state:n}=e,s=n.changeByRange((n=>{let{from:s,to:r}=n;if(s==r){let o=t(n);os&&(i="delete.forward",o=mc(e,o,!0)),s=Math.min(s,o),r=Math.max(r,o)}else s=mc(e,s,!1),r=mc(e,r,!0);return s==r?{range:n}:{changes:{from:s,to:r},range:R.cursor(s,st(e))))n.between(t,t,((e,n)=>{et&&(t=i?n:e)}));return t}const gc=(e,t)=>fc(e,(i=>{let n,s,r=i.from,{state:o}=e,a=o.doc.lineAt(r);if(!t&&r>a.from&&rgc(e,!1),Oc=e=>gc(e,!0),bc=(e,t)=>fc(e,(i=>{let n=i.head,{state:s}=e,r=s.doc.lineAt(n),o=s.charCategorizer(n);for(let e=null;;){if(n==(t?r.to:r.from)){n==i.head&&r.number!=(t?s.doc.lines:1)&&(n+=t?1:-1);break}let a=p(r.text,n-r.from,t)+r.from,l=r.text.slice(Math.min(n,a)-r.from,Math.max(n,a)-r.from),h=o(l);if(null!=e&&h!=e)break;" "==l&&n==i.head||(e=h),n=a}return n})),_c=e=>bc(e,!1);function yc(e){let t=[],i=-1;for(let n of e.selection.ranges){let s=e.doc.lineAt(n.from),r=e.doc.lineAt(n.to);if(n.empty||n.to!=r.from||(r=e.doc.lineAt(n.to-1)),i>=s.number){let e=t[t.length-1];e.to=r.to,e.ranges.push(n)}else t.push({from:s.from,to:r.to,ranges:[n]});i=r.number+1}return t}function wc(e,t,i){if(e.readOnly)return!1;let n=[],s=[];for(let t of yc(e)){if(i?t.to==e.doc.length:0==t.from)continue;let r=e.doc.lineAt(i?t.to+1:t.from-1),o=r.length+1;if(i){n.push({from:t.to,to:r.to},{from:t.from,insert:r.text+e.lineBreak});for(let i of t.ranges)s.push(R.range(Math.min(e.doc.length,i.anchor+o),Math.min(e.doc.length,i.head+o)))}else{n.push({from:r.from,to:t.from},{from:t.to,insert:e.lineBreak+r.text});for(let e of t.ranges)s.push(R.range(e.anchor-o,e.head-o))}}return!!n.length&&(t(e.update({changes:n,scrollIntoView:!0,selection:R.create(s,e.selection.mainIndex),userEvent:"move.line"})),!0)}function xc(e,t,i){if(e.readOnly)return!1;let n=[];for(let t of yc(e))i?n.push({from:t.from,insert:e.doc.slice(t.from,t.to)+e.lineBreak}):n.push({from:t.to,insert:e.lineBreak+e.doc.slice(t.from,t.to)});return t(e.update({changes:n,scrollIntoView:!0,userEvent:"input.copyline"})),!0}const Sc=kc(!1);function kc(t){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=i.changeByRange((n=>{let{from:s,to:r}=n,o=i.doc.lineAt(s),a=!t&&s==r&&function(e,t){if(/\(\)|\[\]|\{\}/.test(e.sliceDoc(t-1,t+1)))return{from:t,to:t};let i,n=Da(e).resolveInner(t),s=n.childBefore(t),r=n.childAfter(t);return s&&r&&s.to<=t&&r.from>=t&&(i=s.type.prop(ko.closedBy))&&i.indexOf(r.name)>-1&&e.doc.lineAt(s.to).from==e.doc.lineAt(r.from).from&&!/\S/.test(e.sliceDoc(s.to,r.from))?{from:s.to,to:r.from}:null}(i,s);t&&(s=r=(r<=o.to?o:i.doc.lineAt(r)).to);let l=new Ya(i,{simulateBreak:s,simulateDoubleBreak:!!a}),h=Xa(l,s);for(null==h&&(h=Le(/^\s*/.exec(i.doc.lineAt(s).text)[0],i.tabSize));ro.from&&s{let s=[];for(let r=n.from;r<=n.to;){let o=e.doc.lineAt(r);o.number>i&&(n.empty||n.to>o.from)&&(t(o,s,n),i=o.number),r=o.to+1}let r=e.changes(s);return{changes:s,range:R.range(r.mapPos(n.anchor,1),r.mapPos(n.head,1))}}))}const Cc=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:e=>Lh(e,(t=>Vh(e.state,t,!$h(e)))),shift:e=>Jh(e,(t=>Vh(e.state,t,!$h(e))))},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:e=>Lh(e,(t=>Vh(e.state,t,$h(e)))),shift:e=>Jh(e,(t=>Vh(e.state,t,$h(e))))},{key:"Alt-ArrowUp",run:({state:e,dispatch:t})=>wc(e,t,!1)},{key:"Shift-Alt-ArrowUp",run:({state:e,dispatch:t})=>xc(e,t,!1)},{key:"Alt-ArrowDown",run:({state:e,dispatch:t})=>wc(e,t,!0)},{key:"Shift-Alt-ArrowDown",run:({state:e,dispatch:t})=>xc(e,t,!0)},{key:"Escape",run:({state:e,dispatch:t})=>{let i=e.selection,n=null;return i.ranges.length>1?n=R.create([i.main]):i.main.empty||(n=R.create([R.cursor(i.main.head)])),!!n&&(t(qh(e,n)),!0)}},{key:"Mod-Enter",run:kc(!0)},{key:"Alt-l",mac:"Ctrl-l",run:({state:e,dispatch:t})=>{let i=yc(e).map((({from:t,to:i})=>R.range(t,Math.min(i+1,e.doc.length))));return t(e.update({selection:R.create(i),userEvent:"select"})),!0}},{key:"Mod-i",run:({state:e,dispatch:t})=>{let i=Ih(e.selection,(t=>{var i;for(let n=Da(e).resolveStack(t.from,1);n;n=n.next){let{node:e}=n;if((e.from=t.to||e.to>t.to&&e.from<=t.from)&&(null===(i=e.parent)||void 0===i?void 0:i.parent))return R.range(e.to,e.from)}return t}));return t(qh(e,i)),!0},preventDefault:!0},{key:"Mod-[",run:({state:e,dispatch:t})=>!e.readOnly&&(t(e.update(Tc(e,((t,i)=>{let n=/^\s*/.exec(t.text)[0];if(!n)return;let s=Le(n,e.tabSize),r=0,o=Ha(e,Math.max(0,s-Fa(e)));for(;r!e.readOnly&&(t(e.update(Tc(e,((t,i)=>{i.push({from:t.from,insert:e.facet(Ua)})})),{userEvent:"input.indent"})),!0)},{key:"Mod-Alt-\\",run:({state:e,dispatch:t})=>{if(e.readOnly)return!1;let i=Object.create(null),n=new Ya(e,{overrideIndentation:e=>{let t=i[e];return null==t?-1:t}}),s=Tc(e,((t,s,r)=>{let o=Xa(n,t.from);if(null==o)return;/\S/.test(t.text)||(o=0);let a=/^\s*/.exec(t.text)[0],l=Ha(e,o);(a!=l||r.from{if(e.state.readOnly)return!1;let{state:t}=e,i=t.changes(yc(t).map((({from:e,to:i})=>(e>0?e--:ie.moveVertically(t,!0))).map(i);return e.dispatch({changes:i,selection:n,scrollIntoView:!0,userEvent:"delete.line"}),!0}},{key:"Shift-Mod-\\",run:({state:e,dispatch:t})=>function(e,t,i){let n=!1,s=Ih(e.selection,(t=>{let s=Yl(e,t.head,-1)||Yl(e,t.head,1)||t.head>0&&Yl(e,t.head-1,1)||t.head{let{state:t}=e,i=t.doc.lineAt(t.selection.main.from),n=ah(e.state,i.from);return n.line?sh(e):!!n.block&&oh(e)}},{key:"Alt-A",run:rh}].concat([{key:"ArrowLeft",run:Qh,shift:tc,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:e=>jh(e,!$h(e)),shift:e=>nc(e,!$h(e)),preventDefault:!0},{mac:"Cmd-ArrowLeft",run:e=>Lh(e,(t=>Kh(e,t,!$h(e)))),shift:e=>Jh(e,(t=>Kh(e,t,!$h(e)))),preventDefault:!0},{key:"ArrowRight",run:zh,shift:ic,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:e=>jh(e,$h(e)),shift:e=>nc(e,$h(e)),preventDefault:!0},{mac:"Cmd-ArrowRight",run:e=>Lh(e,(t=>Kh(e,t,$h(e)))),shift:e=>Jh(e,(t=>Kh(e,t,$h(e)))),preventDefault:!0},{key:"ArrowUp",run:Fh,shift:rc,preventDefault:!0},{mac:"Cmd-ArrowUp",run:cc,shift:uc},{mac:"Ctrl-ArrowUp",run:Gh,shift:lc},{key:"ArrowDown",run:Hh,shift:oc,preventDefault:!0},{mac:"Cmd-ArrowDown",run:dc,shift:pc},{mac:"Ctrl-ArrowDown",run:Zh,shift:hc},{key:"PageUp",run:Gh,shift:lc},{key:"PageDown",run:Zh,shift:hc},{key:"Home",run:e=>Lh(e,(t=>Kh(e,t,!1))),shift:e=>Jh(e,(t=>Kh(e,t,!1))),preventDefault:!0},{key:"Mod-Home",run:cc,shift:uc},{key:"End",run:e=>Lh(e,(t=>Kh(e,t,!0))),shift:e=>Jh(e,(t=>Kh(e,t,!0))),preventDefault:!0},{key:"Mod-End",run:dc,shift:pc},{key:"Enter",run:Sc},{key:"Mod-a",run:({state:e,dispatch:t})=>(t(e.update({selection:{anchor:0,head:e.doc.length},userEvent:"select"})),!0)},{key:"Backspace",run:vc,shift:vc},{key:"Delete",run:Oc},{key:"Mod-Backspace",mac:"Alt-Backspace",run:_c},{key:"Mod-Delete",mac:"Alt-Delete",run:e=>bc(e,!0)},{mac:"Mod-Backspace",run:e=>fc(e,(t=>{let i=e.moveToLineBoundary(t,!1).head;return t.head>i?i:Math.max(0,t.head-1)}))},{mac:"Mod-Delete",run:e=>fc(e,(t=>{let i=e.moveToLineBoundary(t,!0).head;return t.headLh(e,(t=>R.cursor(e.lineBlockAt(t.head).from,1))),shift:e=>Jh(e,(t=>R.cursor(e.lineBlockAt(t.head).from)))},{key:"Ctrl-e",run:e=>Lh(e,(t=>R.cursor(e.lineBlockAt(t.head).to,-1))),shift:e=>Jh(e,(t=>R.cursor(e.lineBlockAt(t.head).to)))},{key:"Ctrl-d",run:Oc},{key:"Ctrl-h",run:vc},{key:"Ctrl-k",run:e=>fc(e,(t=>{let i=e.lineBlockAt(t.head).to;return t.head{if(t.readOnly)return!1;let n=t.changeByRange((t=>({changes:{from:t.from,to:t.to,insert:e.of(["",""])},range:R.cursor(t.from)})));return i(t.update(n,{scrollIntoView:!0,userEvent:"input"})),!0}},{key:"Ctrl-t",run:({state:e,dispatch:t})=>{if(e.readOnly)return!1;let i=e.changeByRange((t=>{if(!t.empty||0==t.from||t.from==e.doc.length)return{range:t};let i=t.from,n=e.doc.lineAt(i),s=i==n.from?i-1:p(n.text,i-n.from,!1)+n.from,r=i==n.to?i+1:p(n.text,i-n.from,!0)+n.from;return{changes:{from:s,to:r,insert:e.doc.slice(i,r).append(e.doc.slice(s,i))},range:R.cursor(r)}}));return!i.changes.empty&&(t(e.update(i,{scrollIntoView:!0,userEvent:"move.character"})),!0)}},{key:"Ctrl-v",run:Zh}].map((e=>({mac:e.key,run:e.run,shift:e.shift})))));function Pc(){var e=arguments[0];"string"==typeof e&&(e=document.createElement(e));var t=1,i=arguments[1];if(i&&"object"==typeof i&&null==i.nodeType&&!Array.isArray(i)){for(var n in i)if(Object.prototype.hasOwnProperty.call(i,n)){var s=i[n];"string"==typeof s?e.setAttribute(n,s):null!=s&&(e[n]=s)}t++}for(;te.normalize("NFKD"):e=>e;class Ac{constructor(e,t,i=0,n=e.length,s,r){this.test=r,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,n),this.bufferStart=i,this.normalize=s?e=>s(Ec(e)):Ec,this.query=this.normalize(t)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return O(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let t=b(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=_(e);let n=this.normalize(t);for(let e=0,s=i;;e++){let r=n.charCodeAt(e),o=this.match(r,s);if(e==n.length-1){if(o)return this.value=o,this;break}s==i&&ethis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let t=this.matchPos<=this.to&&this.re.exec(this.curLine);if(t){let i=this.curLineStart+t.index,n=i+t[0].length;if(this.matchPos=Bc(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,n,t)))return this.value={from:i,to:n,match:t},this;e=this.matchPos-this.curLineStart}else{if(!(this.curLineStart+this.curLine.length=i||n.to<=t){let n=new Lc(t,e.sliceString(t,i));return qc.set(e,n),n}if(n.from==t&&n.to==i)return n;let{text:s,from:r}=n;return r>t&&(s=e.sliceString(t,r)+s,r=t),n.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,t=this.re.exec(this.flat.text);if(t&&!t[0]&&t.index==e&&(this.re.lastIndex=e+1,t=this.re.exec(this.flat.text)),t){let e=this.flat.from+t.index,i=e+t[0].length;if((this.flat.to>=this.to||t.index+t[0].length<=this.flat.text.length-10)&&(!this.test||this.test(e,i,t)))return this.value={from:e,to:i,match:t},this.matchPos=Bc(this.text,i+(e==i?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=Lc.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+2*this.flat.text.length))}}}function Bc(e,t){if(t>=e.length)return t;let i,n=e.lineAt(t);for(;t=56320&&i<57344;)t++;return t}function $c(e){let t=Pc("input",{class:"cm-textfield",name:"line",value:String(e.state.doc.lineAt(e.state.selection.main.head).number)});function i(){let i=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(t.value);if(!i)return;let{state:n}=e,s=n.doc.lineAt(n.selection.main.head),[,r,o,a,l]=i,h=a?+a.slice(1):0,c=o?+o:s.number;if(o&&l){let e=c/100;r&&(e=e*("-"==r?-1:1)+s.number/n.doc.lines),c=Math.round(n.doc.lines*e)}else o&&r&&(c=c*("-"==r?-1:1)+s.number);let d=n.doc.line(Math.max(1,Math.min(n.doc.lines,c))),u=R.cursor(d.from+Math.max(0,Math.min(h,d.length)));e.dispatch({effects:[Qc.of(!1),Ds.scrollIntoView(u.from,{y:"center"})],selection:u}),e.focus()}return{dom:Pc("form",{class:"cm-gotoLine",onkeydown:t=>{27==t.keyCode?(t.preventDefault(),e.dispatch({effects:Qc.of(!1)}),e.focus()):13==t.keyCode&&(t.preventDefault(),i())},onsubmit:e=>{e.preventDefault(),i()}},Pc("label",e.state.phrase("Go to line"),": ",t)," ",Pc("button",{class:"cm-button",type:"submit"},e.state.phrase("go")))}}"undefined"!=typeof Symbol&&(Ic.prototype[Symbol.iterator]=Nc.prototype[Symbol.iterator]=function(){return this});const Qc=ae.define(),zc=j.define({create:()=>!0,update(e,t){for(let i of t.effects)i.is(Qc)&&(e=i.value);return e},provide:e=>Kr.from(e,(e=>e?$c:null))}),jc=Ds.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px","& label":{fontSize:"80%"}}}),Wc={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},Vc=q.define({combine:e=>be(e,Wc,{highlightWordAroundCursor:(e,t)=>e||t,minSelectionLength:Math.min,maxMatches:Math.min})});function Uc(e){let t=[Gc,Yc];return e&&t.push(Vc.of(e)),t}const Fc=Yt.mark({class:"cm-selectionMatch"}),Hc=Yt.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function Xc(e,t,i,n){return!(0!=i&&e(t.sliceDoc(i-1,i))==me.Word||n!=t.doc.length&&e(t.sliceDoc(n,n+1))==me.Word)}const Yc=bi.fromClass(class{constructor(e){this.decorations=this.getDeco(e)}update(e){(e.selectionSet||e.docChanged||e.viewportChanged)&&(this.decorations=this.getDeco(e.view))}getDeco(e){let t=e.state.facet(Vc),{state:i}=e,n=i.selection;if(n.ranges.length>1)return Yt.none;let s,r=n.main,o=null;if(r.empty){if(!t.highlightWordAroundCursor)return Yt.none;let e=i.wordAt(r.head);if(!e)return Yt.none;o=i.charCategorizer(r.head),s=i.sliceDoc(e.from,e.to)}else{let e=r.to-r.from;if(e200)return Yt.none;if(t.wholeWords){if(s=i.sliceDoc(r.from,r.to),o=i.charCategorizer(r.head),!Xc(o,i,r.from,r.to)||!function(e,t,i,n){return e(t.sliceDoc(i,i+1))==me.Word&&e(t.sliceDoc(n-1,n))==me.Word}(o,i,r.from,r.to))return Yt.none}else if(s=i.sliceDoc(r.from,r.to).trim(),!s)return Yt.none}let a=[];for(let n of e.visibleRanges){let e=new Ac(i.doc,s,n.from,n.to);for(;!e.next().done;){let{from:n,to:s}=e.value;if((!o||Xc(o,i,n,s))&&(r.empty&&n<=r.from&&s>=r.to?a.push(Hc.range(n,s)):(n>=r.to||s<=r.from)&&a.push(Fc.range(n,s)),a.length>t.maxMatches))return Yt.none}}return Yt.set(a)}},{decorations:e=>e.decorations}),Gc=Ds.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),Zc=q.define({combine:e=>be(e,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new Td(e),scrollToMatch:e=>Ds.scrollIntoView(e)})});class Kc{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||function(e){try{return new RegExp(e,Dc),!0}catch(e){return!1}}(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,((e,t)=>"n"==t?"\n":"r"==t?"\r":"t"==t?"\t":"\\"))}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord}create(){return this.regexp?new rd(this):new td(this)}getCursor(e,t=0,i){let n=e.doc?e:Oe.create({doc:e});return null==i&&(i=n.doc.length),this.regexp?id(this,n,t,i):ed(this,n,t,i)}}class Jc{constructor(e){this.spec=e}}function ed(e,t,i,n){return new Ac(t.doc,e.unquoted,i,n,e.caseSensitive?void 0:e=>e.toLowerCase(),e.wholeWord?function(e,t){return(i,n,s,r)=>((r>i||r+s.length=t)return null;n.push(i.value)}return n}highlight(e,t,i,n){let s=ed(this.spec,e,Math.max(0,t-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}function id(e,t,i,n){return new Ic(t.doc,e.search,{ignoreCase:!e.caseSensitive,test:e.wholeWord?(s=t.charCategorizer(t.selection.main.head),(e,t,i)=>!i[0].length||(s(nd(i.input,i.index))!=me.Word||s(sd(i.input,i.index))!=me.Word)&&(s(sd(i.input,i.index+i[0].length))!=me.Word||s(nd(i.input,i.index+i[0].length))!=me.Word)):void 0},i,n);var s}function nd(e,t){return e.slice(p(e,t,!1),t)}function sd(e,t){return e.slice(t,p(e,t))}class rd extends Jc{nextMatch(e,t,i){let n=id(this.spec,e,i,e.doc.length).next();return n.done&&(n=id(this.spec,e,0,t).next()),n.done?null:n.value}prevMatchInRange(e,t,i){for(let n=1;;n++){let s=Math.max(t,i-1e4*n),r=id(this.spec,e,s,i),o=null;for(;!r.next().done;)o=r.value;if(o&&(s==t||o.from>s+10))return o;if(s==t)return null}}prevMatch(e,t,i){return this.prevMatchInRange(e,0,t)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace.replace(/\$([$&\d+])/g,((t,i)=>"$"==i?"$":"&"==i?e.match[0]:"0"!=i&&+i=t)return null;n.push(i.value)}return n}highlight(e,t,i,n){let s=id(this.spec,e,Math.max(0,t-250),Math.min(i+250,e.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}const od=ae.define(),ad=ae.define(),ld=j.define({create:e=>new hd(_d(e).create(),null),update(e,t){for(let i of t.effects)i.is(od)?e=new hd(i.value.create(),e.panel):i.is(ad)&&(e=new hd(e.query,i.value?bd:null));return e},provide:e=>Kr.from(e,(e=>e.panel))});class hd{constructor(e,t){this.query=e,this.panel=t}}const cd=Yt.mark({class:"cm-searchMatch"}),dd=Yt.mark({class:"cm-searchMatch cm-searchMatch-selected"}),ud=bi.fromClass(class{constructor(e){this.view=e,this.decorations=this.highlight(e.state.field(ld))}update(e){let t=e.state.field(ld);(t!=e.startState.field(ld)||e.docChanged||e.selectionSet||e.viewportChanged)&&(this.decorations=this.highlight(t))}highlight({query:e,panel:t}){if(!t||!e.spec.valid)return Yt.none;let{view:i}=this,n=new ke;for(let t=0,s=i.visibleRanges,r=s.length;ts[t+1].from-500;)a=s[++t].to;e.highlight(i.state,o,a,((e,t)=>{let s=i.state.selection.ranges.some((i=>i.from==e&&i.to==t));n.add(e,t,s?dd:cd)}))}return n.finish()}},{decorations:e=>e.decorations});function pd(e){return t=>{let i=t.state.field(ld,!1);return i&&i.query.spec.valid?e(t,i):xd(t)}}const fd=pd(((e,{query:t})=>{let{to:i}=e.state.selection.main,n=t.nextMatch(e.state,i,i);if(!n)return!1;let s=R.single(n.from,n.to),r=e.state.facet(Zc);return e.dispatch({selection:s,effects:[Ed(e,n),r.scrollToMatch(s.main,e)],userEvent:"select.search"}),wd(e),!0})),md=pd(((e,{query:t})=>{let{state:i}=e,{from:n}=i.selection.main,s=t.prevMatch(i,n,n);if(!s)return!1;let r=R.single(s.from,s.to),o=e.state.facet(Zc);return e.dispatch({selection:r,effects:[Ed(e,s),o.scrollToMatch(r.main,e)],userEvent:"select.search"}),wd(e),!0})),gd=pd(((e,{query:t})=>{let i=t.matchAll(e.state,1e3);return!(!i||!i.length||(e.dispatch({selection:R.create(i.map((e=>R.range(e.from,e.to)))),userEvent:"select.search.matches"}),0))})),vd=pd(((e,{query:t})=>{let{state:i}=e,{from:n,to:s}=i.selection.main;if(i.readOnly)return!1;let r=t.nextMatch(i,n,n);if(!r)return!1;let o,a,l=[],h=[];if(r.from==n&&r.to==s&&(a=i.toText(t.getReplacement(r)),l.push({from:r.from,to:r.to,insert:a}),r=t.nextMatch(i,r.from,r.to),h.push(Ds.announce.of(i.phrase("replaced match on line $",i.doc.lineAt(n).number)+"."))),r){let t=0==l.length||l[0].from>=r.to?0:r.to-r.from-a.length;o=R.single(r.from-t,r.to-t),h.push(Ed(e,r)),h.push(i.facet(Zc).scrollToMatch(o.main,e))}return e.dispatch({changes:l,selection:o,effects:h,userEvent:"input.replace"}),!0})),Od=pd(((e,{query:t})=>{if(e.state.readOnly)return!1;let i=t.matchAll(e.state,1e9).map((e=>{let{from:i,to:n}=e;return{from:i,to:n,insert:t.getReplacement(e)}}));if(!i.length)return!1;let n=e.state.phrase("replaced $ matches",i.length)+".";return e.dispatch({changes:i,effects:Ds.announce.of(n),userEvent:"input.replace.all"}),!0}));function bd(e){return e.state.facet(Zc).createPanel(e)}function _d(e,t){var i,n,s,r,o;let a=e.selection.main,l=a.empty||a.to>a.from+100?"":e.sliceDoc(a.from,a.to);if(t&&!l)return t;let h=e.facet(Zc);return new Kc({search:(null!==(i=null==t?void 0:t.literal)&&void 0!==i?i:h.literal)?l:l.replace(/\n/g,"\\n"),caseSensitive:null!==(n=null==t?void 0:t.caseSensitive)&&void 0!==n?n:h.caseSensitive,literal:null!==(s=null==t?void 0:t.literal)&&void 0!==s?s:h.literal,regexp:null!==(r=null==t?void 0:t.regexp)&&void 0!==r?r:h.regexp,wholeWord:null!==(o=null==t?void 0:t.wholeWord)&&void 0!==o?o:h.wholeWord})}function yd(e){let t=Xr(e,bd);return t&&t.dom.querySelector("[main-field]")}function wd(e){let t=yd(e);t&&t==e.root.activeElement&&t.select()}const xd=e=>{let t=e.state.field(ld,!1);if(t&&t.panel){let i=yd(e);if(i&&i!=e.root.activeElement){let n=_d(e.state,t.query.spec);n.valid&&e.dispatch({effects:od.of(n)}),i.focus(),i.select()}}else e.dispatch({effects:[ad.of(!0),t?od.of(_d(e.state,t.query.spec)):ae.appendConfig.of(Rd)]});return!0},Sd=e=>{let t=e.state.field(ld,!1);if(!t||!t.panel)return!1;let i=Xr(e,bd);return i&&i.dom.contains(e.root.activeElement)&&e.focus(),e.dispatch({effects:ad.of(!1)}),!0},kd=[{key:"Mod-f",run:xd,scope:"editor search-panel"},{key:"F3",run:fd,shift:md,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:fd,shift:md,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:Sd,scope:"editor search-panel"},{key:"Mod-Shift-l",run:({state:e,dispatch:t})=>{let i=e.selection;if(i.ranges.length>1||i.main.empty)return!1;let{from:n,to:s}=i.main,r=[],o=0;for(let t=new Ac(e.doc,e.sliceDoc(n,s));!t.next().done;){if(r.length>1e3)return!1;t.value.from==n&&(o=r.length),r.push(R.range(t.value.from,t.value.to))}return t(e.update({selection:R.create(r,o),userEvent:"select.search.matches"})),!0}},{key:"Alt-g",run:e=>{let t=Xr(e,$c);if(!t){let i=[Qc.of(!0)];null==e.state.field(zc,!1)&&i.push(ae.appendConfig.of([zc,jc])),e.dispatch({effects:i}),t=Xr(e,$c)}return t&&t.dom.querySelector("input").select(),!0}},{key:"Mod-d",run:({state:e,dispatch:t})=>{let{ranges:i}=e.selection;if(i.some((e=>e.from===e.to)))return(({state:e,dispatch:t})=>{let{selection:i}=e,n=R.create(i.ranges.map((t=>e.wordAt(t.head)||R.cursor(t.head))),i.mainIndex);return!n.eq(i)&&(t(e.update({selection:n})),!0)})({state:e,dispatch:t});let n=e.sliceDoc(i[0].from,i[0].to);if(e.selection.ranges.some((t=>e.sliceDoc(t.from,t.to)!=n)))return!1;let s=function(e,t){let{main:i,ranges:n}=e.selection,s=e.wordAt(i.head),r=s&&s.from==i.from&&s.to==i.to;for(let i=!1,s=new Ac(e.doc,t,n[n.length-1].to);;){if(s.next(),!s.done){if(i&&n.some((e=>e.from==s.value.from)))continue;if(r){let t=e.wordAt(s.value.from);if(!t||t.from!=s.value.from||t.to!=s.value.to)continue}return s.value}if(i)return null;s=new Ac(e.doc,t,0,Math.max(0,n[n.length-1].from-1)),i=!0}}(e,n);return!!s&&(t(e.update({selection:e.selection.addRange(R.range(s.from,s.to),!1),effects:Ds.scrollIntoView(s.to)})),!0)},preventDefault:!0}];class Td{constructor(e){this.view=e;let t=this.query=e.state.field(ld).query.spec;function i(e,t,i){return Pc("button",{class:"cm-button",name:e,onclick:t,type:"button"},i)}this.commit=this.commit.bind(this),this.searchField=Pc("input",{value:t.search,placeholder:Cd(e,"Find"),"aria-label":Cd(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=Pc("input",{value:t.replace,placeholder:Cd(e,"Replace"),"aria-label":Cd(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=Pc("input",{type:"checkbox",name:"case",form:"",checked:t.caseSensitive,onchange:this.commit}),this.reField=Pc("input",{type:"checkbox",name:"re",form:"",checked:t.regexp,onchange:this.commit}),this.wordField=Pc("input",{type:"checkbox",name:"word",form:"",checked:t.wholeWord,onchange:this.commit}),this.dom=Pc("div",{onkeydown:e=>this.keydown(e),class:"cm-search"},[this.searchField,i("next",(()=>fd(e)),[Cd(e,"next")]),i("prev",(()=>md(e)),[Cd(e,"previous")]),i("select",(()=>gd(e)),[Cd(e,"all")]),Pc("label",null,[this.caseField,Cd(e,"match case")]),Pc("label",null,[this.reField,Cd(e,"regexp")]),Pc("label",null,[this.wordField,Cd(e,"by word")]),...e.state.readOnly?[]:[Pc("br"),this.replaceField,i("replace",(()=>vd(e)),[Cd(e,"replace")]),i("replaceAll",(()=>Od(e)),[Cd(e,"replace all")])],Pc("button",{name:"close",onclick:()=>Sd(e),"aria-label":Cd(e,"close"),type:"button"},["×"])])}commit(){let e=new Kc({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:od.of(e)}))}keydown(e){var t,i;i=e,Fs(Ws((t=this.view).state),i,t,"search-panel")?e.preventDefault():13==e.keyCode&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?md:fd)(this.view)):13==e.keyCode&&e.target==this.replaceField&&(e.preventDefault(),vd(this.view))}update(e){for(let t of e.transactions)for(let e of t.effects)e.is(od)&&!e.value.eq(this.query)&&this.setQuery(e.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(Zc).top}}function Cd(e,t){return e.state.phrase(t)}const Pd=30,Md=/[\s\.,:;?!]/;function Ed(e,{from:t,to:i}){let n=e.state.doc.lineAt(t),s=e.state.doc.lineAt(i).to,r=Math.max(n.from,t-Pd),o=Math.min(s,i+Pd),a=e.state.sliceDoc(r,o);if(r!=n.from)for(let e=0;ea.length-Pd;e--)if(!Md.test(a[e-1])&&Md.test(a[e])){a=a.slice(0,e);break}return Ds.announce.of(`${e.state.phrase("current match")}. ${a} ${e.state.phrase("on line")} ${n.number}.`)}const Ad=Ds.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),Rd=[ld,V.low(ud),Ad];class Dd{constructor(e,t,i){this.state=e,this.pos=t,this.explicit=i,this.abortListeners=[]}tokenBefore(e){let t=Da(this.state).resolveInner(this.pos,-1);for(;t&&e.indexOf(t.name)<0;)t=t.parent;return t?{from:t.from,to:this.pos,text:this.state.sliceDoc(t.from,this.pos),type:t.type}:null}matchBefore(e){let t=this.state.doc.lineAt(this.pos),i=Math.max(t.from,this.pos-250),n=t.text.slice(i-t.from,this.pos-t.from),s=n.search($d(e,!1));return s<0?null:{from:i+s,to:this.pos,text:n.slice(s)}}get aborted(){return null==this.abortListeners}addEventListener(e,t){"abort"==e&&this.abortListeners&&this.abortListeners.push(t)}}function Id(e){let t=Object.keys(e).join(""),i=/\w/.test(t);return i&&(t=t.replace(/\w/g,"")),`[${i?"\\w":""}${t.replace(/[^\w\s]/g,"\\$&")}]`}function qd(e){let t=e.map((e=>"string"==typeof e?{label:e}:e)),[i,n]=t.every((e=>/^\w+$/.test(e.label)))?[/\w*$/,/\w+$/]:function(e){let t=Object.create(null),i=Object.create(null);for(let{label:n}of e){t[n[0]]=!0;for(let e=1;e{let s=e.matchBefore(n);return s||e.explicit?{from:s?s.from:e.pos,options:t,validFor:i}:null}}function Ld(e,t){return i=>{for(let t=Da(i.state).resolveInner(i.pos,-1);t;t=t.parent){if(e.indexOf(t.name)>-1)return null;if(t.type.isTop)break}return t(i)}}class Nd{constructor(e,t,i,n){this.completion=e,this.source=t,this.match=i,this.score=n}}function Bd(e){return e.selection.main.from}function $d(e,t){var i;let{source:n}=e,s=t&&"^"!=n[0],r="$"!=n[n.length-1];return s||r?new RegExp(`${s?"^":""}(?:${n})${r?"$":""}`,null!==(i=e.flags)&&void 0!==i?i:e.ignoreCase?"i":""):e}const Qd=se.define(),zd=new WeakMap;function jd(e){if(!Array.isArray(e))return e;let t=zd.get(e);return t||zd.set(e,t=qd(e)),t}const Wd=ae.define(),Vd=ae.define();class Ud{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let t=0;t=48&&l<=57||l>=97&&l<=122?2:l>=65&&l<=90?1:0:(y=b(l))!=y.toLowerCase()?1:y!=y.toUpperCase()?2:0;(!n||1==w&&m||0==v&&0!=w)&&(t[c]==l||i[c]==l&&(d=!0)?r[c++]=n:r.length&&(g=!1)),v=w,n+=_(l)}return c==a&&0==r[0]&&g?this.result((d?-200:0)-100,r,e):u==a&&0==p?this.ret(-200-e.length+(f==e.length?0:-100),[0,f]):o>-1?this.ret(-700-e.length,[o,o+this.pattern.length]):u==a?this.ret(-900-e.length,[p,f]):c==a?this.result((d?-200:0)-100-700+(g?0:-1100),r,e):2!=t.length&&this.result((n[0]?-700:0)-200-1100,n,e)}result(e,t,i){let n=[],s=0;for(let e of t){let t=e+(this.astral?_(O(i,e)):1);s&&n[s-1]==e?n[s-1]=t:(n[s++]=e,n[s++]=t)}return this.ret(e-i.length,n)}}const Fd=q.define({combine:e=>be(e,{activateOnTyping:!0,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:Xd,compareCompletions:(e,t)=>e.label.localeCompare(t.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,t)=>e&&t,closeOnBlur:(e,t)=>e&&t,icons:(e,t)=>e&&t,tooltipClass:(e,t)=>i=>Hd(e(i),t(i)),optionClass:(e,t)=>i=>Hd(e(i),t(i)),addToOptions:(e,t)=>e.concat(t)})});function Hd(e,t){return e?t?e+" "+t:e:t}function Xd(e,t,i,n,s,r){let o,a,l=e.textDirection==Ri.RTL,h=l,c=!1,d="top",u=t.left-s.left,p=s.right-t.right,f=n.right-n.left,m=n.bottom-n.top;if(h&&u=m||e>t.top?o=i.bottom-t.top:(d="bottom",o=t.bottom-i.top)}return{style:`${d}: ${o/((t.bottom-t.top)/r.offsetHeight)}px; max-width: ${a/((t.right-t.left)/r.offsetWidth)}px`,class:"cm-completionInfo-"+(c?l?"left-narrow":"right-narrow":h?"left":"right")}}function Yd(e,t,i){if(e<=i)return{from:0,to:e};if(t<0&&(t=0),t<=e>>1){let e=Math.floor(t/i);return{from:e*i,to:(e+1)*i}}let n=Math.floor((e-t)/i);return{from:e-(n+1)*i,to:e-n*i}}class Gd{constructor(e,t,i){this.view=e,this.stateField=t,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:e=>this.placeInfo(e),key:this},this.space=null,this.currentClass="";let n=e.state.field(t),{options:s,selected:r}=n.open,o=e.state.facet(Fd);this.optionContent=function(e){let t=e.addToOptions.slice();return e.icons&&t.push({render(e){let t=document.createElement("div");return t.classList.add("cm-completionIcon"),e.type&&t.classList.add(...e.type.split(/\s+/g).map((e=>"cm-completionIcon-"+e))),t.setAttribute("aria-hidden","true"),t},position:20}),t.push({render(e,t,i){let n=document.createElement("span");n.className="cm-completionLabel";let s=e.displayLabel||e.label,r=0;for(let e=0;er&&n.appendChild(document.createTextNode(s.slice(r,t)));let a=n.appendChild(document.createElement("span"));a.appendChild(document.createTextNode(s.slice(t,o))),a.className="cm-completionMatchedText",r=o}return re.position-t.position)).map((e=>e.render))}(o),this.optionClass=o.optionClass,this.tooltipClass=o.tooltipClass,this.range=Yd(s.length,r,o.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",(i=>{let{options:n}=e.state.field(t).open;for(let t,s=i.target;s&&s!=this.dom;s=s.parentNode)if("LI"==s.nodeName&&(t=/-(\d+)$/.exec(s.id))&&+t[1]{let i=e.state.field(this.stateField,!1);i&&i.tooltip&&e.state.facet(Fd).closeOnBlur&&t.relatedTarget!=e.contentDOM&&e.dispatch({effects:Vd.of(null)})})),this.showOptions(s,n.id)}mount(){this.updateSel()}showOptions(e,t){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,t,this.range)),this.list.addEventListener("scroll",(()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)}))}update(e){var t;let i=e.state.field(this.stateField),n=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=n){let{options:s,selected:r,disabled:o}=i.open;n.open&&n.open.options==s||(this.range=Yd(s.length,r,e.state.facet(Fd).maxRenderedOptions),this.showOptions(s,i.id)),this.updateSel(),o!=(null===(t=n.open)||void 0===t?void 0:t.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!o)}}updateTooltipClass(e){let t=this.tooltipClass(e);if(t!=this.currentClass){for(let e of this.currentClass.split(" "))e&&this.dom.classList.remove(e);for(let e of t.split(" "))e&&this.dom.classList.add(e);this.currentClass=t}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),t=e.open;if((t.selected>-1&&t.selected=this.range.to)&&(this.range=Yd(t.options.length,t.selected,this.view.state.facet(Fd).maxRenderedOptions),this.showOptions(t.options,e.id)),this.updateSelectedOption(t.selected)){this.destroyInfo();let{completion:i}=t.options[t.selected],{info:n}=i;if(!n)return;let s="string"==typeof n?document.createTextNode(n):n(i);if(!s)return;"then"in s?s.then((t=>{t&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(t,i)})).catch((e=>mi(this.view.state,e,"completion info"))):this.addInfoPane(s,i)}}addInfoPane(e,t){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",null!=e.nodeType)i.appendChild(e),this.infoDestroy=null;else{let{dom:t,destroy:n}=e;i.appendChild(t),this.infoDestroy=n||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let t=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)"LI"==i.nodeName&&i.id?n==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),t=i):i.hasAttribute("aria-selected")&&i.removeAttribute("aria-selected"):n--;return t&&function(e,t){let i=e.getBoundingClientRect(),n=t.getBoundingClientRect(),s=i.height/e.offsetHeight;n.topi.bottom&&(e.scrollTop+=(n.bottom-i.bottom)/s)}(this.list,t),t}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let t=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=e.getBoundingClientRect(),s=this.space;if(!s){let e=this.dom.ownerDocument.defaultView||window;s={left:0,top:0,right:e.innerWidth,bottom:e.innerHeight}}return n.top>Math.min(s.bottom,t.bottom)-10||n.bottomi.from||0==i.from)&&(s=e,"string"!=typeof l&&l.header?n.appendChild(l.header(l)):n.appendChild(document.createElement("completion-section")).textContent=e)}const h=n.appendChild(document.createElement("li"));h.id=t+"-"+r,h.setAttribute("role","option");let c=this.optionClass(o);c&&(h.className=c);for(let e of this.optionContent){let t=e(o,this.view.state,a);t&&h.appendChild(t)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.tonew Gd(i,e,t)}function Kd(e){return 100*(e.boost||0)+(e.apply?10:0)+(e.info?5:0)+(e.type?1:0)}class Jd{constructor(e,t,i,n,s,r){this.options=e,this.attrs=t,this.tooltip=i,this.timestamp=n,this.selected=s,this.disabled=r}setSelected(e,t){return e==this.selected||e>=this.options.length?this:new Jd(this.options,iu(t,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,t,i,n,s){let r=function(e,t){let i=[],n=null,s=e=>{i.push(e);let{section:t}=e.completion;if(t){n||(n=[]);let e="string"==typeof t?t:t.name;n.some((t=>t.name==e))||n.push("string"==typeof t?{name:e}:t)}};for(let n of e)if(n.hasResult()){let e=n.result.getMatch;if(!1===n.result.filter)for(let t of n.result.options)s(new Nd(t,n.source,e?e(t):[],1e9-i.length));else{let i=new Ud(t.sliceDoc(n.from,n.to));for(let t of n.result.options)if(i.match(t.label)){let r=t.displayLabel?e?e(t,i.matched):[]:i.matched;s(new Nd(t,n.source,r,i.score+(t.boost||0)))}}}if(n){let e=Object.create(null),t=0,s=(e,t)=>{var i,n;return(null!==(i=e.rank)&&void 0!==i?i:1e9)-(null!==(n=t.rank)&&void 0!==n?n:1e9)||(e.namet.score-e.score||a(e.completion,t.completion)))){let t=e.completion;!o||o.label!=t.label||o.detail!=t.detail||null!=o.type&&null!=t.type&&o.type!=t.type||o.apply!=t.apply||o.boost!=t.boost?r.push(e):Kd(e.completion)>Kd(o)&&(r[r.length-1]=e),o=e.completion}return r}(e,t);if(!r.length)return n&&e.some((e=>1==e.state))?new Jd(n.options,n.attrs,n.tooltip,n.timestamp,n.selected,!0):null;let o=t.facet(Fd).selectOnOpen?0:-1;if(n&&n.selected!=o&&-1!=n.selected){let e=n.options[n.selected].completion;for(let t=0;tt.hasResult()?Math.min(e,t.from):e),1e8),create:du,above:s.aboveCursor},n?n.timestamp:Date.now(),o,!1)}map(e){return new Jd(this.options,this.attrs,Object.assign(Object.assign({},this.tooltip),{pos:e.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}}class eu{constructor(e,t,i){this.active=e,this.id=t,this.open=i}static start(){return new eu(nu,"cm-ac-"+Math.floor(2e6*Math.random()).toString(36),null)}update(e){let{state:t}=e,i=t.facet(Fd),n=(i.override||t.languageDataAt("autocomplete",Bd(t)).map(jd)).map((t=>(this.active.find((e=>e.source==t))||new ru(t,this.active.some((e=>0!=e.state))?1:0)).update(e,i)));n.length==this.active.length&&n.every(((e,t)=>e==this.active[t]))&&(n=this.active);let s=this.open;s&&e.docChanged&&(s=s.map(e.changes)),e.selection||n.some((t=>t.hasResult()&&e.changes.touchesRange(t.from,t.to)))||!function(e,t){if(e==t)return!0;for(let i=0,n=0;;){for(;i1==e.state))&&(s=null),!s&&n.every((e=>1!=e.state))&&n.some((e=>e.hasResult()))&&(n=n.map((e=>e.hasResult()?new ru(e.source,0):e)));for(let t of e.effects)t.is(lu)&&(s=s&&s.setSelected(t.value,this.id));return n==this.active&&s==this.open?this:new eu(n,this.id,s)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:tu}}const tu={"aria-autocomplete":"list"};function iu(e,t){let i={"aria-autocomplete":"list","aria-haspopup":"listbox","aria-controls":e};return t>-1&&(i["aria-activedescendant"]=e+"-"+t),i}const nu=[];function su(e){return e.isUserEvent("input.type")?"input":e.isUserEvent("delete.backward")?"delete":null}class ru{constructor(e,t,i=-1){this.source=e,this.state=t,this.explicitPos=i}hasResult(){return!1}update(e,t){let i=su(e),n=this;i?n=n.handleUserEvent(e,i,t):e.docChanged?n=n.handleChange(e):e.selection&&0!=n.state&&(n=new ru(n.source,0));for(let t of e.effects)if(t.is(Wd))n=new ru(n.source,1,t.value?Bd(e.state):-1);else if(t.is(Vd))n=new ru(n.source,0);else if(t.is(au))for(let e of t.value)e.source==n.source&&(n=e);return n}handleUserEvent(e,t,i){return"delete"!=t&&i.activateOnTyping?new ru(this.source,1):this.map(e.changes)}handleChange(e){return e.changes.touchesRange(Bd(e.startState))?new ru(this.source,0):this.map(e.changes)}map(e){return e.empty||this.explicitPos<0?this:new ru(this.source,this.state,e.mapPos(this.explicitPos))}}class ou extends ru{constructor(e,t,i,n,s){super(e,2,t),this.result=i,this.from=n,this.to=s}hasResult(){return!0}handleUserEvent(e,t,i){var n;let s=e.changes.mapPos(this.from),r=e.changes.mapPos(this.to,1),o=Bd(e.state);if((this.explicitPos<0?o<=s:or||"delete"==t&&Bd(e.startState)==this.from)return new ru(this.source,"input"==t&&i.activateOnTyping?1:0);let a,l=this.explicitPos<0?-1:e.changes.mapPos(this.explicitPos);return function(e,t,i,n){if(!e)return!1;let s=t.sliceDoc(i,n);return"function"==typeof e?e(s,i,n,t):$d(e,!0).test(s)}(this.result.validFor,e.state,s,r)?new ou(this.source,l,this.result,s,r):this.result.update&&(a=this.result.update(this.result,s,r,new Dd(e.state,o,l>=0)))?new ou(this.source,l,a,a.from,null!==(n=a.to)&&void 0!==n?n:Bd(e.state)):new ru(this.source,1,l)}handleChange(e){return e.changes.touchesRange(this.from,this.to)?new ru(this.source,0):this.map(e.changes)}map(e){return e.empty?this:new ou(this.source,this.explicitPos<0?-1:e.mapPos(this.explicitPos),this.result,e.mapPos(this.from),e.mapPos(this.to,1))}}const au=ae.define({map:(e,t)=>e.map((e=>e.map(t)))}),lu=ae.define(),hu=j.define({create:()=>eu.start(),update:(e,t)=>e.update(t),provide:e=>[Br.from(e,(e=>e.tooltip)),Ds.contentAttributes.from(e,(e=>e.attrs))]});function cu(e,t){const i=t.completion.apply||t.completion.label;let n=e.state.field(hu).active.find((e=>e.source==t.source));return n instanceof ou&&("string"==typeof i?e.dispatch(Object.assign(Object.assign({},function(e,t,i,n){let{main:s}=e.selection,r=i-s.from,o=n-s.from;return Object.assign(Object.assign({},e.changeByRange((a=>a!=s&&i!=n&&e.sliceDoc(a.from+r,a.from+o)!=e.sliceDoc(i,n)?{range:a}:{changes:{from:a.from+r,to:n==s.from?a.to:a.from+o,insert:t},range:R.cursor(a.from+r+t.length)}))),{scrollIntoView:!0,userEvent:"input.complete"})}(e.state,i,n.from,n.to)),{annotations:Qd.of(t.completion)})):i(e,t.completion,n.from,n.to),!0)}const du=Zd(hu,cu);function uu(e,t="option"){return i=>{let n=i.state.field(hu,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp-1?n.open.selected+r*(e?1:-1):e?0:o-1;return a<0?a="page"==t?0:o-1:a>=o&&(a="page"==t?o-1:0),i.dispatch({effects:lu.of(a)}),!0}}class pu{constructor(e,t){this.active=e,this.context=t,this.time=Date.now(),this.updates=[],this.done=void 0}}const fu=bi.fromClass(class{constructor(e){this.view=e,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.composing=0;for(let t of e.state.field(hu).active)1==t.state&&this.startQuery(t)}update(e){let t=e.state.field(hu);if(!e.selectionSet&&!e.docChanged&&e.startState.field(hu)==t)return;let i=e.transactions.some((e=>(e.selection||e.docChanged)&&!su(e)));for(let t=0;t50&&Date.now()-n.time>1e3){for(let e of n.context.abortListeners)try{e()}catch(e){mi(this.view.state,e)}n.context.abortListeners=null,this.running.splice(t--,1)}else n.updates.push(...e.transactions)}if(this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),this.debounceUpdate=t.active.some((e=>1==e.state&&!this.running.some((t=>t.active.source==e.source))))?setTimeout((()=>this.startUpdate()),50):-1,0!=this.composing)for(let t of e.transactions)"input"==su(t)?this.composing=2:2==this.composing&&t.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1;let{state:e}=this.view,t=e.field(hu);for(let e of t.active)1!=e.state||this.running.some((t=>t.active.source==e.source))||this.startQuery(e)}startQuery(e){let{state:t}=this.view,i=Bd(t),n=new Dd(t,i,e.explicitPos==i),s=new pu(e,n);this.running.push(s),Promise.resolve(e.source(n)).then((e=>{s.context.aborted||(s.done=e||null,this.scheduleAccept())}),(e=>{this.view.dispatch({effects:Vd.of(null)}),mi(this.view.state,e)}))}scheduleAccept(){this.running.every((e=>void 0!==e.done))?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout((()=>this.accept()),this.view.state.facet(Fd).updateSyncTime))}accept(){var e;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let t=[],i=this.view.state.facet(Fd);for(let n=0;ne.source==s.active.source));if(r&&1==r.state)if(null==s.done){let e=new ru(s.active.source,0);for(let t of s.updates)e=e.update(t,i);1!=e.state&&t.push(e)}else this.startQuery(r)}t.length&&this.view.dispatch({effects:au.of(t)})}},{eventHandlers:{blur(e){let t=this.view.state.field(hu,!1);if(t&&t.tooltip&&this.view.state.facet(Fd).closeOnBlur){let i=t.open&&Ur(this.view,t.open.tooltip);i&&i.dom.contains(e.relatedTarget)||this.view.dispatch({effects:Vd.of(null)})}},compositionstart(){this.composing=1},compositionend(){3==this.composing&&setTimeout((()=>this.view.dispatch({effects:Wd.of(!1)})),20),this.composing=0}}}),mu=Ds.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});class gu{constructor(e,t,i,n){this.field=e,this.line=t,this.from=i,this.to=n}}class vu{constructor(e,t,i){this.field=e,this.from=t,this.to=i}map(e){let t=e.mapPos(this.from,-1,w.TrackDel),i=e.mapPos(this.to,1,w.TrackDel);return null==t||null==i?null:new vu(this.field,t,i)}}class Ou{constructor(e,t){this.lines=e,this.fieldPositions=t}instantiate(e,t){let i=[],n=[t],s=e.doc.lineAt(t),r=/^\s*/.exec(s.text)[0];for(let s of this.lines){if(i.length){let i=r,o=/^\t*/.exec(s)[0].length;for(let t=0;tnew vu(e.field,n[e.line]+e.from,n[e.line]+e.to)));return{text:i,ranges:o}}static parse(e){let t,i=[],n=[],s=[];for(let r of e.split(/\r\n?|\n/)){for(;t=/[#$]\{(?:(\d+)(?::([^}]*))?|([^}]*))\}/.exec(r);){let e=t[1]?+t[1]:null,o=t[2]||t[3]||"",a=-1;for(let t=0;t=a&&e.field++}s.push(new gu(a,n.length,t.index,t.index+o.length)),r=r.slice(0,t.index)+o+r.slice(t.index+t[0].length)}for(let e;e=/\\([{}])/.exec(r);){r=r.slice(0,e.index)+e[1]+r.slice(e.index+e[0].length);for(let t of s)t.line==n.length&&t.from>e.index&&(t.from--,t.to--)}n.push(r)}return new Ou(n,s)}}let bu=Yt.widget({widget:new class extends Ht{toDOM(){let e=document.createElement("span");return e.className="cm-snippetFieldPosition",e}ignoreEvent(){return!1}}}),_u=Yt.mark({class:"cm-snippetField"});class yu{constructor(e,t){this.ranges=e,this.active=t,this.deco=Yt.set(e.map((e=>(e.from==e.to?bu:_u).range(e.from,e.to))))}map(e){let t=[];for(let i of this.ranges){let n=i.map(e);if(!n)return null;t.push(n)}return new yu(t,this.active)}selectionInsideField(e){return e.ranges.every((e=>this.ranges.some((t=>t.field==this.active&&t.from<=e.from&&t.to>=e.to))))}}const wu=ae.define({map:(e,t)=>e&&e.map(t)}),xu=ae.define(),Su=j.define({create:()=>null,update(e,t){for(let i of t.effects){if(i.is(wu))return i.value;if(i.is(xu)&&e)return new yu(e.ranges,i.value)}return e&&t.docChanged&&(e=e.map(t.changes)),e&&t.selection&&!e.selectionInsideField(t.selection)&&(e=null),e},provide:e=>Ds.decorations.from(e,(e=>e?e.deco:Yt.none))});function ku(e,t){return R.create(e.filter((e=>e.field==t)).map((e=>R.range(e.from,e.to))))}function Tu(t){let i=Ou.parse(t);return(t,n,s,r)=>{let{text:o,ranges:a}=i.instantiate(t.state,s),l={changes:{from:s,to:r,insert:e.of(o)},scrollIntoView:!0,annotations:n?Qd.of(n):void 0};if(a.length&&(l.selection=ku(a,0)),a.length>1){let e=new yu(a,0),i=l.effects=[wu.of(e)];void 0===t.state.field(Su,!1)&&i.push(ae.appendConfig.of([Su,Eu,Ru,mu]))}t.dispatch(t.state.update(l))}}function Cu(e){return({state:t,dispatch:i})=>{let n=t.field(Su,!1);if(!n||e<0&&0==n.active)return!1;let s=n.active+e,r=e>0&&!n.ranges.some((t=>t.field==s+e));return i(t.update({selection:ku(n.ranges,s),effects:wu.of(r?null:new yu(n.ranges,s)),scrollIntoView:!0})),!0}}const Pu=[{key:"Tab",run:Cu(1),shift:Cu(-1)},{key:"Escape",run:({state:e,dispatch:t})=>!!e.field(Su,!1)&&(t(e.update({effects:wu.of(null)})),!0)}],Mu=q.define({combine:e=>e.length?e[0]:Pu}),Eu=V.highest(zs.compute([Mu],(e=>e.facet(Mu))));function Au(e,t){return Object.assign(Object.assign({},t),{apply:Tu(e)})}const Ru=Ds.domEventHandlers({mousedown(e,t){let i,n=t.state.field(Su,!1);if(!n||null==(i=t.posAtCoords({x:e.clientX,y:e.clientY})))return!1;let s=n.ranges.find((e=>e.from<=i&&e.to>=i));return!(!s||s.field==n.active||(t.dispatch({selection:ku(n.ranges,s.field),effects:wu.of(n.ranges.some((e=>e.field>s.field))?new yu(n.ranges,s.field):null),scrollIntoView:!0}),0))}}),Du={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Iu=ae.define({map(e,t){let i=t.mapPos(e,-1,w.TrackAfter);return null==i?void 0:i}}),qu=new class extends _e{};qu.startSide=1,qu.endSide=-1;const Lu=j.define({create:()=>Se.empty,update(e,t){if(t.selection){let i=t.state.doc.lineAt(t.selection.main.head).from,n=t.startState.doc.lineAt(t.startState.selection.main.head).from;i!=t.changes.mapPos(n,-1)&&(e=Se.empty)}e=e.map(t.changes);for(let i of t.effects)i.is(Iu)&&(e=e.update({add:[qu.range(i.value,i.value+1)]}));return e}}),Nu="()[]{}<>";function Bu(e){for(let t=0;t<8;t+=2)if(Nu.charCodeAt(t)==e)return Nu.charAt(t+1);return b(e<128?e:e+1)}function $u(e,t){return e.languageDataAt("closeBrackets",t)[0]||Du}const Qu="object"==typeof navigator&&/Android\b/.test(navigator.userAgent),zu=Ds.inputHandler.of(((e,t,i,n)=>{if((Qu?e.composing:e.compositionStarted)||e.state.readOnly)return!1;let s=e.state.selection.main;if(n.length>2||2==n.length&&1==_(O(n,0))||t!=s.from||i!=s.to)return!1;let r=function(e,t){let i=$u(e,e.selection.main.head),n=i.brackets||Du.brackets;for(let s of n){let r=Bu(O(s,0));if(t==s)return r==s?Hu(e,s,n.indexOf(s+s+s)>-1,i):Uu(e,s,r,i.before||Du.before);if(t==r&&Wu(e,e.selection.main.from))return Fu(e,0,r)}return null}(e.state,n);return!!r&&(e.dispatch(r),!0)})),ju=[{key:"Backspace",run:({state:e,dispatch:t})=>{if(e.readOnly)return!1;let i=$u(e,e.selection.main.head).brackets||Du.brackets,n=null,s=e.changeByRange((t=>{if(t.empty){let n=function(e,t){let i=e.sliceString(t-2,t);return _(O(i,0))==i.length?i:i.slice(1)}(e.doc,t.head);for(let s of i)if(s==n&&Vu(e.doc,t.head)==Bu(O(s,0)))return{changes:{from:t.head-s.length,to:t.head+s.length},range:R.cursor(t.head-s.length)}}return{range:n=t}}));return n||t(e.update(s,{scrollIntoView:!0,userEvent:"delete.backward"})),!n}}];function Wu(e,t){let i=!1;return e.field(Lu).between(0,e.doc.length,(e=>{e==t&&(i=!0)})),i}function Vu(e,t){let i=e.sliceString(t,t+2);return i.slice(0,_(O(i,0)))}function Uu(e,t,i,n){let s=null,r=e.changeByRange((r=>{if(!r.empty)return{changes:[{insert:t,from:r.from},{insert:i,from:r.to}],effects:Iu.of(r.to+t.length),range:R.range(r.anchor+t.length,r.head+t.length)};let o=Vu(e.doc,r.head);return!o||/\s/.test(o)||n.indexOf(o)>-1?{changes:{insert:t+i,from:r.head},effects:Iu.of(r.head+t.length),range:R.cursor(r.head+t.length)}:{range:s=r}}));return s?null:e.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function Fu(e,t,i){let n=null,s=e.changeByRange((t=>t.empty&&Vu(e.doc,t.head)==i?{changes:{from:t.head,to:t.head+i.length,insert:i},range:R.cursor(t.head+i.length)}:n={range:t}));return n?null:e.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function Hu(e,t,i,n){let s=n.stringPrefixes||Du.stringPrefixes,r=null,o=e.changeByRange((n=>{if(!n.empty)return{changes:[{insert:t,from:n.from},{insert:t,from:n.to}],effects:Iu.of(n.to+t.length),range:R.range(n.anchor+t.length,n.head+t.length)};let o,a=n.head,l=Vu(e.doc,a);if(l==t){if(Xu(e,a))return{changes:{insert:t+t,from:a},effects:Iu.of(a+t.length),range:R.cursor(a+t.length)};if(Wu(e,a)){let n=i&&e.sliceDoc(a,a+3*t.length)==t+t+t?t+t+t:t;return{changes:{from:a,to:a+n.length,insert:n},range:R.cursor(a+n.length)}}}else{if(i&&e.sliceDoc(a-2*t.length,a)==t+t&&(o=Yu(e,a-2*t.length,s))>-1&&Xu(e,o))return{changes:{insert:t+t+t+t,from:a},effects:Iu.of(a+t.length),range:R.cursor(a+t.length)};if(e.charCategorizer(a)(l)!=me.Word&&Yu(e,a,s)>-1&&!function(e,t,i,n){let s=Da(e).resolveInner(t,-1),r=n.reduce(((e,t)=>Math.max(e,t.length)),0);for(let o=0;o<5;o++){let o=e.sliceDoc(s.from,Math.min(s.to,s.from+i.length+r)),a=o.indexOf(i);if(!a||a>-1&&n.indexOf(o.slice(0,a))>-1){let t=s.firstChild;for(;t&&t.from==s.from&&t.to-t.from>i.length+a;){if(e.sliceDoc(t.to-i.length,t.to)==i)return!1;t=t.firstChild}return!0}let l=s.to==t&&s.parent;if(!l)break;s=l}return!1}(e,a,t,s))return{changes:{insert:t+t,from:a},effects:Iu.of(a+t.length),range:R.cursor(a+t.length)}}return{range:r=n}}));return r?null:e.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function Xu(e,t){let i=Da(e).resolveInner(t+1);return i.parent&&i.from==t}function Yu(e,t,i){let n=e.charCategorizer(t);if(n(e.sliceDoc(t-1,t))!=me.Word)return t;for(let s of i){let i=t-s.length;if(e.sliceDoc(i,t)==s&&n(e.sliceDoc(i-1,i))!=me.Word)return i}return-1}function Gu(e={}){return[hu,Fd.of(e),fu,Ku,mu]}const Zu=[{key:"Ctrl-Space",run:e=>!!e.state.field(hu,!1)&&(e.dispatch({effects:Wd.of(!0)}),!0)},{key:"Escape",run:e=>{let t=e.state.field(hu,!1);return!(!t||!t.active.some((e=>0!=e.state))||(e.dispatch({effects:Vd.of(null)}),0))}},{key:"ArrowDown",run:uu(!0)},{key:"ArrowUp",run:uu(!1)},{key:"PageDown",run:uu(!0,"page")},{key:"PageUp",run:uu(!1,"page")},{key:"Enter",run:e=>{let t=e.state.field(hu,!1);return!(e.state.readOnly||!t||!t.open||t.open.selected<0||t.open.disabled||Date.now()-t.open.timestampe.facet(Fd).defaultKeymap?[Zu]:[])));class Ju{constructor(e,t,i){this.from=e,this.to=t,this.diagnostic=i}}class ep{constructor(e,t,i){this.diagnostics=e,this.panel=t,this.selected=i}static init(e,t,i){let n=e,s=i.facet(dp).markerFilter;s&&(n=s(n));let r=Yt.set(n.map((e=>e.from==e.to||e.from==e.to-1&&i.doc.lineAt(e.from).to==e.from?Yt.widget({widget:new fp(e),diagnostic:e}).range(e.from):Yt.mark({attributes:{class:"cm-lintRange cm-lintRange-"+e.severity+(e.markClass?" "+e.markClass:"")},diagnostic:e}).range(e.from,e.to))),!0);return new ep(r,t,tp(r))}}function tp(e,t=null,i=0){let n=null;return e.between(i,1e9,((e,i,{spec:s})=>{if(!t||s.diagnostic==t)return n=new Ju(e,i,s.diagnostic),!1})),n}const ip=ae.define(),np=ae.define(),sp=ae.define(),rp=j.define({create:()=>new ep(Yt.none,null,null),update(e,t){if(t.docChanged){let i=e.diagnostics.map(t.changes),n=null;if(e.selected){let s=t.changes.mapPos(e.selected.from,1);n=tp(i,e.selected.diagnostic,s)||tp(i,null,s)}e=new ep(i,e.panel,n)}for(let i of t.effects)i.is(ip)?e=ep.init(i.value,e.panel,t.state):i.is(np)?e=new ep(e.diagnostics,i.value?gp.open:null,e.selected):i.is(sp)&&(e=new ep(e.diagnostics,e.panel,i.value));return e},provide:e=>[Kr.from(e,(e=>e.panel)),Ds.decorations.from(e,(e=>e.diagnostics))]}),op=Yt.mark({class:"cm-lintRange cm-lintRange-active"});function ap(e,t,i){let{diagnostics:n}=e.state.field(rp),s=[],r=2e8,o=0;n.between(t-(i<0?1:0),t+(i>0?1:0),((e,n,{spec:a})=>{t>=e&&t<=n&&(e==n||(t>e||i>0)&&(t({dom:lp(e,s)})}:null}function lp(e,t){return Pc("ul",{class:"cm-tooltip-lint"},t.map((t=>pp(e,t,!1))))}const hp=e=>{let t=e.state.field(rp,!1);return!(!t||!t.panel||(e.dispatch({effects:np.of(!1)}),0))},cp=[{key:"Mod-Shift-m",run:e=>{let t=e.state.field(rp,!1);var i,n;t&&t.panel||e.dispatch({effects:(i=e.state,n=[np.of(!0)],i.field(rp,!1)?n:n.concat(ae.appendConfig.of(bp)))});let s=Xr(e,gp.open);return s&&s.dom.querySelector(".cm-panel-lint ul").focus(),!0},preventDefault:!0},{key:"F8",run:e=>{let t=e.state.field(rp,!1);if(!t)return!1;let i=e.state.selection.main,n=t.diagnostics.iter(i.to+1);return!(!n.value&&(n=t.diagnostics.iter(0),!n.value||n.from==i.from&&n.to==i.to)||(e.dispatch({selection:{anchor:n.from,head:n.to},scrollIntoView:!0}),0))}}],dp=q.define({combine:e=>Object.assign({sources:e.map((e=>e.source))},be(e.map((e=>e.config)),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null},{needsRefresh:(e,t)=>e?t?i=>e(i)||t(i):e:t}))});function up(e){let t=[];if(e)e:for(let{name:i}of e){for(let e=0;ee.toLowerCase()==n.toLowerCase()))){t.push(n);continue e}}t.push("")}return t}function pp(e,t,i){var n;let s=i?up(t.actions):[];return Pc("li",{class:"cm-diagnostic cm-diagnostic-"+t.severity},Pc("span",{class:"cm-diagnosticText"},t.renderMessage?t.renderMessage():t.message),null===(n=t.actions)||void 0===n?void 0:n.map(((i,n)=>{let r=!1,o=n=>{if(n.preventDefault(),r)return;r=!0;let s=tp(e.state.field(rp).diagnostics,t);s&&i.apply(e,s.from,s.to)},{name:a}=i,l=s[n]?a.indexOf(s[n]):-1,h=l<0?a:[a.slice(0,l),Pc("u",a.slice(l,l+1)),a.slice(l+1)];return Pc("button",{type:"button",class:"cm-diagnosticAction",onclick:o,onmousedown:o,"aria-label":` Action: ${a}${l<0?"":` (access key "${s[n]})"`}.`},h)})),t.source&&Pc("div",{class:"cm-diagnosticSource"},t.source))}class fp extends Ht{constructor(e){super(),this.diagnostic=e}eq(e){return e.diagnostic==this.diagnostic}toDOM(){return Pc("span",{class:"cm-lintPoint cm-lintPoint-"+this.diagnostic.severity})}}class mp{constructor(e,t){this.diagnostic=t,this.id="item_"+Math.floor(4294967295*Math.random()).toString(16),this.dom=pp(e,t,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}}class gp{constructor(e){this.view=e,this.items=[],this.list=Pc("ul",{tabIndex:0,role:"listbox","aria-label":this.view.state.phrase("Diagnostics"),onkeydown:t=>{if(27==t.keyCode)hp(this.view),this.view.focus();else if(38==t.keyCode||33==t.keyCode)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(40==t.keyCode||34==t.keyCode)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(36==t.keyCode)this.moveSelection(0);else if(35==t.keyCode)this.moveSelection(this.items.length-1);else if(13==t.keyCode)this.view.focus();else{if(!(t.keyCode>=65&&t.keyCode<=90&&this.selectedIndex>=0))return;{let{diagnostic:i}=this.items[this.selectedIndex],n=up(i.actions);for(let s=0;s{for(let t=0;thp(this.view)},"×")),this.update()}get selectedIndex(){let e=this.view.state.field(rp).selected;if(!e)return-1;for(let t=0;t{let a,l=-1;for(let e=i;ei&&(this.items.splice(i,l-i),n=!0)),t&&a.diagnostic==t.diagnostic?a.dom.hasAttribute("aria-selected")||(a.dom.setAttribute("aria-selected","true"),s=a):a.dom.hasAttribute("aria-selected")&&a.dom.removeAttribute("aria-selected"),i++}));i({sel:s.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:e,panel:t})=>{let i=t.height/this.list.offsetHeight;e.topt.bottom&&(this.list.scrollTop+=(e.bottom-t.bottom)/i)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let e=this.list.firstChild;function t(){let t=e;e=t.nextSibling,t.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)t();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)t()}moveSelection(e){if(this.selectedIndex<0)return;let t=tp(this.view.state.field(rp).diagnostics,this.items[e].diagnostic);t&&this.view.dispatch({selection:{anchor:t.from,head:t.to},scrollIntoView:!0,effects:sp.of(t)})}static open(e){return new gp(e)}}function vp(e){return function(e,t='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(e)}')`}(``,'width="6" height="3"')}const Op=Ds.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:vp("#d11")},".cm-lintRange-warning":{backgroundImage:vp("orange")},".cm-lintRange-info":{backgroundImage:vp("#999")},".cm-lintRange-hint":{backgroundImage:vp("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}}),bp=[rp,Ds.decorations.compute([rp],(e=>{let{selected:t,panel:i}=e.field(rp);return t&&i&&t.from!=t.to?Yt.set([op.range(t.from,t.to)]):Yt.none})),Vr(ap,{hideOn:function(e,t){let i=e.startState.doc.lineAt(t.pos);return!(!e.effects.some((e=>e.is(ip)))&&!e.changes.touchesRange(i.from,i.to))}}),Op],_p=(()=>[Oo(),yo,Or(),gh(),Tl(),tr(),[hr,cr],Oe.allowMultipleSelections.of(!0),Oe.transactionFilter.of((e=>{if(!e.docChanged||!e.isUserEvent("input.type")&&!e.isUserEvent("input.complete"))return e;let t=e.startState.languageDataAt("indentOnInput",e.startState.selection.main.head);if(!t.length)return e;let i=e.newDoc,{head:n}=e.newSelection.main,s=i.lineAt(n);if(n>s.from+200)return e;let r=i.sliceString(s.from,n);if(!t.some((e=>e.test(r))))return e;let{state:o}=e,a=-1,l=[];for(let{head:e}of o.selection.ranges){let t=o.doc.lineAt(e);if(t.from==a)continue;a=t.from;let i=Xa(o,t.from);if(null==i)continue;let n=/^\s*/.exec(t.text)[0],s=Ha(o,i);n!=s&&l.push({from:t.from,to:t.from+n.length,insert:s})}return l.length?[e,{changes:l,sequential:!0}]:e})),Rl(ql,{fallback:!0}),Ul(),[zu,Lu],Gu(),Tr(),Mr(),xr,Uc(),zs.of([...ju,...Cc,...kd,...Dh,...vl,...Zu,...cp])])();class yp{constructor(e,t,i,n,s,r,o,a,l,h=0,c){this.p=e,this.stack=t,this.state=i,this.reducePos=n,this.pos=s,this.score=r,this.buffer=o,this.bufferBase=a,this.curContext=l,this.lookAhead=h,this.parent=c}toString(){return`[${this.stack.filter(((e,t)=>t%3==0)).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,t,i=0){let n=e.parser.context;return new yp(e,[],t,i,i,0,[],0,n?new wp(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var t;let i=e>>19,n=65535&e,{parser:s}=this.p,r=s.dynamicPrecedence(n);if(r&&(this.score+=r),0==i)return this.pushState(s.getGoto(this.state,n,!0),this.reducePos),n=2e3&&!(null===(t=this.p.parser.nodeSet.types[n])||void 0===t?void 0:t.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSizeo;)this.stack.pop();this.reduceContext(n,a)}storeNode(e,t,i,n=4,s=!1){if(0==e&&(!this.stack.length||this.stack[this.stack.length-1]0&&0==e.buffer[n-4]&&e.buffer[n-1]>-1){if(t==i)return;if(e.buffer[n-2]>=t)return void(e.buffer[n-2]=i)}}if(s&&this.pos!=i){let s=this.buffer.length;if(s>0&&0!=this.buffer[s-4])for(;s>0&&this.buffer[s-2]>i;)this.buffer[s]=this.buffer[s-4],this.buffer[s+1]=this.buffer[s-3],this.buffer[s+2]=this.buffer[s-2],this.buffer[s+3]=this.buffer[s-1],s-=4,n>4&&(n-=4);this.buffer[s]=e,this.buffer[s+1]=t,this.buffer[s+2]=i,this.buffer[s+3]=n}else this.buffer.push(e,t,i,n)}shift(e,t,i,n){if(131072&e)this.pushState(65535&e,this.pos);else if(0==(262144&e)){let s=e,{parser:r}=this.p;(n>this.pos||t<=r.maxNode)&&(this.pos=n,r.stateFlag(s,1)||(this.reducePos=n)),this.pushState(s,i),this.shiftContext(t,i),t<=r.maxNode&&this.buffer.push(t,i,n,4)}else this.pos=n,this.shiftContext(t,i),t<=this.p.parser.maxNode&&this.buffer.push(t,i,n,4)}apply(e,t,i,n){65536&e?this.reduce(e):this.shift(e,t,i,n)}useNode(e,t){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let n=this.pos;this.reducePos=this.pos=n+e.length,this.pushState(t,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,t=e.buffer.length;for(;t>0&&e.buffer[t-2]>e.reducePos;)t-=4;let i=e.buffer.slice(t),n=e.bufferBase+t;for(;e&&n==e.bufferBase;)e=e.parent;return new yp(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,e)}recoverByDelete(e,t){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,t,4),this.storeNode(0,this.pos,t,i?8:4),this.pos=this.reducePos=t,this.score-=190}canShift(e){for(let t=new xp(this);;){let i=this.p.parser.stateSlot(t.state,4)||this.p.parser.hasAction(t.state,e);if(0==i)return!1;if(0==(65536&i))return!0;t.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parser.nextStates(this.state);if(t.length>8||this.stack.length>=120){let i=[];for(let n,s=0;s1&t&&e==n))||i.push(t[e],n)}t=i}let i=[];for(let e=0;e>19,n=65535&t,s=this.stack.length-3*i;if(s<0||e.getGoto(this.stack[s],n,!1)<0){let e=this.findForcedReduction();if(null==e)return!1;t=e}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(t),!0}findForcedReduction(){let{parser:e}=this.p,t=[],i=(n,s)=>{if(!t.includes(n))return t.push(n),e.allActions(n,(t=>{if(393216&t);else if(65536&t){let i=(t>>19)-s;if(i>1){let n=65535&t,s=this.stack.length-3*i;if(s>=0&&e.getGoto(this.stack[s],n,!1)>=0)return i<<19|65536|n}}else{let e=i(t,s+1);if(null!=e)return e}}))};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(3!=this.stack.length)return!1;let{parser:e}=this.p;return 65535==e.data[e.stateSlot(this.state,1)]&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let t=0;tthis.lookAhead&&(this.emitLookAhead(),this.lookAhead=e)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}}class wp{constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash(t):0}}class xp{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let t=65535&e,i=e>>19;0==i?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=3*(i-1);let n=this.start.p.parser.getGoto(this.stack[this.base-3],t,!0);this.state=n}}class Sp{constructor(e,t,i){this.stack=e,this.pos=t,this.index=i,this.buffer=e.buffer,0==this.index&&this.maybeNext()}static create(e,t=e.bufferBase+e.buffer.length){return new Sp(e,t,t-e.bufferBase)}maybeNext(){let e=this.stack.parent;null!=e&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,0==this.index&&this.maybeNext()}fork(){return new Sp(this.stack,this.pos,this.index)}}function kp(e,t=Uint16Array){if("string"!=typeof e)return e;let i=null;for(let n=0,s=0;n=92&&t--,t>=34&&t--;let s=t-32;if(s>=46&&(s-=46,i=!0),r+=s,i)break;r*=46}i?i[s++]=r:i=new t(r)}return i}class Tp{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const Cp=new Tp;class Pp{constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Cp,this.rangeIndex=0,this.pos=this.chunkPos=t[0].from,this.range=t[0],this.end=t[t.length-1].to,this.readNext()}resolveOffset(e,t){let i=this.range,n=this.rangeIndex,s=this.pos+e;for(;si.to:s>=i.to;){if(n==this.ranges.length-1)return null;let e=this.ranges[++n];s+=e.from-i.to,i=e}return s}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,t.from);return this.end}peek(e){let t,i,n=this.chunkOff+e;if(n>=0&&n=this.chunk2Pos&&tn.to&&(this.chunk2=this.chunk2.slice(0,n.to-t)),i=this.chunk2.charCodeAt(0)}}return t>=this.token.lookAhead&&(this.token.lookAhead=t+1),i}acceptToken(e,t=0){let i=t?this.resolveOffset(t,-1):this.pos;if(null==i||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,t){if(t?(this.token=t,t.start=e,t.lookAhead=e+1,t.value=t.extended=-1):this.token=Cp,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&t<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,t-this.chunkPos);if(e>=this.chunk2Pos&&t<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,t-this.chunk2Pos);if(e>=this.range.from&&t<=this.range.to)return this.input.read(e,t);let i="";for(let n of this.ranges){if(n.from>=t)break;n.to>e&&(i+=this.input.read(Math.max(n.from,e),Math.min(n.to,t)))}return i}}class Mp{constructor(e,t){this.data=e,this.id=t}token(e,t){let{parser:i}=t.p;!function(e,t,i,n,s,r){let o=0,a=1<0){let i=e[n];if(l.allows(i)&&(-1==t.token.value||t.token.value==i||Rp(i,t.token.value,s,r))){t.acceptToken(i);break}}let n=t.next,h=0,c=e[o+2];if(!(t.next<0&&c>h&&65535==e[i+3*c-3]&&65535==e[i+3*c-3])){for(;h>1,r=i+s+(s<<1),a=e[r],l=e[r+1]||65536;if(n=l)){o=e[r+2],t.advance();continue e}h=s+1}}break}o=e[i+3*c-1]}}(this.data,e,t,this.id,i.data,i.tokenPrecTable)}}Mp.prototype.contextual=Mp.prototype.fallback=Mp.prototype.extend=!1,Mp.prototype.fallback=Mp.prototype.extend=!1;class Ep{constructor(e,t={}){this.token=e,this.contextual=!!t.contextual,this.fallback=!!t.fallback,this.extend=!!t.extend}}function Ap(e,t,i){for(let n,s=t;65535!=(n=e[s]);s++)if(n==i)return s-t;return-1}function Rp(e,t,i,n){let s=Ap(i,n,t);return s<0||Ap(i,n,e)t)&&!n.type.isError)return i<0?Math.max(0,Math.min(n.to-1,t-25)):Math.min(e.length,Math.max(n.from+1,t+25));if(i<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return i<0?0:e.length}}class Lp{constructor(e,t){this.fragments=e,this.nodeSet=t,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?qp(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?qp(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=r,null;if(s instanceof Do){if(r==e){if(r=Math.max(this.safeFrom,e)&&(this.trees.push(s),this.start.push(r),this.index.push(0))}else this.index[t]++,this.nextStart=r+s.length}}}class Np{constructor(e,t){this.stream=t,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map((e=>new Tp))}getActions(e){let t=0,i=null,{parser:n}=e.p,{tokenizers:s}=n,r=n.stateSlot(e.state,3),o=e.curContext?e.curContext.hash:0,a=0;for(let n=0;nh.end+25&&(a=Math.max(h.lookAhead,a)),0!=h.value)){let n=t;if(h.extended>-1&&(t=this.addActions(e,h.extended,h.end,t)),t=this.addActions(e,h.value,h.end,t),!l.extend&&(i=h,t>n))break}}for(;this.actions.length>t;)this.actions.pop();return a&&e.setLookAhead(a),i||e.pos!=this.stream.end||(i=new Tp,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,t=this.addActions(e,i.value,i.end,t)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let t=new Tp,{pos:i,p:n}=e;return t.start=i,t.end=Math.min(i+1,n.stream.end),t.value=i==n.stream.end?n.parser.eofTerm:0,t}updateCachedToken(e,t,i){let n=this.stream.clipPos(i.pos);if(t.token(this.stream.reset(n,e),i),e.value>-1){let{parser:t}=i.p;for(let n=0;n=0&&i.p.parser.dialect.allows(s>>1)){0==(1&s)?e.value=s>>1:e.extended=s>>1;break}}}else e.value=0,e.end=this.stream.clipPos(n+1)}putAction(e,t,i,n){for(let t=0;t4*e.bufferLength?new Lp(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e,t,i=this.stacks,n=this.minStackPos,s=this.stacks=[];if(this.bigReductionCount>300&&1==i.length){let[e]=i;for(;e.forceReduce()&&e.stack.length&&e.stack[e.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;rn)s.push(o);else{if(this.advanceStack(o,s,i))continue;{e||(e=[],t=[]),e.push(o);let i=this.tokens.getMainToken(o);t.push(i.value,i.end)}}break}}if(!s.length){let t=e&&function(e){let t=null;for(let i of e){let e=i.p.stoppedAt;(i.pos==i.p.stream.end||null!=e&&i.pos>e)&&i.p.parser.stateFlag(i.state,2)&&(!t||t.scorethis.stoppedAt?e[0]:this.runRecovery(e,t,s);if(i)return Dp&&console.log("Force-finish "+this.stackID(i)),this.stackToTree(i.forceAll())}if(this.recovering){let e=1==this.recovering?1:3*this.recovering;if(s.length>e)for(s.sort(((e,t)=>t.score-e.score));s.length>e;)s.pop();s.some((e=>e.reducePos>n))&&this.recovering--}else if(s.length>1){e:for(let e=0;e500&&n.buffer.length>500){if(!((t.score-n.score||t.buffer.length-n.buffer.length)>0)){s.splice(e--,1);continue e}s.splice(i--,1)}}}s.length>12&&s.splice(12,s.length-12)}this.minStackPos=s[0].pos;for(let e=1;e ":"";if(null!=this.stoppedAt&&n>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let t=e.curContext&&e.curContext.tracker.strict,i=t?e.curContext.hash:0;for(let o=this.fragments.nodeAt(n);o;){let n=this.parser.nodeSet.types[o.type.id]==o.type?s.getGoto(e.state,o.type.id):-1;if(n>-1&&o.length&&(!t||(o.prop(ko.contextHash)||0)==i))return e.useNode(o,n),Dp&&console.log(r+this.stackID(e)+` (via reuse of ${s.getName(o.type.id)})`),!0;if(!(o instanceof Do)||0==o.children.length||o.positions[0]>0)break;let a=o.children[0];if(!(a instanceof Do&&0==o.positions[0]))break;o=a}}let o=s.stateSlot(e.state,4);if(o>0)return e.reduce(o),Dp&&console.log(r+this.stackID(e)+` (via always-reduce ${s.getName(65535&o)})`),!0;if(e.stack.length>=9e3)for(;e.stack.length>6e3&&e.forceReduce(););let a=this.tokens.getActions(e);for(let o=0;on?t.push(u):i.push(u)}return!1}advanceFully(e,t){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return $p(e,t),!0}}runRecovery(e,t,i){let n=null,s=!1;for(let r=0;r ":"";if(o.deadEnd){if(s)continue;if(s=!0,o.restart(),Dp&&console.log(h+this.stackID(o)+" (restarted)"),this.advanceFully(o,i))continue}let c=o.split(),d=h;for(let e=0;c.forceReduce()&&e<10&&(Dp&&console.log(d+this.stackID(c)+" (via force-reduce)"),!this.advanceFully(c,i));e++)Dp&&(d=this.stackID(c)+" -> ");for(let e of o.recoverByInsert(a))Dp&&console.log(h+this.stackID(e)+" (via recover-insert)"),this.advanceFully(e,i);this.stream.end>o.pos?(l==o.pos&&(l++,a=0),o.recoverByDelete(a,l),Dp&&console.log(h+this.stackID(o)+` (via recover-delete ${this.parser.getName(a)})`),$p(o,i)):(!n||n.scoree;class jp extends Jo{constructor(e){if(super(),this.wrappers=[],14!=e.version)throw new RangeError(`Parser version (${e.version}) doesn't match runtime version (14)`);let t=e.nodeNames.split(" ");this.minRepeatTerm=t.length;for(let i=0;ie.topRules[t][1])),n=[];for(let e=0;e=0)s(n,e,t[i++]);else{let r=t[i+-n];for(let o=-n;o>0;o--)s(t[i++],e,r);i++}}}this.nodeSet=new Mo(t.map(((t,s)=>Po.define({name:s>=this.minRepeatTerm?void 0:t,id:s,props:n[s],top:i.indexOf(s)>-1,error:0==s,skipped:e.skippedNodes&&e.skippedNodes.indexOf(s)>-1})))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=wo;let r=kp(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let e=0;e"number"==typeof e?new Mp(r,e):e)),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,t,i){let n=new Bp(this,e,t,i);for(let s of this.wrappers)n=s(n,e,t,i);return n}getGoto(e,t,i=!1){let n=this.goto;if(t>=n[0])return-1;for(let s=n[t+1];;){let t=n[s++],r=1&t,o=n[s++];if(r&&i)return o;for(let i=s+(t>>1);s0}validAction(e,t){return!!this.allActions(e,(e=>e==t||null))}allActions(e,t){let i=this.stateSlot(e,4),n=i?t(i):void 0;for(let i=this.stateSlot(e,1);null==n;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=Wp(this.data,i+2)}n=t(Wp(this.data,i+1))}return n}nextStates(e){let t=[];for(let i=this.stateSlot(e,1);;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=Wp(this.data,i+2)}if(0==(1&this.data[i+2])){let e=this.data[i+1];t.some(((t,i)=>1&i&&t==e))||t.push(this.data[i],e)}}return t}configure(e){let t=Object.assign(Object.create(jp.prototype),this);if(e.props&&(t.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);t.top=i}return e.tokenizers&&(t.tokenizers=this.tokenizers.map((t=>{let i=e.tokenizers.find((e=>e.from==t));return i?i.to:t}))),e.specializers&&(t.specializers=this.specializers.slice(),t.specializerSpecs=this.specializerSpecs.map(((i,n)=>{let s=e.specializers.find((e=>e.from==i.external));if(!s)return i;let r=Object.assign(Object.assign({},i),{external:s.to});return t.specializers[n]=Vp(r),r}))),e.contextTracker&&(t.context=e.contextTracker),e.dialect&&(t.dialect=this.parseDialect(e.dialect)),null!=e.strict&&(t.strict=e.strict),e.wrap&&(t.wrappers=t.wrappers.concat(e.wrap)),null!=e.bufferLength&&(t.bufferLength=e.bufferLength),t}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let t=this.dynamicPrecedences;return null==t?0:t[e]||0}parseDialect(e){let t=Object.keys(this.dialects),i=t.map((()=>!1));if(e)for(let n of e.split(" ")){let e=t.indexOf(n);e>=0&&(i[e]=!0)}let n=null;for(let e=0;ee.external(i,n)<<1|t}return e.get}const Up=new Set([27,51,52,270,67,133,58,59,251,64,65,74,62,63,154,155,158,115]);function Fp(e){return 10==e||13==e}const Hp=new Ep(((e,t)=>{let i;if(e.next<0)e.acceptToken(206);else if(t.context.depth<0)Fp(e.next)&&e.acceptToken(205,1);else if(((i=e.peek(-1))<0||Fp(i))&&t.canShift(204)){let t=0;for(;32==e.next||9==e.next;)e.advance(),t++;10!=e.next&&13!=e.next&&35!=e.next||e.acceptToken(204,-t)}else Fp(e.next)&&e.acceptToken(203,1)}),{contextual:!0}),Xp=new Ep(((e,t)=>{let i=t.context.depth;if(i<0)return;let n=e.peek(-1);if(10==n||13==n){let t=0,n=0;for(;;){if(32==e.next)t++;else{if(9!=e.next)break;t+=8-t%8}e.advance(),n++}t!=i&&10!=e.next&&13!=e.next&&35!=e.next&&(t0),this.strict=!1!==e.strict}}({start:Gp,reduce:(e,t)=>e.depth<0&&Up.has(t)?e.parent:e,shift:(e,t,i,n)=>201==t?new Yp(e,function(e){let t=0;for(let i=0;ie.hash}),Kp=new Ep((e=>{for(let t=0;t<5;t++){if(e.next!="print".charCodeAt(t))return;e.advance()}if(!/\w/.test(String.fromCharCode(e.next)))for(let t=0;;t++){let i=e.peek(t);if(32!=i&&9!=i)return void(40!=i&&46!=i&&10!=i&&13!=i&&35!=i&&e.acceptToken(1))}}));function Jp(e,t,i,n,s){return new Ep((r=>{let o=r.pos;for(;!(r.next<0);)if(123==r.next){if(123!=r.peek(1)){if(r.pos==o)return void r.acceptToken(n,1);break}r.advance(2)}else if(92==r.next)r.advance(),r.next>=0&&r.advance();else{if(r.next==e&&(1==t||r.peek(1)==e&&r.peek(2)==e)){if(r.pos==o)return void r.acceptToken(s,t);break}r.advance()}r.pos>o&&r.acceptToken(i)}))}const ef=Jp(39,1,207,2,208),tf=Jp(34,1,209,3,210),nf=Jp(39,3,211,4,212),sf=Jp(34,3,213,5,214),rf=ra({'async "*" "**" FormatConversion FormatSpec':Ta.modifier,"for while if elif else try except finally return raise break continue with pass assert await yield match case":Ta.controlKeyword,"in not and or is del":Ta.operatorKeyword,"from def class global nonlocal lambda":Ta.definitionKeyword,import:Ta.moduleKeyword,"with as print":Ta.keyword,Boolean:Ta.bool,None:Ta.null,VariableName:Ta.variableName,"CallExpression/VariableName":Ta.function(Ta.variableName),"FunctionDefinition/VariableName":Ta.function(Ta.definition(Ta.variableName)),"ClassDefinition/VariableName":Ta.definition(Ta.className),PropertyName:Ta.propertyName,"CallExpression/MemberExpression/PropertyName":Ta.function(Ta.propertyName),Comment:Ta.lineComment,Number:Ta.number,String:Ta.string,FormatString:Ta.special(Ta.string),UpdateOp:Ta.updateOperator,"ArithOp!":Ta.arithmeticOperator,BitOp:Ta.bitwiseOperator,CompareOp:Ta.compareOperator,AssignOp:Ta.definitionOperator,Ellipsis:Ta.punctuation,At:Ta.meta,"( )":Ta.paren,"[ ]":Ta.squareBracket,"{ }":Ta.brace,".":Ta.derefOperator,", ;":Ta.separator}),of={__proto__:null,await:48,or:58,and:60,in:64,not:66,is:68,if:74,else:76,lambda:80,yield:98,from:100,async:106,for:108,None:168,True:170,False:170,del:184,pass:188,break:192,continue:196,return:200,raise:208,import:212,as:214,global:218,nonlocal:220,assert:224,type:229,elif:242,while:246,try:252,except:254,finally:256,with:260,def:264,class:274,match:285,case:291},af=jp.deserialize({version:14,states:"#&jO`Q#yOOP$bOSOOO%kQ&nO'#HcOOQS'#Cq'#CqOOQS'#Cr'#CrO'ZQ#xO'#CpO(|Q&nO'#HbOOQS'#Hc'#HcOOQS'#DW'#DWOOQS'#Hb'#HbO)jQ#xO'#DaO)}Q#xO'#DhO*_Q#xO'#DlOOQS'#Dw'#DwO*rO,UO'#DwO*zO7[O'#DwO+SOWO'#DxO+_O`O'#DxO+jOpO'#DxO+uO!bO'#DxO-wQ&nO'#HSOOQS'#HS'#HSO'ZQ#xO'#HRO/ZQ&nO'#HROOQS'#Ee'#EeO/rQ#xO'#EfOOQS'#HQ'#HQO/|Q#xO'#HPOOQV'#HP'#HPO0XQ#xO'#F]OOQS'#Ge'#GeO0^Q#xO'#F[OOQV'#IY'#IYOOQV'#HO'#HOOOQV'#Ft'#FtQ`Q#yOOO'ZQ#xO'#CsO0lQ#xO'#DPO0sQ#xO'#DTO1RQ#xO'#HgO1cQ&nO'#EYO'ZQ#xO'#EZOOQS'#E]'#E]OOQS'#E_'#E_OOQS'#Ea'#EaO1wQ#xO'#EcO2_Q#xO'#EgO0XQ#xO'#EiO2rQ&nO'#EiO0XQ#xO'#ElO/rQ#xO'#EoO0XQ#xO'#EqO/rQ#xO'#EwO/rQ#xO'#EzO2}Q#xO'#E|O3UQ#xO'#FRO3aQ#xO'#E}O/rQ#xO'#FRO0XQ#xO'#FTO0XQ#xO'#FYO3fQ#xO'#F_P3mO#xO'#G}POOO)CBq)CBqOOQS'#Cg'#CgOOQS'#Ch'#ChOOQS'#Ci'#CiOOQS'#Cj'#CjOOQS'#Ck'#CkOOQS'#Cl'#ClOOQS'#Cn'#CnO'ZQ#xO,59QO'ZQ#xO,59QO'ZQ#xO,59QO'ZQ#xO,59QO'ZQ#xO,59QO'ZQ#xO,59QO3xQ#xO'#DqOOQS,5:[,5:[O4]Q#xO'#HqOOQS,5:_,5:_O4jQMlO,5:_O4oQ&nO,59[O0lQ#xO,59dO0lQ#xO,59dO0lQ#xO,59dO7_Q#xO,59dO7dQ#xO,59dO7kQ#xO,59lO7rQ#xO'#HbO8xQ#xO'#HaOOQS'#Ha'#HaOOQS'#D^'#D^O9aQ#xO,59cO'ZQ#xO,59cO9oQ#xO,59cOOQS,59{,59{O9tQ#xO,5:TO'ZQ#xO,5:TOOQS,5:S,5:SO:SQ#xO,5:SO:XQ#xO,5:ZO'ZQ#xO,5:ZO'ZQ#xO,5:XOOQS,5:W,5:WO:jQ#xO,5:WO:oQ#xO,5:YOOOO'#F|'#F|O:tO,UO,5:cOOQS,5:c,5:cOOOO'#F}'#F}O:|O7[O,5:cO;UQ#xO'#DyOOOW'#GO'#GOO;fOWO,5:dOOQS,5:d,5:dO;UQ#xO'#D}OOO`'#GR'#GRO;qO`O,5:dO;UQ#xO'#EOOOOp'#GS'#GSO;|OpO,5:dO;UQ#xO'#EPOOO!b'#GT'#GTOROOQS,5>R,5>RO/rQ#xO'#EUOOQS'#EV'#EVOGZQ#xO'#GWOGkQ#xO,59OOGkQ#xO,59OO)pQ#xO,5:rOGyQ&nO'#HjOOQS,5:u,5:uOOQS,5:},5:}OH^Q#xO,5;ROHoQ#xO,5;TOOQS'#GZ'#GZOH}Q&nO,5;TOI]Q#xO,5;TOIbQ#xO'#IWOOQS,5;W,5;WOIpQ#xO'#ISOOQS,5;Z,5;ZOJRQ#xO,5;]O3aQ#xO,5;cO3aQ#xO,5;fOJZQ&nO'#IZO'ZQ#xO'#IZOJeQ#xO,5;hO2}Q#xO,5;hO/rQ#xO,5;mO0XQ#xO,5;oOJjQ#yO'#ExOKvQ#{O,5;iO! [Q#xO'#I[O3aQ#xO,5;mO! gQ#xO,5;oO! oQ#xO,5;tO! zQ&nO,5;yO'ZQ#xO,5;yPOOO,5=i,5=iP!!ROSO,5=iP!!WO#xO,5=iO!${Q&nO1G.lO!%SQ&nO1G.lO!'sQ&nO1G.lO!'}Q&nO1G.lO!*hQ&nO1G.lO!*{Q&nO1G.lO!+`Q#xO'#HpO!+nQ&nO'#HSO/rQ#xO'#HpO!+xQ#xO'#HoOOQS,5:],5:]O!,QQ#xO,5:]O!,VQ#xO'#HrO!,bQ#xO'#HrO!,uQ#xO,5>]OOQS'#Du'#DuOOQS1G/y1G/yOOQS1G/O1G/OO!-uQ&nO1G/OO!-|Q&nO1G/OO0lQ#xO1G/OO!.iQ#xO1G/WOOQS'#D]'#D]O/rQ#xO,59vOOQS1G.}1G.}O!.pQ#xO1G/gO!/QQ#xO1G/gO!/YQ#xO1G/hO'ZQ#xO'#HiO!/_Q#xO'#HiO!/dQ&nO1G.}O!/tQ#xO,59kO!0zQ#xO,5>XO!1[Q#xO,5>XO!1dQ#xO1G/oO!1iQ&nO1G/oOOQS1G/n1G/nO!1yQ#xO,5>SO!2pQ#xO,5>SO/rQ#xO1G/sO!3_Q#xO1G/uO!3dQ&nO1G/uO!3tQ&nO1G/sOOQS1G/r1G/rOOQS1G/t1G/tOOOO-E9z-E9zOOQS1G/}1G/}OOOO-E9{-E9{O!4UQ#xO'#H|O/rQ#xO'#H|O!4dQ#xO,5:eOOOW-E9|-E9|OOQS1G0O1G0OO!4oQ#xO,5:iOOO`-E:P-E:PO!4zQ#xO,5:jOOOp-E:Q-E:QO!5VQ#xO,5:kOOO!b-E:R-E:ROOQS-E:S-E:SO!5bQ!LUO1G3XO!6RQ&nO1G3XO'ZQ#xO,5oOOQS1G1c1G1cO!7RQ#xO1G1cOOQS'#DX'#DXO/rQ#xO,5>OOOQS,5>O,5>OO!7WQ#xO'#FuO!7cQ#xO,59qO!7kQ#xO1G/ZO!7uQ&nO,5>SOOQS1G3m1G3mOOQS,5:p,5:pO!8fQ#xO'#HROOQS,5UO!9gQ#xO,5>UO/rQ#xO1G0mO/rQ#xO1G0mO0XQ#xO1G0oOOQS-E:X-E:XO!9xQ#xO1G0oO!:TQ#xO1G0oO!:YQ#xO,5>rO!:hQ#xO,5>rO!:vQ#xO,5>nO!;^Q#xO,5>nO!;oQ#xO'#EsO/rQ#xO1G0wO!;zQ#xO1G0wO!uO!BzQ#xO,5>uO!CSQ&nO,5>uO/rQ#xO1G1SO!C^Q#xO1G1SO3aQ#xO1G1XO! gQ#xO1G1ZOOQV,5;d,5;dO!CcQ#zO,5;dO!ChQ#{O1G1TO!F|Q#xO'#GbO3aQ#xO1G1TO3aQ#xO1G1TO!G^Q#xO,5>vO!GkQ#xO,5>vO0XQ#xO,5>vOOQV1G1X1G1XO!GsQ#xO'#FVO!HUQMlO1G1ZO!H^Q#xO1G1ZOOQV1G1`1G1`O3aQ#xO1G1`O!HcQ#xO1G1`O!HkQ#xO'#FaOOQV1G1e1G1eO! zQ&nO1G1ePOOO1G3T1G3TP!HpOSO1G3TOOQS,5>[,5>[OOQS'#Dr'#DrO/rQ#xO,5>[O!HuQ#xO,5>ZO!IYQ#xO,5>ZOOQS1G/w1G/wO!IbQ#xO,5>^O!IrQ#xO,5>^O!IzQ#xO,5>^O!J_Q#xO,5>^O!JoQ#xO,5>^OOQS1G3w1G3wOOQS7+$j7+$jO!7kQ#xO7+$rO!LbQ#xO1G/OO!LiQ#xO1G/OOOQS1G/b1G/bOOQS,5TO'ZQ#xO,5>TOOQS7+$i7+$iO!MVQ#xO7+%RO!M_Q#xO7+%SO!MdQ#xO1G3sOOQS7+%Z7+%ZO!MtQ#xO1G3sO!M|Q#xO7+%ZOOQS,5hO##PQ#xO,5>hO##PQ#xO,5>hO##_O$ISO'#D{O##jO#tO'#H}OOOW1G0P1G0PO##oQ#xO1G0POOO`1G0T1G0TO##wQ#xO1G0TOOOp1G0U1G0UO#$PQ#xO1G0UOOO!b1G0V1G0VO#$XQ#xO1G0VO#$aQ!LUO7+(sO#%QQ&nO1G2]P#%kQ#xO'#GVOOQS,5i,5>iOOOW7+%k7+%kOOO`7+%o7+%oOOOp7+%p7+%pOOO!b7+%q7+%qO#:`Q#xO1G3XO#:yQ#xO1G3XP'ZQ#xO'#FxO/rQ#xO<qO#;mQ#xO,5>qO0XQ#xO,5>qO#pOOQS<sO#sOOQS1G0y1G0yOOQS<xO#DpQ#xO,5>xOOQS,5>x,5>xO#D{Q#xO,5>wO#E^Q#xO,5>wOOQS1G1]1G1]OOQS,5;s,5;sOOQV<XAN>XO#HmQ#xO<eAN>eO/rQ#xO1G2PO#H}Q&nO1G2PP#IXQ#xO'#FyOOQS1G2V1G2VP#IfQ#xO'#GPO#IsQ#xO7+)nO#JZQ#xO,5:hOOOO-E:O-E:OO#JfQ#xO7+(sOOQSAN?_AN?_O#KPQ#xO,5VOOQSANBaANBaOOOO7+%n7+%nOOQS7+'|7+'|O$+jQ#xO<zO$.`Q#xO,5>zO0XQ#xO,5|O$!pQ#xO,5>|OOQS1G1s1G1sO$2WQ&nO,5<_OOQU7+'S7+'SO$$mQ#xO1G/kO$!pQ#xO,5<]O$2_Q#xO,5>}O$2fQ#xO,5>}OOQS1G1v1G1vOOQS7+'V7+'VP$!pQ#xO'#GkO$2nQ#xO1G4hO$2xQ#xO1G4hO$3QQ#xO1G4hOOQS7+%V7+%VO$3`Q#xO1G1wO$3nQ&nO'#FdO$3uQ#xO,5=UOOQS,5=U,5=UO$4TQ#xO1G4iOOQS-E:h-E:hO$!pQ#xO,5=TO$4[Q#xO,5=TO$4aQ#xO7+*SOOQS-E:g-E:gO$4kQ#xO7+*SO$!pQ#xO,5<^P$!pQ#xO'#GjO$4sQ#xO1G2oO$!pQ#xO1G2oP$5RQ#xO'#GiO$5YQ#xO<fPP>i?Z?^PP'a'aPP?vPP'a'aPP'a'a'a'a'a?z@t'aP@wP@}EXHxPH|IYI^IbIf'aPPPIjIs'XP'X'XP'XP'XP'XP'XP'X'X'XP'XPP'XPP'XP'XPIyJVJ_PJfJlPJfPJfJfPPPJfPLzPMTM_MeLzPJfMnPJfPMuM{PNPNe! S! mNPNP! s!!QNPNPNPNP!!f!!l!!o!!t!!w!#R!#X!#e!#w!#}!$X!$_!${!%R!%X!%_!%i!%o!%u!%{!&R!&X!&k!&u!&{!'R!'X!'c!'i!'o!'u!'{!(V!(]!(g!(m!(v!(|!)]!)e!)o!)vPPPPPPPPPPPPPPPPP!)|!*P!*V!*`!*j!*uPPPPPPPPPPPP!/l!1Q!5T!8hPP!8p!9S!9]!:U!9{!:_!:e!:h!:k!:n!:v!;gPPPPPPPPP!;j!;yPPPP!V!>`!?[!?_]jOs#v$w*W,d(TeOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!n!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(O(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1Z}!hQ#r$P$b$q$}%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!P!iQ#r$P$b$q$}%S%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!R!jQ#r$P$b$q$}%S%T%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!T!kQ#r$P$b$q$}%S%T%U%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!V!lQ#r$P$b$q$}%S%T%U%V%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!X!mQ#r$P$b$q$}%S%T%U%V%W%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!]!mQ!s#r$P$b$q$}%S%T%U%V%W%X%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O(TTOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!n!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(O(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1Z&iVOYZ[isuw}!O!S!U!V!Z!n!p!t!u!v!x!y#c#g#j#m#s#v$Y$[$^$a$u$w%[%a%h%k%m%t%y%{&V&b&o&s'O'P'W'Z'b'i'l'}(O(R(T(U(Y(a(i(o(u(x)V)X)a)p)w)y*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+h+i+l+t+w,O,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/s0[0z0{0|0}1P1Q1R1S1V1Z%sXOYZ[isw}!O!S!U!V!Z!n!p#c#g#j#m#s#v$Y$[$^$a$u$w%[%a%k%m%t%y%{&V&b&o&s'O'P'W'Z'b'i'l'}(O(R(T(U(Y(a(i(o(u(x)V)X)a)p)w)y*S*W*^*b*l*v*y*z*}+T+W+Y+]+^+a+h+i+l+t+w,O,d,l,m,p,z,{,|-O-P-S-W-Y-[-^-_-b-y-{.S.V.}/O/s1Q1R1SQ$VvQ/t/SR1W1Y'zeOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1ZW#ym!P!Q$hW$Rv&q/S1YQ$j!RQ$n!TQ${![Q$|!]W%Z!n(O*v,zS&p$S$TQ'e$vQ)Y&jQ)h'QU)i'S)j)kU)l'U)m+}W)s'Y,Q-j.dQ*d'nW*e'p,s-}.lQ,P)rS,r*f*gY-d+x-e.a.b/XQ-g+zQ-t,hQ-x,kQ.j-vl.o.R.u.v.x/d/f/k0R0W0]0b0m0r0uQ/W.`Q/l.wQ/x/^Q0T/hU0h0^0k0sX0n0c0o0v0wR&o$R!_!|YZ!U!V!p%a%m%t(R(T(U(a(i)y*y*z*}+T+W+Y,{,|-O-P-S.S.V.}/O/sR%k!{Q#QYQ&W#cQ&Z#gQ&]#jQ&_#mQ&x$^Q&{$aR-`+lT/R.Y0[![!oQ!s#r$P$b$q$}%S%T%U%V%W%X%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1OQ&m#zQ't$|R*p'uR'}%ZQ%d!rR/v/[(SdOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!n!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(O(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1ZS#pd#q!P.s.R.u.v.w.x/^/d/f/k0R0W0]0^0b0c0k0m0o0r0s0u0v0w(SdOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!n!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(O(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1ZT#pd#qT#d`#ee(|&W&Z&]&_)O)Q)S)U-`._T+m({+nT#ha#iT#kb#lT#nc#oQ$`xQ,P)sR,q*eX$^x$_$`&zQ'[$nQ'r${Q'u$|R*V'eQ)t'YV-i,Q-j.dZlOs$w*W,dXpOs*W,dQ$x!YQ']$oQ'^$pQ'o$zQ's$|Q*T'dQ*['iQ*_'jQ*`'kQ*m'qS*o't'uQ,W)yQ,Y)zQ,Z){Q,_*RS,a*U*nQ,e*YQ,f*ZS,g*]*^Q,w*pQ-l,VQ-m,XQ-o,`S-p,b,cQ-u,iQ-w,jQ.e-nQ.g-qQ.h-sQ.i-tQ/Y.fQ/Z.jQ/p.{R0Z/qWpOs*W,dR#|oQ'q${S*U'e'rR,c*VQ,p*eR-{,qQ*n'qQ,b*UR-q,cZnOos*W,dQ'w$}R*r'xT.P,x.Qu.z.R.u.v.x/^/d/f/k0R0W0]0^0b0k0m0r0s0ut.z.R.u.v.x/^/d/f/k0R0W0]0^0b0k0m0r0s0uQ/l.wX0n0c0o0v0w!P.r.R.u.v.w.x/^/d/f/k0R0W0]0^0b0c0k0m0o0r0s0u0v0wQ/a.qR/}/bg/d.t/e/y0Q0V0e0g0i0t0x0yu.y.R.u.v.x/^/d/f/k0R0W0]0^0b0k0m0r0s0uX/_.o.y/x0hR/z/^V0j0^0k0sR/q.{QsOS$Os,dR,d*WQ&r$UR)_&rS%z#W$WS(p%z(sT(s%}&tQ%n#OQ%u#SW(b%n%u(g(kQ(g%rR(k%wQ&}$bR)e&}Q(v&OQ+_(qT+e(v+_Q(P%]R*w(PS(S%`%aY*{(S*|-Q.W/PU*|(T(U(VU-Q*}+O+PS.W-R-SR/P.XQ#_^R&R#_Q#b_R&T#bQ#e`R&X#eQ(y&US+j(y+kR+k(zQ+n({R-a+nQ#iaR&[#iQ#lbR&^#lQ#ocR&`#oQ#qdR&a#qQ#tgQ&c#rW&f#t&c)b+uQ)b&wR+u1OQ$_xS&y$_&zR&z$`Q'X$lR)q'XQ&k#yR)Z&kQ$h!QR'R$hQ+y)iS-f+y.cR.c-gQ'V$jR)n'VQ,R)tR-k,RQ#wkR&h#wQ)x']R,U)xQ'`$qS*P'`*QR*Q'aQ'h$xR*X'hQ'm$yS*c'm,nR,n*dQ,t*iR.O,tWoOs*W,dR#{oQ.Q,xR.m.Qd/e.t/y0Q0V0e0g0i0t0x0yR0P/eU/].o/x0hR/w/]Q0d0VS0p0d0qR0q0eS0_/y/zR0l0_Q/g.tR0S/gR!`PXrOs*W,dWqOs*W,dR'f$wYkOs$w*W,dR&g#v[xOs#v$w*W,dR&x$^&hQOYZ[isuw}!O!S!U!V!Z!n!p!t!u!v!x!y#c#g#j#m#s#v$Y$[$^$a$u$w%[%a%h%k%m%t%y%{&V&b&o&s'O'P'W'Z'b'i'l'}(O(R(T(U(Y(a(i(o(u(x)V)X)a)p)w)y*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+h+i+l+t+w,O,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/s0[0z0{0|0}1P1Q1R1S1V1ZQ!sTQ#rfQ$PtU$by%p(eS$q!W$tQ$}!^Q%S!hQ%T!iQ%U!jQ%V!kQ%W!lQ%X!mQ%r#PQ%w#TQ%}#XQ&O#YQ&t$XQ'a$rQ'x%OQ)W&dU)c&|)d+vW)|'_*O,],^Q+R(_Q+[(nQ,[)}Q-Z+dQ0Y/oR1O1TQ#OYQ#SZQ$o!UQ$p!VQ%`!pQ(V%a^(^%m%t(a(i+T+W+Y^*x(R*z-O-P.V/O/sQ+O(TQ+P(UQ,X)yQ,}*yQ-R*}Q.T,{Q.U,|Q.X-SQ.|.SR/r.}[gOs#v$w*W,d!^!{YZ!U!V!p%a%m%t(R(T(U(a(i)y*y*z*}+T+W+Y,{,|-O-P-S.S.V.}/O/sQ#W[Q#uiS$Ww}Q$e!OW$l!S$a'b*SS$y!Z$uW%Y!n(O*v,zY&U#c#g#j#m+l`&e#s&b)V)X)a+t-b1SQ&u$YQ&v$[Q&w$^Q'{%[Q(]%kW(m%y(o+]+aQ(q%{Q(z&VQ)]&oS)`&s1QQ)f'OQ)g'PU)o'W)p,OQ)v'ZQ*]'iY*a'l*b,l,m-yQ*t'}S+Q(Y1RW+c(u+^-W-[W+g(x+i-^-_Q,T)wQ,i*^Q,v*lQ-]+hQ-c+wQ-z,pQ.]-YR.k-{hUOs#s#v$w&b&s(Y)V)X*W,d%Y!zYZ[iw}!O!S!U!V!Z!n!p#c#g#j#m$Y$[$^$a$u%[%a%k%m%t%y%{&V&o'O'P'W'Z'b'i'l'}(O(R(T(U(a(i(o(u(x)a)p)w)y*S*^*b*l*v*y*z*}+T+W+Y+]+^+a+h+i+l+t+w,O,l,m,p,z,{,|-O-P-S-W-Y-[-^-_-b-y-{.S.V.}/O/s1Q1R1SQ$QuW%e!t!x0{1VQ%f!uQ%g!vQ%i!yQ%s0zS(X%h1PQ(Z0|Q([0}Q-T+UQ.[-US/Q.Y0[R1X1ZU$Uv/S1YR)^&q[hOs#v$w*W,da!}Y#c#g#j#m$^$a+lQ#][Q$ZwR$d}Q%o#OQ%v#SQ%|#WQ'{%YQ(h%rQ(l%wQ(t%}Q(w&OQ+`(qQ,y*tQ.Z-TQ/U.[R/u/TQ$cyQ(d%pR+V(eQ/T.YR0f0[R#VZR#[[R%_!nQ%]!nV*u(O*v,z!]!qQ!s#r$P$b$q$}%S%T%U%V%W%X%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1OR%b!pQ&W#cQ&Z#gQ&]#jQ&_#mR-`+lQ(}&WQ)P&ZQ)R&]Q)T&_Q+p)OQ+q)QQ+r)SQ+s)UQ.^-`R/V._Q$m!SQ&{$aQ*R'bR,`*SQ#zmQ$f!PQ$i!QR'T$hQ)h'SR+|)kQ)h'SQ+{)jR+|)kR$k!RR)u'YXqOs*W,dQ$s!WR'c$tQ$z!ZR'd$uR*k'pQ*i'pV-|,s-}.lQ.{.RQ/i.uR/j.vU.t.R.u.vQ/n.xQ/y/^Q0O/dU0Q/f0R0bQ0V/kQ0e0WQ0g0]U0i0^0k0sQ0t0mQ0x0rR0y0uR/m.wR/{/^",nodeNames:"⚠ print { { { { Comment Script AssignStatement * BinaryExpression BitOp BitOp BitOp BitOp ArithOp ArithOp @ ArithOp ** UnaryExpression ArithOp BitOp AwaitExpression await ) ( ParenthesizedExpression BinaryExpression or and CompareOp in not is UnaryExpression ConditionalExpression if else LambdaExpression lambda ParamList VariableName AssignOp , : NamedExpression AssignOp YieldExpression yield from TupleExpression ComprehensionExpression async for LambdaExpression ] [ ArrayExpression ArrayComprehensionExpression } { DictionaryExpression DictionaryComprehensionExpression SetExpression SetComprehensionExpression CallExpression ArgList AssignOp MemberExpression . PropertyName Number String FormatString FormatReplacement FormatConversion FormatSpec FormatReplacement FormatReplacement FormatReplacement FormatReplacement ContinuedString Ellipsis None Boolean TypeDef AssignOp UpdateStatement UpdateOp ExpressionStatement DeleteStatement del PassStatement pass BreakStatement break ContinueStatement continue ReturnStatement return YieldStatement PrintStatement RaiseStatement raise ImportStatement import as ScopeStatement global nonlocal AssertStatement assert TypeDefinition type TypeParamList TypeParam StatementGroup ; IfStatement Body elif WhileStatement while ForStatement TryStatement try except finally WithStatement with FunctionDefinition def ParamList AssignOp TypeDef ClassDefinition class DecoratedStatement Decorator At MatchStatement match MatchBody MatchClause case CapturePattern LiteralPattern ArithOp ArithOp AsPattern OrPattern LogicOp AttributePattern SequencePattern MappingPattern StarPattern ClassPattern PatternArgList KeywordPattern KeywordPattern Guard",maxTerm:283,context:Zp,nodeProps:[["group",-15,8,88,90,91,93,95,97,99,101,102,103,105,108,111,113,"Statement Statement",-22,10,20,23,27,42,51,52,58,59,62,63,64,65,66,69,72,73,74,82,83,84,85,"Expression",-10,117,119,122,124,125,129,131,136,138,141,"Statement",-9,146,147,150,151,153,154,155,156,157,"Pattern"],["openedBy",25,"(",56,"[",60,"{"],["closedBy",26,")",57,"]",61,"}"]],propSources:[rf],skippedNodes:[0,6],repeatNodeCount:38,tokenData:"%-W#sR!`OX%TXY=|Y[%T[]=|]p%Tpq=|qr@_rsDOst!+|tu%Tuv!Nnvw#!|wx#$Wxy#:Uyz#;Yz{#<^{|#>x|}#@S}!O#AW!O!P#Ci!P!Q#N_!Q!R$!y!R![$&w![!]$1e!]!^$3s!^!_$4w!_!`$7c!`!a$8m!a!b%T!b!c$;U!c!d$W!e!h$W#V#Y$Q<%lO$Xc&r!b&jS&mW%p!TOX%TXY=|Y[%T[]=|]p%Tpq=|qr%Trs&Vsw%Twx/Xx#O%T#O#P?d#P#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T#s?i[&r!bOY%TYZ=|Z]%T]^=|^#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=P;=`<%l8^<%lO%T!q@hd&r!b&jS&mWOr%Trs&Vsw%Twx/Xx!_%T!_!`Av!`#O%T#O#P7o#P#T%T#T#UBz#U#f%T#f#gBz#g#hBz#h#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T!qBR]oR&r!b&jS&mWOr%Trs&Vsw%Twx/Xx#O%T#O#P7o#P#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T!qCV]!nR&r!b&jS&mWOr%Trs&Vsw%Twx/Xx#O%T#O#P7o#P#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T#cDXa&r!b&jS&hsOYE^YZ%TZ]E^]^%T^rE^rs!)|swE^wxGpx#OE^#O#P!!u#P#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!)v<%lOE^#cEia&r!b&jS&mW&hsOYE^YZ%TZ]E^]^%T^rE^rsFnswE^wxGpx#OE^#O#P!!u#P#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!)v<%lOE^#cFw]&r!b&jS&hsOr%Trs'Vsw%Twx/Xx#O%T#O#P7o#P#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T#cGya&r!b&mW&hsOYE^YZ%TZ]E^]^%T^rE^rsFnswE^wxIOx#OE^#O#P!!u#P#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!)v<%lOE^#cIXa&r!b&mW&hsOYE^YZ%TZ]E^]^%T^rE^rsFnswE^wxJ^x#OE^#O#P!!u#P#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!)v<%lOE^#_Jg_&r!b&mW&hsOYJ^YZ1XZ]J^]^1X^rJ^rsKfs#OJ^#O#PL`#P#oJ^#o#pL}#p#qJ^#q#rL}#r;'SJ^;'S;=`!!o<%lOJ^#_KmZ&r!b&hsOr1Xrs2ys#O1X#O#P3q#P#o1X#o#p4`#p#q1X#q#r4`#r;'S1X;'S;=`7i<%lO1X#_LeW&r!bO#oJ^#o#pL}#p#qJ^#q#rL}#r;'SJ^;'S;=`! r;=`<%lL}<%lOJ^{MUZ&mW&hsOYL}YZ4`Z]L}]^4`^rL}rsMws#OL}#O#PNc#P;'SL};'S;=`! l<%lOL}{M|V&hsOr4`rs5ds#O4`#O#P5y#P;'S4`;'S;=`6t<%lO4`{NfRO;'SL};'S;=`No;=`OL}{Nv[&mW&hsOYL}YZ4`Z]L}]^4`^rL}rsMws#OL}#O#PNc#P;'SL};'S;=`! l;=`<%lL}<%lOL}{! oP;=`<%lL}#_! y[&mW&hsOYL}YZ4`Z]L}]^4`^rL}rsMws#OL}#O#PNc#P;'SL};'S;=`! l;=`<%lJ^<%lOL}#_!!rP;=`<%lJ^#c!!zW&r!bO#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!(q;=`<%l!#d<%lOE^!P!#m]&jS&mW&hsOY!#dYZ8^Z]!#d]^8^^r!#drs!$fsw!#dwx!%Yx#O!#d#O#P!'Y#P;'S!#d;'S;=`!(k<%lO!#d!P!$mX&jS&hsOr8^rs9rsw8^wx:dx#O8^#O#P;v#P;'S8^;'S;=`^s#O!=U#O#P!@j#P#o!=U#o#p!Ag#p#q!=U#q#r!Ag#r;'S!=U;'S;=`!FQ<%lO!=U#o!>e_U!T&r!bOY!=UYZ1XZ]!=U]^1X^r!=Urs!?ds#O!=U#O#P!@j#P#o!=U#o#p!Ag#p#q!=U#q#r!Ag#r;'S!=U;'S;=`!FQ<%lO!=U#o!?k_U!T&r!bOY!=UYZ1XZ]!=U]^1X^r!=Urs!3`s#O!=U#O#P!@j#P#o!=U#o#p!Ag#p#q!=U#q#r!Ag#r;'S!=U;'S;=`!FQ<%lO!=U#o!@q[U!T&r!bOY!=UYZ1XZ]!=U]^1X^#o!=U#o#p!Ag#p#q!=U#q#r!Ag#r;'S!=U;'S;=`!Ec;=`<%l4`<%lO!=U!]!AnZU!T&mWOY!AgYZ4`Z]!Ag]^4`^r!Agrs!Bas#O!Ag#O#P!DP#P;'S!Ag;'S;=`!E]<%lO!Ag!]!BfZU!TOY!AgYZ4`Z]!Ag]^4`^r!Agrs!CXs#O!Ag#O#P!DP#P;'S!Ag;'S;=`!E]<%lO!Ag!]!C^ZU!TOY!AgYZ4`Z]!Ag]^4`^r!Agrs!4Ys#O!Ag#O#P!DP#P;'S!Ag;'S;=`!E]<%lO!Ag!]!DUWU!TOY!AgYZ4`Z]!Ag]^4`^;'S!Ag;'S;=`!Dn;=`<%l4`<%lO!Ag!]!DsW&mWOr4`rs4zs#O4`#O#P5y#P;'S4`;'S;=`6t;=`<%l!Ag<%lO4`!]!E`P;=`<%l!Ag#o!EhW&mWOr4`rs4zs#O4`#O#P5y#P;'S4`;'S;=`6t;=`<%l!=U<%lO4`#o!FTP;=`<%l!=U#s!F_[U!T&r!bOY!+|YZ%TZ]!+|]^%T^#o!+|#o#p!GT#p#q!+|#q#r!GT#r;'S!+|;'S;=`!Mq;=`<%l8^<%lO!+|!a!G^]U!T&jS&mWOY!GTYZ8^Z]!GT]^8^^r!GTrs!HVsw!GTwx!JVx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!H^]U!T&jSOY!GTYZ8^Z]!GT]^8^^r!GTrs!IVsw!GTwx!JVx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!I^]U!T&jSOY!GTYZ8^Z]!GT]^8^^r!GTrs!5wsw!GTwx!JVx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!J^]U!T&mWOY!GTYZ8^Z]!GT]^8^^r!GTrs!HVsw!GTwx!KVx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!K^]U!T&mWOY!GTYZ8^Z]!GT]^8^^r!GTrs!HVsw!GTwx!Agx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!L[WU!TOY!GTYZ8^Z]!GT]^8^^;'S!GT;'S;=`!Lt;=`<%l8^<%lO!GT!a!L{Y&jS&mWOr8^rs9Qsw8^wx:dx#O8^#O#P;v#P;'S8^;'S;=`Q<%lO$TP;=`<%l$ei&r!b&jS&mW&g`&SsOr%Trs$@Ssw%Twx$C`x!Q%T!Q![$Q<%lO$Q<%lO$Q<%lO$Q<%lO$Q<%lO$of[e]||-1}],tokenPrec:7372}),lf=new Zo,hf=new Set(["Script","Body","FunctionDefinition","ClassDefinition","LambdaExpression","ForStatement","MatchClause"]);function cf(e){return(t,i,n)=>{if(n)return!1;let s=t.node.getChild("VariableName");return s&&i(s,e),!0}}const df={FunctionDefinition:cf("function"),ClassDefinition:cf("class"),ForStatement(e,t,i){if(i)for(let i=e.node.firstChild;i;i=i.nextSibling)if("VariableName"==i.name)t(i,"variable");else if("in"==i.name)break},ImportStatement(e,t){var i,n;let{node:s}=e,r="from"==(null===(i=s.firstChild)||void 0===i?void 0:i.name);for(let e=s.getChild("import");e;e=e.nextSibling)"VariableName"==e.name&&"as"!=(null===(n=e.nextSibling)||void 0===n?void 0:n.name)&&t(e,r?"variable":"namespace")},AssignStatement(e,t){for(let i=e.node.firstChild;i;i=i.nextSibling)if("VariableName"==i.name)t(i,"variable");else if(":"==i.name||"AssignOp"==i.name)break},ParamList(e,t){for(let i=null,n=e.node.firstChild;n;n=n.nextSibling)"VariableName"!=n.name||i&&/\*|AssignOp/.test(i.name)||t(n,"variable"),i=n},CapturePattern:cf("variable"),AsPattern:cf("variable"),__proto__:null};function uf(e,t){let i=lf.get(t);if(i)return i;let n=[],s=!0;function r(t,i){let s=e.sliceString(t.from,t.to);n.push({label:s,type:i})}return t.cursor(Ro.IncludeAnonymous).iterate((t=>{if(t.name){let e=df[t.name];if(e&&e(t,r,s)||!s&&hf.has(t.name))return!1;s=!1}else if(t.to-t.from>8192){for(let i of uf(e,t.node))n.push(i);return!1}})),lf.set(t,n),n}const pf=/^[\w\xa1-\uffff][\w\d\xa1-\uffff]*$/,ff=["String","FormatString","Comment","PropertyName"];function mf(e){let t=Da(e.state).resolveInner(e.pos,-1);if(ff.indexOf(t.name)>-1)return null;let i="VariableName"==t.name||t.to-t.from<20&&pf.test(e.state.sliceDoc(t.from,t.to));if(!i&&!e.explicit)return null;let n=[];for(let i=t;i;i=i.parent)hf.has(i.name)&&(n=n.concat(uf(e.state.doc,i)));return{options:n,from:i?t.from:e.pos,validFor:pf}}const gf=["__annotations__","__builtins__","__debug__","__doc__","__import__","__name__","__loader__","__package__","__spec__","False","None","True"].map((e=>({label:e,type:"constant"}))).concat(["ArithmeticError","AssertionError","AttributeError","BaseException","BlockingIOError","BrokenPipeError","BufferError","BytesWarning","ChildProcessError","ConnectionAbortedError","ConnectionError","ConnectionRefusedError","ConnectionResetError","DeprecationWarning","EOFError","Ellipsis","EncodingWarning","EnvironmentError","Exception","FileExistsError","FileNotFoundError","FloatingPointError","FutureWarning","GeneratorExit","IOError","ImportError","ImportWarning","IndentationError","IndexError","InterruptedError","IsADirectoryError","KeyError","KeyboardInterrupt","LookupError","MemoryError","ModuleNotFoundError","NameError","NotADirectoryError","NotImplemented","NotImplementedError","OSError","OverflowError","PendingDeprecationWarning","PermissionError","ProcessLookupError","RecursionError","ReferenceError","ResourceWarning","RuntimeError","RuntimeWarning","StopAsyncIteration","StopIteration","SyntaxError","SyntaxWarning","SystemError","SystemExit","TabError","TimeoutError","TypeError","UnboundLocalError","UnicodeDecodeError","UnicodeEncodeError","UnicodeError","UnicodeTranslateError","UnicodeWarning","UserWarning","ValueError","Warning","ZeroDivisionError"].map((e=>({label:e,type:"type"})))).concat(["bool","bytearray","bytes","classmethod","complex","float","frozenset","int","list","map","memoryview","object","range","set","staticmethod","str","super","tuple","type"].map((e=>({label:e,type:"class"})))).concat(["abs","aiter","all","anext","any","ascii","bin","breakpoint","callable","chr","compile","delattr","dict","dir","divmod","enumerate","eval","exec","exit","filter","format","getattr","globals","hasattr","hash","help","hex","id","input","isinstance","issubclass","iter","len","license","locals","max","min","next","oct","open","ord","pow","print","property","quit","repr","reversed","round","setattr","slice","sorted","sum","vars","zip"].map((e=>({label:e,type:"function"})))),vf=[Au("def ${name}(${params}):\n\t${}",{label:"def",detail:"function",type:"keyword"}),Au("for ${name} in ${collection}:\n\t${}",{label:"for",detail:"loop",type:"keyword"}),Au("while ${}:\n\t${}",{label:"while",detail:"loop",type:"keyword"}),Au("try:\n\t${}\nexcept ${error}:\n\t${}",{label:"try",detail:"/ except block",type:"keyword"}),Au("if ${}:\n\t\n",{label:"if",detail:"block",type:"keyword"}),Au("if ${}:\n\t${}\nelse:\n\t${}",{label:"if",detail:"/ else block",type:"keyword"}),Au("class ${name}:\n\tdef __init__(self, ${params}):\n\t\t\t${}",{label:"class",detail:"definition",type:"keyword"}),Au("import ${module}",{label:"import",detail:"statement",type:"keyword"}),Au("from ${module} import ${names}",{label:"from",detail:"import",type:"keyword"})],Of=Ld(ff,qd(gf.concat(vf)));function bf(e,t){let i=e.baseIndentFor(t),n=e.lineAt(e.pos,-1),s=n.from+n.text.length;return/^\s*($|#)/.test(n.text)&&e.node.toi?null:i+e.unit}const _f=Ra.define({name:"python",parser:af.configure({props:[Ga.add({Body:e=>{var t;return null!==(t=bf(e,e.node))&&void 0!==t?t:e.continue()},IfStatement:e=>/^\s*(else:|elif )/.test(e.textAfter)?e.baseIndent:e.continue(),TryStatement:e=>/^\s*(except |finally:|else:)/.test(e.textAfter)?e.baseIndent:e.continue(),"TupleExpression ComprehensionExpression ParamList ArgList ParenthesizedExpression":il({closing:")"}),"DictionaryExpression DictionaryComprehensionExpression SetExpression SetComprehensionExpression":il({closing:"}"}),"ArrayExpression ArrayComprehensionExpression":il({closing:"]"}),"String FormatString":()=>null,Script:e=>{if(e.pos+/\s*/.exec(e.textAfter)[0].length>=e.node.to){let t=null;for(let i=e.node,n=i.to;i=i.lastChild,i&&i.to==n;)"Body"==i.type.name&&(t=i);if(t){let i=bf(e,t);if(null!=i)return i}}return e.continue()}}),rl.add({"ArrayExpression DictionaryExpression SetExpression TupleExpression":function(e){let t=e.firstChild,i=e.lastChild;return t&&t.to({from:e.from+1,to:e.to-(e.to==t.doc.length?0:1)})})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"'''",'"""'],stringPrefixes:["f","fr","rf","r","u","b","br","rb","F","FR","RF","R","U","B","BR","RB"]},commentTokens:{line:"#"},indentOnInput:/^\s*([\}\]\)]|else:|elif |except |finally:)$/}}),yf="#e06c75",wf="#abb2bf",xf="#7d8799",Sf="#d19a66",kf="#2c313a",Tf="#282c34",Cf="#353a42",Pf="#528bff",Mf=[Ds.theme({"&":{color:wf,backgroundColor:Tf},".cm-content":{caretColor:Pf},".cm-cursor, .cm-dropCursor":{borderLeftColor:Pf},"&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:"#3E4451"},".cm-panels":{backgroundColor:"#21252b",color:wf},".cm-panels.cm-panels-top":{borderBottom:"2px solid black"},".cm-panels.cm-panels-bottom":{borderTop:"2px solid black"},".cm-searchMatch":{backgroundColor:"#72a1ff59",outline:"1px solid #457dff"},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:"#6199ff2f"},".cm-activeLine":{backgroundColor:"#6699ff0b"},".cm-selectionMatch":{backgroundColor:"#aafe661a"},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bad0f847"},".cm-gutters":{backgroundColor:Tf,color:xf,border:"none"},".cm-activeLineGutter":{backgroundColor:kf},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"#ddd"},".cm-tooltip":{border:"none",backgroundColor:Cf},".cm-tooltip .cm-tooltip-arrow:before":{borderTopColor:"transparent",borderBottomColor:"transparent"},".cm-tooltip .cm-tooltip-arrow:after":{borderTopColor:Cf,borderBottomColor:Cf},".cm-tooltip-autocomplete":{"& > ul > li[aria-selected]":{backgroundColor:kf,color:wf}}},{dark:!0}),Rl(Pl.define([{tag:Ta.keyword,color:"#c678dd"},{tag:[Ta.name,Ta.deleted,Ta.character,Ta.propertyName,Ta.macroName],color:yf},{tag:[Ta.function(Ta.variableName),Ta.labelName],color:"#61afef"},{tag:[Ta.color,Ta.constant(Ta.name),Ta.standard(Ta.name)],color:Sf},{tag:[Ta.definition(Ta.name),Ta.separator],color:wf},{tag:[Ta.typeName,Ta.className,Ta.number,Ta.changed,Ta.annotation,Ta.modifier,Ta.self,Ta.namespace],color:"#e5c07b"},{tag:[Ta.operator,Ta.operatorKeyword,Ta.url,Ta.escape,Ta.regexp,Ta.link,Ta.special(Ta.string)],color:"#56b6c2"},{tag:[Ta.meta,Ta.comment],color:xf},{tag:Ta.strong,fontWeight:"bold"},{tag:Ta.emphasis,fontStyle:"italic"},{tag:Ta.strikethrough,textDecoration:"line-through"},{tag:Ta.link,color:xf,textDecoration:"underline"},{tag:Ta.heading,fontWeight:"bold",color:yf},{tag:[Ta.atom,Ta.bool,Ta.special(Ta.variableName)],color:Sf},{tag:[Ta.processingInstruction,Ta.string,Ta.inserted],color:"#98c379"},{tag:Ta.invalid,color:"#ffffff"}]))];var Ef,Af,Rf,Df,If,qf,Lf,Nf,Bf,$f=__webpack_require__(5247),Qf=__webpack_require__(5895),zf=__webpack_require__(6424),jf=__webpack_require__(7564),Wf=__webpack_require__(3911);!function(e){e.copyText=function(e){const t=document.body,i=n=>{n.preventDefault(),n.stopPropagation(),n.clipboardData.setData("text",e),t.removeEventListener("copy",i,!0)};t.addEventListener("copy",i,!0),document.execCommand("copy")}}(Ef||(Ef={})),(Bf=Af||(Af={})).boxSizing=function(e){let t=window.getComputedStyle(e),i=parseFloat(t.borderTopWidth)||0,n=parseFloat(t.borderLeftWidth)||0,s=parseFloat(t.borderRightWidth)||0,r=parseFloat(t.borderBottomWidth)||0,o=parseFloat(t.paddingTop)||0,a=parseFloat(t.paddingLeft)||0,l=parseFloat(t.paddingRight)||0,h=parseFloat(t.paddingBottom)||0;return{borderTop:i,borderLeft:n,borderRight:s,borderBottom:r,paddingTop:o,paddingLeft:a,paddingRight:l,paddingBottom:h,horizontalSum:n+a+l+s,verticalSum:i+o+h+r}},Bf.sizeLimits=function(e){let t=window.getComputedStyle(e),i=parseFloat(t.minWidth)||0,n=parseFloat(t.minHeight)||0,s=parseFloat(t.maxWidth)||1/0,r=parseFloat(t.maxHeight)||1/0;return s=Math.max(i,s),r=Math.max(n,r),{minWidth:i,minHeight:n,maxWidth:s,maxHeight:r}},Bf.hitTest=function(e,t,i){let n=e.getBoundingClientRect();return t>=n.left&&t=n.top&&i=i.bottom||(n.topi.bottom&&n.height>=i.height?e.scrollTop-=i.top-n.top:(n.topi.height||n.bottom>i.bottom&&n.height{let e=Element.prototype;return e.matches||e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector||function(e){let t=this,i=t.ownerDocument?t.ownerDocument.querySelectorAll(e):[];return-1!==Array.prototype.indexOf.call(i,t)}})(),e.calculateSingle=function(e){let h=0,c=0,d=0;function u(t){let i=e.match(t);return null!==i&&(e=e.slice(i[0].length),!0)}for(e=(e=e.split(",",1)[0]).replace(l," $1 ");e.length>0;)if(u(t))h++;else if(u(i))c++;else if(u(n))c++;else if(u(r))d++;else if(u(o))c++;else if(u(s))d++;else if(!u(a))return 0;return h=Math.min(h,255),c=Math.min(c,255),d=Math.min(d,255),h<<16|c<<8|d};const t=/^#[^\s\+>~#\.\[:]+/,i=/^\.[^\s\+>~#\.\[:]+/,n=/^\[[^\]]+\]/,s=/^[^\s\+>~#\.\[:]+/,r=/^(::[^\s\+>~#\.\[:]+|:first-line|:first-letter|:before|:after)/,o=/^:[^\s\+>~#\.\[:]+/,a=/^[\s\+>~\*]+/,l=/:not\(([^\)]+)\)/g}(If||(If={}));class Vf{constructor(){this._first=null,this._last=null,this._size=0}get isEmpty(){return 0===this._size}get size(){return this._size}get length(){return this._size}get first(){return this._first?this._first.value:void 0}get last(){return this._last?this._last.value:void 0}get firstNode(){return this._first}get lastNode(){return this._last}*[Symbol.iterator](){let e=this._first;for(;e;)yield e.value,e=e.next}*retro(){let e=this._last;for(;e;)yield e.value,e=e.prev}*nodes(){let e=this._first;for(;e;)yield e,e=e.next}*retroNodes(){let e=this._last;for(;e;)yield e,e=e.prev}assign(e){this.clear();for(const t of e)this.addLast(t)}push(e){this.addLast(e)}pop(){return this.removeLast()}shift(e){this.addFirst(e)}unshift(){return this.removeFirst()}addFirst(e){let t=new qf.LinkedListNode(this,e);return this._first?(t.next=this._first,this._first.prev=t,this._first=t):(this._first=t,this._last=t),this._size++,t}addLast(e){let t=new qf.LinkedListNode(this,e);return this._last?(t.prev=this._last,this._last.next=t,this._last=t):(this._first=t,this._last=t),this._size++,t}insertBefore(e,t){if(!t||t===this._first)return this.addFirst(e);if(!(t instanceof qf.LinkedListNode)||t.list!==this)throw new Error("Reference node is not owned by the list.");let i=new qf.LinkedListNode(this,e),n=t,s=n.prev;return i.next=n,i.prev=s,n.prev=i,s.next=i,this._size++,i}insertAfter(e,t){if(!t||t===this._last)return this.addLast(e);if(!(t instanceof qf.LinkedListNode)||t.list!==this)throw new Error("Reference node is not owned by the list.");let i=new qf.LinkedListNode(this,e),n=t,s=n.next;return i.next=s,i.prev=n,n.next=i,s.prev=i,this._size++,i}removeFirst(){let e=this._first;if(e)return e===this._last?(this._first=null,this._last=null):(this._first=e.next,this._first.prev=null),e.list=null,e.next=null,e.prev=null,this._size--,e.value}removeLast(){let e=this._last;if(e)return e===this._first?(this._first=null,this._last=null):(this._last=e.prev,this._last.next=null),e.list=null,e.next=null,e.prev=null,this._size--,e.value}removeNode(e){if(!(e instanceof qf.LinkedListNode)||e.list!==this)throw new Error("Node is not owned by the list.");let t=e;t===this._first&&t===this._last?(this._first=null,this._last=null):t===this._first?(this._first=t.next,this._first.prev=null):t===this._last?(this._last=t.prev,this._last.next=null):(t.next.prev=t.prev,t.prev.next=t.next),t.list=null,t.next=null,t.prev=null,this._size--}clear(){let e=this._first;for(;e;){let t=e.next;e.list=null,e.prev=null,e.next=null,e=t}this._first=null,this._last=null,this._size=0}}!function(e){e.from=function(t){let i=new e;return i.assign(t),i}}(Vf||(Vf={})),function(e){e.LinkedListNode=class{constructor(e,t){this.list=null,this.next=null,this.prev=null,this.list=e,this.value=t}}}(qf||(qf={}));class Uf{constructor(e){this.type=e}get isConflatable(){return!1}conflate(e){return!1}}class Ff extends Uf{get isConflatable(){return!0}conflate(e){return!0}}!function(e){let t=null;const i=(n=Promise.resolve(),e=>{let t=!1;return n.then((()=>!t&&e())),()=>{t=!0}});var n;function s(e,t){let i=o.get(e);if(!i||0===i.length)return void c(e,t);let n=(0,jf.yW)((0,jf.kh)(i),(i=>!i||function(e,t,i){let n=!0;try{n="function"==typeof e?e(t,i):e.messageHook(t,i)}catch(e){l(e)}return n}(i,e,t)));n&&c(e,t)}e.sendMessage=s,e.postMessage=function(e,t){t.isConflatable&&(0,jf.G)(r,(i=>i.handler===e&&!!i.msg&&i.msg.type===t.type&&!!i.msg.isConflatable&&i.msg.conflate(t)))||d(e,t)},e.installMessageHook=function(e,t){let i=o.get(e);i&&-1!==i.indexOf(t)||(i?i.push(t):o.set(e,[t]))},e.removeMessageHook=function(e,t){let i=o.get(e);if(!i)return;let n=i.indexOf(t);-1!==n&&(i[n]=null,p(i))},e.clearData=function(e){let t=o.get(e);t&&t.length>0&&(jf.RO.fill(t,null),p(t));for(const t of r)t.handler===e&&(t.handler=null,t.msg=null)},e.flush=function(){h||null===t||(t(),t=null,h=!0,u(),h=!1)},e.getExceptionHandler=function(){return l},e.setExceptionHandler=function(e){let t=l;return l=e,t};const r=new Vf,o=new WeakMap,a=new Set;let l=e=>{console.error(e)},h=!1;function c(e,t){try{e.processMessage(t)}catch(e){l(e)}}function d(e,n){r.addLast({handler:e,msg:n}),null===t&&(t=i(u))}function u(){if(t=null,r.isEmpty)return;let e={handler:null,msg:null};for(r.addLast(e);;){let t=r.removeFirst();if(t===e)return;t.handler&&t.msg&&s(t.handler,t.msg)}}function p(e){0===a.size&&i(f),a.add(e)}function f(){a.forEach(m),a.clear()}function m(e){jf.RO.removeAllWhere(e,g)}function g(e){return null===e}}(Lf||(Lf={}));var Hf,Xf=__webpack_require__(4050),Yf=__webpack_require__(1122);class Gf{constructor(e){this._onScrollFrame=()=>{if(!this._scrollTarget)return;let{element:e,edge:t,distance:i}=this._scrollTarget,n=Hf.SCROLL_EDGE_SIZE-i,s=Math.pow(n/Hf.SCROLL_EDGE_SIZE,2),r=Math.max(1,Math.round(s*Hf.SCROLL_EDGE_SIZE));switch(t){case"top":e.scrollTop-=r;break;case"left":e.scrollLeft-=r;break;case"right":e.scrollLeft+=r;break;case"bottom":e.scrollTop+=r}requestAnimationFrame(this._onScrollFrame)},this._disposed=!1,this._dropAction="none",this._override=null,this._currentTarget=null,this._currentElement=null,this._promise=null,this._scrollTarget=null,this._resolve=null,this.document=e.document||document,this.mimeData=e.mimeData,this.dragImage=e.dragImage||null,this.proposedAction=e.proposedAction||"copy",this.supportedActions=e.supportedActions||"all",this.source=e.source||null}dispose(){if(!this._disposed){if(this._disposed=!0,this._currentTarget){let e=new PointerEvent("pointerup",{bubbles:!0,cancelable:!0,clientX:-1,clientY:-1});Hf.dispatchDragLeave(this,this._currentTarget,null,e)}this._finalize("none")}}get isDisposed(){return this._disposed}start(e,t){if(this._disposed)return Promise.resolve("none");if(this._promise)return this._promise;this._addListeners(),this._attachDragImage(e,t),this._promise=new Promise((e=>{this._resolve=e}));let i=new PointerEvent("pointermove",{bubbles:!0,cancelable:!0,clientX:e,clientY:t});return document.dispatchEvent(i),this._promise}handleEvent(e){switch(e.type){case"pointermove":this._evtPointerMove(e);break;case"pointerup":this._evtPointerUp(e);break;case"keydown":this._evtKeyDown(e);break;default:e.preventDefault(),e.stopPropagation()}}moveDragImage(e,t){this.dragImage&&(this.dragImage.style.transform=`translate(${e}px, ${t}px)`)}_evtPointerMove(e){e.preventDefault(),e.stopPropagation(),this._updateCurrentTarget(e),this._updateDragScroll(e),this.moveDragImage(e.clientX,e.clientY)}_evtPointerUp(e){if(e.preventDefault(),e.stopPropagation(),0!==e.button)return;if(this._updateCurrentTarget(e),!this._currentTarget)return void this._finalize("none");if("none"===this._dropAction)return Hf.dispatchDragLeave(this,this._currentTarget,null,e),void this._finalize("none");let t=Hf.dispatchDrop(this,this._currentTarget,e);this._finalize(t)}_evtKeyDown(e){e.preventDefault(),e.stopPropagation(),27===e.keyCode&&this.dispose()}_addListeners(){document.addEventListener("pointerdown",this,!0),document.addEventListener("pointermove",this,!0),document.addEventListener("pointerup",this,!0),document.addEventListener("pointerenter",this,!0),document.addEventListener("pointerleave",this,!0),document.addEventListener("pointerover",this,!0),document.addEventListener("pointerout",this,!0),document.addEventListener("keydown",this,!0),document.addEventListener("keyup",this,!0),document.addEventListener("keypress",this,!0),document.addEventListener("contextmenu",this,!0)}_removeListeners(){document.removeEventListener("pointerdown",this,!0),document.removeEventListener("pointermove",this,!0),document.removeEventListener("pointerup",this,!0),document.removeEventListener("pointerenter",this,!0),document.removeEventListener("pointerleave",this,!0),document.removeEventListener("pointerover",this,!0),document.removeEventListener("pointerout",this,!0),document.removeEventListener("keydown",this,!0),document.removeEventListener("keyup",this,!0),document.removeEventListener("keypress",this,!0),document.removeEventListener("contextmenu",this,!0)}_updateDragScroll(e){let t=Hf.findScrollTarget(e);(this._scrollTarget||t)&&(this._scrollTarget||setTimeout(this._onScrollFrame,500),this._scrollTarget=t)}_updateCurrentTarget(e){let t=this._currentTarget,i=this._currentTarget,n=this._currentElement,s=Hf.findElementBehidBackdrop(e,this.document);this._currentElement=s,s!==n&&s!==i&&Hf.dispatchDragExit(this,i,s,e),s!==n&&s!==i&&(i=Hf.dispatchDragEnter(this,s,i,e)),i!==t&&(this._currentTarget=i,Hf.dispatchDragLeave(this,t,i,e));let r=Hf.dispatchDragOver(this,i,e);this._setDropAction(r)}_attachDragImage(e,t){if(!this.dragImage)return;this.dragImage.classList.add("lm-mod-drag-image");let i=this.dragImage.style;i.pointerEvents="none",i.position="fixed",i.transform=`translate(${e}px, ${t}px)`,(this.document instanceof Document?this.document.body:this.document.firstElementChild).appendChild(this.dragImage)}_detachDragImage(){if(!this.dragImage)return;let e=this.dragImage.parentNode;e&&e.removeChild(this.dragImage)}_setDropAction(e){if(e=Hf.validateAction(e,this.supportedActions),!this._override||this._dropAction!==e)switch(e){case"none":this._dropAction=e,this._override=Gf.overrideCursor("no-drop",this.document);break;case"copy":this._dropAction=e,this._override=Gf.overrideCursor("copy",this.document);break;case"link":this._dropAction=e,this._override=Gf.overrideCursor("alias",this.document);break;case"move":this._dropAction=e,this._override=Gf.overrideCursor("move",this.document)}}_finalize(e){let t=this._resolve;this._removeListeners(),this._detachDragImage(),this._override&&(this._override.dispose(),this._override=null),this.mimeData.clear(),this._disposed=!0,this._dropAction="none",this._currentTarget=null,this._currentElement=null,this._scrollTarget=null,this._promise=null,this._resolve=null,t&&t(e)}}function Zf(){return em.keyboardLayout}!function(e){class t extends DragEvent{constructor(e,t){super(t.type,{bubbles:!0,cancelable:!0,altKey:e.altKey,button:e.button,clientX:e.clientX,clientY:e.clientY,ctrlKey:e.ctrlKey,detail:0,metaKey:e.metaKey,relatedTarget:t.related,screenX:e.screenX,screenY:e.screenY,shiftKey:e.shiftKey,view:window});const{drag:i}=t;this.dropAction="none",this.mimeData=i.mimeData,this.proposedAction=i.proposedAction,this.supportedActions=i.supportedActions,this.source=i.source}}e.Event=t,e.overrideCursor=function(e,t=document){return Hf.overrideCursor(e,t)}}(Gf||(Gf={})),function(e){function t(t,n=document){if(i&&t==i.event)return i.element;e.cursorBackdrop.style.zIndex="-1000";const s=n.elementFromPoint(t.clientX,t.clientY);return e.cursorBackdrop.style.zIndex="",i={event:t,element:s},s}e.SCROLL_EDGE_SIZE=20,e.validateAction=function(e,t){return n[e]&s[t]?e:"none"},e.findElementBehidBackdrop=t;let i=null;e.findScrollTarget=function(i){let n=i.clientX,s=i.clientY,r=t(i);for(;r;r=r.parentElement){if(!r.hasAttribute("data-lm-dragscroll"))continue;let t=0,i=0;r===document.body&&(t=window.pageXOffset,i=window.pageYOffset);let o=r.getBoundingClientRect(),a=o.top+i,l=o.left+t,h=l+o.width,c=a+o.height;if(n=h||s=c)continue;let d,u=n-l+1,p=s-a+1,f=h-n,m=c-s,g=Math.min(u,p,f,m);if(g>e.SCROLL_EDGE_SIZE)continue;switch(g){case m:d="bottom";break;case p:d="top";break;case f:d="right";break;case u:d="left";break;default:throw"unreachable"}let v,O=r.scrollWidth-r.clientWidth,b=r.scrollHeight-r.clientHeight;switch(d){case"top":v=b>0&&r.scrollTop>0;break;case"left":v=O>0&&r.scrollLeft>0;break;case"right":v=O>0&&r.scrollLeft0&&r.scrollTop{n===o&&e.cursorBackdrop.isConnected&&(document.removeEventListener("pointermove",r,!0),s.removeChild(e.cursorBackdrop))}))};let o=0;e.cursorBackdrop=function(){const e=document.createElement("div");return e.classList.add("lm-cursor-backdrop"),e}()}(Hf||(Hf={}));class Kf{constructor(e,t,i=[]){this.name=e,this._codes=t,this._keys=Kf.extractKeys(t),this._modifierKeys=Kf.convertToKeySet(i)}keys(){return Object.keys(this._keys)}isValidKey(e){return e in this._keys}isModifierKey(e){return e in this._modifierKeys}keyForKeydownEvent(e){return this._codes[e.keyCode]||""}}!function(e){e.extractKeys=function(e){let t=Object.create(null);for(let i in e)t[e[i]]=!0;return t},e.convertToKeySet=function(e){let t=Object(null);for(let i=0,n=e.length;i{this._commands.delete(e),this._commandChanged.emit({id:e,type:"removed"})}))}notifyCommandChanged(e){if(void 0!==e&&!this._commands.has(e))throw new Error(`Command '${e}' is not registered.`);this._commandChanged.emit({id:e,type:e?"changed":"many-changed"})}describedBy(e,t=Wf.JSONExt.emptyObject){var i;let n=this._commands.get(e);return Promise.resolve(null!==(i=null==n?void 0:n.describedBy.call(void 0,t))&&void 0!==i?i:{args:null})}label(e,t=Wf.JSONExt.emptyObject){var i;let n=this._commands.get(e);return null!==(i=null==n?void 0:n.label.call(void 0,t))&&void 0!==i?i:""}mnemonic(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.mnemonic.call(void 0,t):-1}icon(e,t=Wf.JSONExt.emptyObject){var i;return null===(i=this._commands.get(e))||void 0===i?void 0:i.icon.call(void 0,t)}iconClass(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.iconClass.call(void 0,t):""}iconLabel(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.iconLabel.call(void 0,t):""}caption(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.caption.call(void 0,t):""}usage(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.usage.call(void 0,t):""}className(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.className.call(void 0,t):""}dataset(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.dataset.call(void 0,t):{}}isEnabled(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return!!i&&i.isEnabled.call(void 0,t)}isToggled(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return!!i&&i.isToggled.call(void 0,t)}isToggleable(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return!!i&&i.isToggleable}isVisible(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return!!i&&i.isVisible.call(void 0,t)}execute(e,t=Wf.JSONExt.emptyObject){let i,n=this._commands.get(e);if(!n)return Promise.reject(new Error(`Command '${e}' not registered.`));try{i=n.execute.call(void 0,t)}catch(e){i=Promise.reject(e)}let s=Promise.resolve(i);return this._commandExecuted.emit({id:e,args:t,result:s}),s}addKeyBinding(e){let t=tm.createKeyBinding(e);return this._keyBindings.push(t),this._keyBindingChanged.emit({binding:t,type:"added"}),new Yf.DisposableDelegate((()=>{jf.RO.removeFirstOf(this._keyBindings,t),this._keyBindingChanged.emit({binding:t,type:"removed"})}))}processKeydownEvent(e){if(this._replaying||lm.isModifierKeyPressed(e))return;let t=lm.keystrokeForKeydownEvent(e);if(!t)return this._replayKeydownEvents(),void this._clearPendingState();this._keystrokes.push(t);let{exact:i,partial:n}=tm.matchKeyBinding(this._keyBindings,this._keystrokes,e);return i||n?(e.preventDefault(),e.stopPropagation(),i&&!n?(this._executeKeyBinding(i),void this._clearPendingState()):(i&&(this._exactKeyMatch=i),this._keydownEvents.push(e),void this._startTimer())):(this._replayKeydownEvents(),void this._clearPendingState())}_startTimer(){this._clearTimer(),this._timerID=window.setTimeout((()=>{this._onPendingTimeout()}),tm.CHORD_TIMEOUT)}_clearTimer(){0!==this._timerID&&(clearTimeout(this._timerID),this._timerID=0)}_replayKeydownEvents(){0!==this._keydownEvents.length&&(this._replaying=!0,this._keydownEvents.forEach(tm.replayKeyEvent),this._replaying=!1)}_executeKeyBinding(e){let{command:t,args:i}=e;if(this.hasCommand(t)&&this.isEnabled(t,i))this.execute(t,i);else{let i=this.hasCommand(t)?"enabled":"registered",n=`Cannot execute key binding '${e.keys.join(", ")}':`,s=`command '${t}' is not ${i}.`;console.warn(`${n} ${s}`)}}_clearPendingState(){this._clearTimer(),this._exactKeyMatch=null,this._keystrokes.length=0,this._keydownEvents.length=0}_onPendingTimeout(){this._timerID=0,this._exactKeyMatch?this._executeKeyBinding(this._exactKeyMatch):this._replayKeydownEvents(),this._clearPendingState()}}!function(e){function t(e){let t="",i=!1,n=!1,s=!1,r=!1;for(let o of e.split(/\s+/))"Accel"===o?Rf.IS_MAC?n=!0:s=!0:"Alt"===o?i=!0:"Cmd"===o?n=!0:"Ctrl"===o?s=!0:"Shift"===o?r=!0:o.length>0&&(t=o);return{cmd:n,ctrl:s,alt:i,shift:r,key:t}}function i(e){let i="",n=t(e);return n.ctrl&&(i+="Ctrl "),n.alt&&(i+="Alt "),n.shift&&(i+="Shift "),n.cmd&&Rf.IS_MAC&&(i+="Cmd "),i+n.key}e.parseKeystroke=t,e.normalizeKeystroke=i,e.normalizeKeys=function(e){let t;return t=Rf.IS_WIN?e.winKeys||e.keys:Rf.IS_MAC?e.macKeys||e.keys:e.linuxKeys||e.keys,t.map(i)},e.formatKeystroke=function(e){return"string"==typeof e?i(e):e.map(i).join(", ");function i(e){let i=[],n=Rf.IS_MAC?" ":"+",s=t(e);return s.ctrl&&i.push("Ctrl"),s.alt&&i.push("Alt"),s.shift&&i.push("Shift"),Rf.IS_MAC&&s.cmd&&i.push("Cmd"),i.push(s.key),i.map(tm.formatKey).join(n)}},e.isModifierKeyPressed=function(e){let t=Zf(),i=t.keyForKeydownEvent(e);return t.isModifierKey(i)},e.keystrokeForKeydownEvent=function(e){let t=Zf(),i=t.keyForKeydownEvent(e);if(!i||t.isModifierKey(i))return"";let n=[];return e.ctrlKey&&n.push("Ctrl"),e.altKey&&n.push("Alt"),e.shiftKey&&n.push("Shift"),e.metaKey&&Rf.IS_MAC&&n.push("Cmd"),n.push(i),n.join(" ")}}(lm||(lm={})),function(e){e.CHORD_TIMEOUT=1e3,e.createCommand=function(e){return{execute:e.execute,describedBy:h("function"==typeof e.describedBy?e.describedBy:{args:null,...e.describedBy},(()=>({args:null}))),label:h(e.label,n),mnemonic:h(e.mnemonic,s),icon:h(e.icon,l),iconClass:h(e.iconClass,n),iconLabel:h(e.iconLabel,n),caption:h(e.caption,n),usage:h(e.usage,n),className:h(e.className,n),dataset:h(e.dataset,a),isEnabled:e.isEnabled||r,isToggled:e.isToggled||o,isToggleable:e.isToggleable||!!e.isToggled,isVisible:e.isVisible||r}},e.createKeyBinding=function(e){return{keys:lm.normalizeKeys(e),selector:c(e),command:e.command,args:e.args||Wf.JSONExt.emptyObject}},e.matchKeyBinding=function(e,t,i){let n=null,s=!1,r=1/0,o=0;for(let a=0,l=e.length;ar)continue;let p=Df.calculateSpecificity(l.selector);(!n||c=o)&&(n=l,r=c,o=p)}return{exact:n,partial:s}},e.replayKeyEvent=function(e){e.target.dispatchEvent(function(e){let t=document.createEvent("Event"),i=e.bubbles||!0,n=e.cancelable||!0;return t.initEvent(e.type||"keydown",i,n),t.key=e.key||"",t.keyCode=e.keyCode||0,t.which=e.keyCode||0,t.ctrlKey=e.ctrlKey||!1,t.altKey=e.altKey||!1,t.shiftKey=e.shiftKey||!1,t.metaKey=e.metaKey||!1,t.view=e.view||window,t}(e))},e.formatKey=function(e){return Rf.IS_MAC?t.hasOwnProperty(e)?t[e]:e:i.hasOwnProperty(e)?i[e]:e};const t={Backspace:"⌫",Tab:"⇥",Enter:"⏎",Shift:"⇧",Ctrl:"⌃",Alt:"⌥",Escape:"⎋",PageUp:"⇞",PageDown:"⇟",End:"↘",Home:"↖",ArrowLeft:"←",ArrowUp:"↑",ArrowRight:"→",ArrowDown:"↓",Delete:"⌦",Cmd:"⌘"},i={Escape:"Esc",PageUp:"Page Up",PageDown:"Page Down",ArrowLeft:"Left",ArrowUp:"Up",ArrowRight:"Right",ArrowDown:"Down",Delete:"Del"},n=()=>"",s=()=>-1,r=()=>!0,o=()=>!1,a=()=>({}),l=()=>{};function h(e,t){return void 0===e?t:"function"==typeof e?e:()=>e}function c(e){if(-1!==e.selector.indexOf(","))throw new Error(`Selector cannot contain commas: ${e.selector}`);if(!Df.isValid(e.selector))throw new Error(`Invalid selector: ${e.selector}`);return e.selector}function d(e,t){if(e.lengtht.length?2:1}function u(e,t){let i=t.target,n=t.currentTarget;for(let t=0;null!==i;i=i.parentElement,++t){if(i.hasAttribute("data-lm-suppress-shortcuts"))return-1;if(Df.matches(i,e))return t;if(i===n)return-1}return-1}}(tm||(tm={}));class hm{constructor(e){this.type="text",this.content=e}}class cm{constructor(e,t,i,n){this.type="element",this.tag=e,this.attrs=t,this.children=i,this.renderer=n}}function dm(e){let t,i={},n=[];for(let e=1,r=arguments.length;e=n;--r){const n=t[r],o=s?e.lastChild:e.childNodes[r];"text"===n.type||(n.renderer&&n.renderer.unrender?n.renderer.unrender(o,{attrs:n.attrs,children:n.children}):i(o,n.children,0,!1)),s&&e.removeChild(o)}}e.hostMap=new WeakMap,e.asContentArray=function(e){return e?e instanceof Array?e:[e]:[]},e.createDOMNode=t,e.updateContent=function e(n,r,o){if(r===o)return;let a=function(e,t){let i=e.firstChild,n=Object.create(null);for(let e of t)"element"===e.type&&e.attrs.key&&(n[e.attrs.key]={vNode:e,element:i}),i=i.nextSibling;return n}(n,r),l=r.slice(),h=n.firstChild,c=o.length;for(let i=0;i=l.length){t(o[i],n);continue}let r=l[i],c=o[i];if(r===c){h=h.nextSibling;continue}if("text"===r.type&&"text"===c.type){h.textContent!==c.content&&(h.textContent=c.content),h=h.nextSibling;continue}if("text"===r.type||"text"===c.type){jf.RO.insert(l,i,c),t(c,n,h);continue}if(!r.renderer!=!c.renderer){jf.RO.insert(l,i,c),t(c,n,h);continue}let d=c.attrs.key;if(d&&d in a){let e=a[d];e.vNode!==r&&(jf.RO.move(l,l.indexOf(e.vNode,i+1),i),n.insertBefore(e.element,h),r=e.vNode,h=e.element)}if(r===c){h=h.nextSibling;continue}let u=r.attrs.key;u&&u!==d?(jf.RO.insert(l,i,c),t(c,n,h)):r.tag===c.tag?(s(h,r.attrs,c.attrs),c.renderer?c.renderer.render(h,{attrs:c.attrs,children:c.children}):e(h,r.children,c.children),h=h.nextSibling):(jf.RO.insert(l,i,c),t(c,n,h))}i(n,l,c,!0)};const n={key:!0,className:!0,htmlFor:!0,dataset:!0,style:!0};function s(e,t,i){if(t===i)return;let s;for(s in t)s in n||s in i||("on"===s.substr(0,2)?e[s]=null:e.removeAttribute(s));for(s in i)s in n||t[s]===i[s]||("on"===s.substr(0,2)?e[s]=i[s]:e.setAttribute(s,i[s]));t.className!==i.className&&(void 0!==i.className?e.setAttribute("class",i.className):e.removeAttribute("class")),t.htmlFor!==i.htmlFor&&(void 0!==i.htmlFor?e.setAttribute("for",i.htmlFor):e.removeAttribute("for")),t.dataset!==i.dataset&&function(e,t,i){for(let n in t)n in i||e.removeAttribute(`data-${n}`);for(let n in i)t[n]!==i[n]&&e.setAttribute(`data-${n}`,i[n])}(e,t.dataset||{},i.dataset||{}),t.style!==i.style&&function(e,t,i){let n,s=e.style;for(n in t)n in i||(s[n]="");for(n in i)t[n]!==i[n]&&(s[n]=i[n])}(e,t.style||{},i.style||{})}}(nm||(nm={}));class um{constructor(){this.sizeHint=0,this.minSize=0,this.maxSize=1/0,this.stretch=1,this.size=0,this.done=!1}}!function(e){e.calc=function(e,t){let i=e.length;if(0===i)return t;let n=0,s=0,r=0,o=0,a=0;for(let t=0;t0&&(o+=i.stretch,a++)}if(t===r)return 0;if(t<=n){for(let t=0;t=s){for(let t=0;t0&&n>l;){let t=n,s=o;for(let r=0;r0&&n>l;){let t=n/h;for(let s=0;s0&&n>l;){let t=n,s=o;for(let r=0;r=i.maxSize?(n-=i.maxSize-i.size,o-=i.stretch,i.size=i.maxSize,i.done=!0,h--,a--):(n-=l,i.size+=l)}}for(;h>0&&n>l;){let t=n/h;for(let s=0;s=i.maxSize?(n-=i.maxSize-i.size,i.size=i.maxSize,i.done=!0,h--):(n-=t,i.size+=t))}}}return 0},e.adjust=function(e,t,i){0!==e.length&&0!==i&&(i>0?function(e,t,i){let n=0;for(let i=0;i<=t;++i){let t=e[i];n+=t.maxSize-t.size}let s=0;for(let i=t+1,n=e.length;i=0&&r>0;--i){let t=e[i],n=t.maxSize-t.size;n>=r?(t.sizeHint=t.size+r,r=0):(t.sizeHint=t.size+n,r-=n)}let o=i;for(let i=t+1,n=e.length;i0;++i){let t=e[i],n=t.size-t.minSize;n>=o?(t.sizeHint=t.size-o,o=0):(t.sizeHint=t.size-n,o-=n)}}(e,t,i):function(e,t,i){let n=0;for(let i=t+1,s=e.length;i0;++i){let t=e[i],n=t.maxSize-t.size;n>=r?(t.sizeHint=t.size+r,r=0):(t.sizeHint=t.size+n,r-=n)}let o=i;for(let i=t;i>=0&&o>0;--i){let t=e[i],n=t.size-t.minSize;n>=o?(t.sizeHint=t.size-o,o=0):(t.sizeHint=t.size-n,o-=n)}}(e,t,-i))}}(sm||(sm={}));class pm{constructor(e){this._label="",this._caption="",this._mnemonic=-1,this._icon=void 0,this._iconClass="",this._iconLabel="",this._className="",this._closable=!1,this._changed=new zf.Signal(this),this._isDisposed=!1,this.owner=e.owner,void 0!==e.label&&(this._label=e.label),void 0!==e.mnemonic&&(this._mnemonic=e.mnemonic),void 0!==e.icon&&(this._icon=e.icon),void 0!==e.iconClass&&(this._iconClass=e.iconClass),void 0!==e.iconLabel&&(this._iconLabel=e.iconLabel),void 0!==e.caption&&(this._caption=e.caption),void 0!==e.className&&(this._className=e.className),void 0!==e.closable&&(this._closable=e.closable),this._dataset=e.dataset||{}}get changed(){return this._changed}get label(){return this._label}set label(e){this._label!==e&&(this._label=e,this._changed.emit(void 0))}get mnemonic(){return this._mnemonic}set mnemonic(e){this._mnemonic!==e&&(this._mnemonic=e,this._changed.emit(void 0))}get icon(){return this._icon}set icon(e){this._icon!==e&&(this._icon=e,this._changed.emit(void 0))}get iconClass(){return this._iconClass}set iconClass(e){this._iconClass!==e&&(this._iconClass=e,this._changed.emit(void 0))}get iconLabel(){return this._iconLabel}set iconLabel(e){this._iconLabel!==e&&(this._iconLabel=e,this._changed.emit(void 0))}get caption(){return this._caption}set caption(e){this._caption!==e&&(this._caption=e,this._changed.emit(void 0))}get className(){return this._className}set className(e){this._className!==e&&(this._className=e,this._changed.emit(void 0))}get closable(){return this._closable}set closable(e){this._closable!==e&&(this._closable=e,this._changed.emit(void 0))}get dataset(){return this._dataset}set dataset(e){this._dataset!==e&&(this._dataset=e,this._changed.emit(void 0))}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,zf.Signal.clearData(this))}}class fm{constructor(e={}){this._flags=0,this._layout=null,this._parent=null,this._disposed=new zf.Signal(this),this._hiddenMode=fm.HiddenMode.Display,this.node=rm.createNode(e),this.addClass("lm-Widget")}dispose(){this.isDisposed||(this.setFlag(fm.Flag.IsDisposed),this._disposed.emit(void 0),this.parent?this.parent=null:this.isAttached&&fm.detach(this),this._layout&&(this._layout.dispose(),this._layout=null),this.title.dispose(),zf.Signal.clearData(this),Lf.clearData(this),Xf.AttachedProperty.clearData(this))}get disposed(){return this._disposed}get isDisposed(){return this.testFlag(fm.Flag.IsDisposed)}get isAttached(){return this.testFlag(fm.Flag.IsAttached)}get isHidden(){return this.testFlag(fm.Flag.IsHidden)}get isVisible(){return this.testFlag(fm.Flag.IsVisible)}get title(){return rm.titleProperty.get(this)}get id(){return this.node.id}set id(e){this.node.id=e}get dataset(){return this.node.dataset}get hiddenMode(){return this._hiddenMode}set hiddenMode(e){this._hiddenMode!==e&&(this.isHidden&&this._toggleHidden(!1),e==fm.HiddenMode.Scale?this.node.style.willChange="transform":this.node.style.willChange="auto",this._hiddenMode=e,this.isHidden&&this._toggleHidden(!0))}get parent(){return this._parent}set parent(e){if(this._parent!==e){if(e&&this.contains(e))throw new Error("Invalid parent widget.");if(this._parent&&!this._parent.isDisposed){let e=new fm.ChildMessage("child-removed",this);Lf.sendMessage(this._parent,e)}if(this._parent=e,this._parent&&!this._parent.isDisposed){let e=new fm.ChildMessage("child-added",this);Lf.sendMessage(this._parent,e)}this.isDisposed||Lf.sendMessage(this,fm.Msg.ParentChanged)}}get layout(){return this._layout}set layout(e){if(this._layout!==e){if(this.testFlag(fm.Flag.DisallowLayout))throw new Error("Cannot set widget layout.");if(this._layout)throw new Error("Cannot change widget layout.");if(e.parent)throw new Error("Cannot change layout parent.");this._layout=e,e.parent=this}}*children(){this._layout&&(yield*this._layout)}contains(e){for(let t=e;t;t=t._parent)if(t===this)return!0;return!1}hasClass(e){return this.node.classList.contains(e)}addClass(e){this.node.classList.add(e)}removeClass(e){this.node.classList.remove(e)}toggleClass(e,t){return!0===t?(this.node.classList.add(e),!0):!1===t?(this.node.classList.remove(e),!1):this.node.classList.toggle(e)}update(){Lf.postMessage(this,fm.Msg.UpdateRequest)}fit(){Lf.postMessage(this,fm.Msg.FitRequest)}activate(){Lf.postMessage(this,fm.Msg.ActivateRequest)}close(){Lf.sendMessage(this,fm.Msg.CloseRequest)}show(){if(this.testFlag(fm.Flag.IsHidden)&&(!this.isAttached||this.parent&&!this.parent.isVisible||Lf.sendMessage(this,fm.Msg.BeforeShow),this.clearFlag(fm.Flag.IsHidden),this._toggleHidden(!1),!this.isAttached||this.parent&&!this.parent.isVisible||Lf.sendMessage(this,fm.Msg.AfterShow),this.parent)){let e=new fm.ChildMessage("child-shown",this);Lf.sendMessage(this.parent,e)}}hide(){if(!this.testFlag(fm.Flag.IsHidden)&&(!this.isAttached||this.parent&&!this.parent.isVisible||Lf.sendMessage(this,fm.Msg.BeforeHide),this.setFlag(fm.Flag.IsHidden),this._toggleHidden(!0),!this.isAttached||this.parent&&!this.parent.isVisible||Lf.sendMessage(this,fm.Msg.AfterHide),this.parent)){let e=new fm.ChildMessage("child-hidden",this);Lf.sendMessage(this.parent,e)}}setHidden(e){e?this.hide():this.show()}testFlag(e){return 0!=(this._flags&e)}setFlag(e){this._flags|=e}clearFlag(e){this._flags&=~e}processMessage(e){switch(e.type){case"resize":this.notifyLayout(e),this.onResize(e);break;case"update-request":this.notifyLayout(e),this.onUpdateRequest(e);break;case"fit-request":this.notifyLayout(e),this.onFitRequest(e);break;case"before-show":this.notifyLayout(e),this.onBeforeShow(e);break;case"after-show":this.setFlag(fm.Flag.IsVisible),this.notifyLayout(e),this.onAfterShow(e);break;case"before-hide":this.notifyLayout(e),this.onBeforeHide(e);break;case"after-hide":this.clearFlag(fm.Flag.IsVisible),this.notifyLayout(e),this.onAfterHide(e);break;case"before-attach":this.notifyLayout(e),this.onBeforeAttach(e);break;case"after-attach":this.isHidden||this.parent&&!this.parent.isVisible||this.setFlag(fm.Flag.IsVisible),this.setFlag(fm.Flag.IsAttached),this.notifyLayout(e),this.onAfterAttach(e);break;case"before-detach":this.notifyLayout(e),this.onBeforeDetach(e);break;case"after-detach":this.clearFlag(fm.Flag.IsVisible),this.clearFlag(fm.Flag.IsAttached),this.notifyLayout(e),this.onAfterDetach(e);break;case"activate-request":this.notifyLayout(e),this.onActivateRequest(e);break;case"close-request":this.notifyLayout(e),this.onCloseRequest(e);break;case"child-added":this.notifyLayout(e),this.onChildAdded(e);break;case"child-removed":this.notifyLayout(e),this.onChildRemoved(e);break;default:this.notifyLayout(e)}}notifyLayout(e){this._layout&&this._layout.processParentMessage(e)}onCloseRequest(e){this.parent?this.parent=null:this.isAttached&&fm.detach(this)}onResize(e){}onUpdateRequest(e){}onFitRequest(e){}onActivateRequest(e){}onBeforeShow(e){}onAfterShow(e){}onBeforeHide(e){}onAfterHide(e){}onBeforeAttach(e){}onAfterAttach(e){}onBeforeDetach(e){}onAfterDetach(e){}onChildAdded(e){}onChildRemoved(e){}_toggleHidden(e){if(e)switch(this._hiddenMode){case fm.HiddenMode.Display:this.addClass("lm-mod-hidden");break;case fm.HiddenMode.Scale:this.node.style.transform="scale(0)",this.node.setAttribute("aria-hidden","true");break;case fm.HiddenMode.ContentVisibility:this.node.style.contentVisibility="hidden",this.node.style.zIndex="-1"}else switch(this._hiddenMode){case fm.HiddenMode.Display:this.removeClass("lm-mod-hidden");break;case fm.HiddenMode.Scale:this.node.style.transform="",this.node.removeAttribute("aria-hidden");break;case fm.HiddenMode.ContentVisibility:this.node.style.contentVisibility="",this.node.style.zIndex=""}}}!function(e){var t,i,n;(t=e.HiddenMode||(e.HiddenMode={}))[t.Display=0]="Display",t[t.Scale=1]="Scale",t[t.ContentVisibility=2]="ContentVisibility",(i=e.Flag||(e.Flag={}))[i.IsDisposed=1]="IsDisposed",i[i.IsAttached=2]="IsAttached",i[i.IsHidden=4]="IsHidden",i[i.IsVisible=8]="IsVisible",i[i.DisallowLayout=16]="DisallowLayout",(n=e.Msg||(e.Msg={})).BeforeShow=new Uf("before-show"),n.AfterShow=new Uf("after-show"),n.BeforeHide=new Uf("before-hide"),n.AfterHide=new Uf("after-hide"),n.BeforeAttach=new Uf("before-attach"),n.AfterAttach=new Uf("after-attach"),n.BeforeDetach=new Uf("before-detach"),n.AfterDetach=new Uf("after-detach"),n.ParentChanged=new Uf("parent-changed"),n.UpdateRequest=new Ff("update-request"),n.FitRequest=new Ff("fit-request"),n.ActivateRequest=new Ff("activate-request"),n.CloseRequest=new Ff("close-request"),e.ChildMessage=class extends Uf{constructor(e,t){super(e),this.child=t}};class s extends Uf{constructor(e,t){super("resize"),this.width=e,this.height=t}}e.ResizeMessage=s,function(e){e.UnknownSize=new e(-1,-1)}(s=e.ResizeMessage||(e.ResizeMessage={})),e.attach=function(t,i,n=null){if(t.parent)throw new Error("Cannot attach a child widget.");if(t.isAttached||t.node.isConnected)throw new Error("Widget is already attached.");if(!i.isConnected)throw new Error("Host is not attached.");Lf.sendMessage(t,e.Msg.BeforeAttach),i.insertBefore(t.node,n),Lf.sendMessage(t,e.Msg.AfterAttach)},e.detach=function(t){if(t.parent)throw new Error("Cannot detach a child widget.");if(!t.isAttached||!t.node.isConnected)throw new Error("Widget is not attached.");Lf.sendMessage(t,e.Msg.BeforeDetach),t.node.parentNode.removeChild(t.node),Lf.sendMessage(t,e.Msg.AfterDetach)}}(fm||(fm={})),function(e){e.titleProperty=new Xf.AttachedProperty({name:"title",create:e=>new pm({owner:e})}),e.createNode=function(e){return e.node||document.createElement(e.tag||"div")}}(rm||(rm={}));class mm{constructor(e={}){this._disposed=!1,this._parent=null,this._fitPolicy=e.fitPolicy||"set-min-size"}dispose(){this._parent=null,this._disposed=!0,zf.Signal.clearData(this),Xf.AttachedProperty.clearData(this)}get isDisposed(){return this._disposed}get parent(){return this._parent}set parent(e){if(this._parent!==e){if(this._parent)throw new Error("Cannot change parent widget.");if(e.layout!==this)throw new Error("Invalid parent widget.");this._parent=e,this.init()}}get fitPolicy(){return this._fitPolicy}set fitPolicy(e){if(this._fitPolicy!==e&&(this._fitPolicy=e,this._parent)){let e=this._parent.node.style;e.minWidth="",e.minHeight="",e.maxWidth="",e.maxHeight="",this._parent.fit()}}processParentMessage(e){switch(e.type){case"resize":this.onResize(e);break;case"update-request":this.onUpdateRequest(e);break;case"fit-request":this.onFitRequest(e);break;case"before-show":this.onBeforeShow(e);break;case"after-show":this.onAfterShow(e);break;case"before-hide":this.onBeforeHide(e);break;case"after-hide":this.onAfterHide(e);break;case"before-attach":this.onBeforeAttach(e);break;case"after-attach":this.onAfterAttach(e);break;case"before-detach":this.onBeforeDetach(e);break;case"after-detach":this.onAfterDetach(e);break;case"child-removed":this.onChildRemoved(e);break;case"child-shown":this.onChildShown(e);break;case"child-hidden":this.onChildHidden(e)}}init(){for(const e of this)e.parent=this.parent}onResize(e){for(const e of this)Lf.sendMessage(e,fm.ResizeMessage.UnknownSize)}onUpdateRequest(e){for(const e of this)Lf.sendMessage(e,fm.ResizeMessage.UnknownSize)}onBeforeAttach(e){for(const t of this)Lf.sendMessage(t,e)}onAfterAttach(e){for(const t of this)Lf.sendMessage(t,e)}onBeforeDetach(e){for(const t of this)Lf.sendMessage(t,e)}onAfterDetach(e){for(const t of this)Lf.sendMessage(t,e)}onBeforeShow(e){for(const t of this)t.isHidden||Lf.sendMessage(t,e)}onAfterShow(e){for(const t of this)t.isHidden||Lf.sendMessage(t,e)}onBeforeHide(e){for(const t of this)t.isHidden||Lf.sendMessage(t,e)}onAfterHide(e){for(const t of this)t.isHidden||Lf.sendMessage(t,e)}onChildRemoved(e){this.removeWidget(e.child)}onFitRequest(e){}onChildShown(e){}onChildHidden(e){}}!function(e){e.getHorizontalAlignment=function(e){return om.horizontalAlignmentProperty.get(e)},e.setHorizontalAlignment=function(e,t){om.horizontalAlignmentProperty.set(e,t)},e.getVerticalAlignment=function(e){return om.verticalAlignmentProperty.get(e)},e.setVerticalAlignment=function(e,t){om.verticalAlignmentProperty.set(e,t)}}(mm||(mm={}));class gm{constructor(e){this._top=NaN,this._left=NaN,this._width=NaN,this._height=NaN,this._minWidth=0,this._minHeight=0,this._maxWidth=1/0,this._maxHeight=1/0,this._disposed=!1,this.widget=e,this.widget.node.style.position="absolute",this.widget.node.style.contain="strict"}dispose(){if(this._disposed)return;this._disposed=!0;let e=this.widget.node.style;e.position="",e.top="",e.left="",e.width="",e.height="",e.contain=""}get minWidth(){return this._minWidth}get minHeight(){return this._minHeight}get maxWidth(){return this._maxWidth}get maxHeight(){return this._maxHeight}get isDisposed(){return this._disposed}get isHidden(){return this.widget.isHidden}get isVisible(){return this.widget.isVisible}get isAttached(){return this.widget.isAttached}fit(){let e=Af.sizeLimits(this.widget.node);this._minWidth=e.minWidth,this._minHeight=e.minHeight,this._maxWidth=e.maxWidth,this._maxHeight=e.maxHeight}update(e,t,i,n){let s=Math.max(this._minWidth,Math.min(i,this._maxWidth)),r=Math.max(this._minHeight,Math.min(n,this._maxHeight));if(s"center",changed:t}),e.verticalAlignmentProperty=new Xf.AttachedProperty({name:"verticalAlignment",create:()=>"top",changed:t})}(om||(om={}));class vm extends mm{constructor(){super(...arguments),this._widgets=[]}dispose(){for(;this._widgets.length>0;)this._widgets.pop().dispose();super.dispose()}get widgets(){return this._widgets}*[Symbol.iterator](){yield*this._widgets}addWidget(e){this.insertWidget(this._widgets.length,e)}insertWidget(e,t){t.parent=this.parent;let i=this._widgets.indexOf(t),n=Math.max(0,Math.min(e,this._widgets.length));if(-1===i)return jf.RO.insert(this._widgets,n,t),void(this.parent&&this.attachWidget(n,t));n===this._widgets.length&&n--,i!==n&&(jf.RO.move(this._widgets,i,n),this.parent&&this.moveWidget(i,n,t))}removeWidget(e){this.removeWidgetAt(this._widgets.indexOf(e))}removeWidgetAt(e){let t=jf.RO.removeAt(this._widgets,e);t&&this.parent&&this.detachWidget(e,t)}init(){super.init();let e=0;for(const t of this)this.attachWidget(e++,t)}attachWidget(e,t){let i=this.parent.node.children[e];this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeAttach),this.parent.node.insertBefore(t.node,i),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterAttach)}moveWidget(e,t,i){this.parent.isAttached&&Lf.sendMessage(i,fm.Msg.BeforeDetach),this.parent.node.removeChild(i.node),this.parent.isAttached&&Lf.sendMessage(i,fm.Msg.AfterDetach);let n=this.parent.node.children[t];this.parent.isAttached&&Lf.sendMessage(i,fm.Msg.BeforeAttach),this.parent.node.insertBefore(i.node,n),this.parent.isAttached&&Lf.sendMessage(i,fm.Msg.AfterAttach)}detachWidget(e,t){this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeDetach),this.parent.node.removeChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterDetach)}}!function(e){e.clampDimension=function(e){return Math.max(0,Math.floor(e))}}(am||(am={}));var Om,bm,_m,ym,wm,xm,Sm,km,Tm,Cm,Pm=am;class Mm extends vm{constructor(e){super(),this.widgetOffset=0,this._fixed=0,this._spacing=4,this._dirty=!1,this._hasNormedSizes=!1,this._sizers=[],this._items=[],this._handles=[],this._box=null,this._alignment="start",this._orientation="horizontal",this.renderer=e.renderer,void 0!==e.orientation&&(this._orientation=e.orientation),void 0!==e.alignment&&(this._alignment=e.alignment),void 0!==e.spacing&&(this._spacing=am.clampDimension(e.spacing))}dispose(){for(const e of this._items)e.dispose();this._box=null,this._items.length=0,this._sizers.length=0,this._handles.length=0,super.dispose()}get orientation(){return this._orientation}set orientation(e){this._orientation!==e&&(this._orientation=e,this.parent&&(this.parent.dataset.orientation=e,this.parent.fit()))}get alignment(){return this._alignment}set alignment(e){this._alignment!==e&&(this._alignment=e,this.parent&&(this.parent.dataset.alignment=e,this.parent.update()))}get spacing(){return this._spacing}set spacing(e){e=am.clampDimension(e),this._spacing!==e&&(this._spacing=e,this.parent&&this.parent.fit())}get handles(){return this._handles}absoluteSizes(){return this._sizers.map((e=>e.size))}relativeSizes(){return Om.normalize(this._sizers.map((e=>e.size)))}setRelativeSizes(e,t=!0){let i=this._sizers.length,n=e.slice(0,i);for(;n.length0&&(e.sizeHint=e.size);sm.adjust(this._sizers,e,i),this.parent&&this.parent.update()}}init(){this.parent.dataset.orientation=this.orientation,this.parent.dataset.alignment=this.alignment,super.init()}attachWidget(e,t){let i=new gm(t),n=Om.createHandle(this.renderer),s=Om.averageSize(this._sizers),r=Om.createSizer(s);jf.RO.insert(this._items,e,i),jf.RO.insert(this._sizers,e,r),jf.RO.insert(this._handles,e,n),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeAttach),this.parent.node.appendChild(t.node),this.parent.node.appendChild(n),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterAttach),this.parent.fit()}moveWidget(e,t,i){jf.RO.move(this._items,e,t),jf.RO.move(this._sizers,e,t),jf.RO.move(this._handles,e,t),this.parent.fit()}detachWidget(e,t){let i=jf.RO.removeAt(this._items,e),n=jf.RO.removeAt(this._handles,e);jf.RO.removeAt(this._sizers,e),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeDetach),this.parent.node.removeChild(t.node),this.parent.node.removeChild(n),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterDetach),i.dispose(),this.parent.fit()}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}updateItemPosition(e,t,i,n,s,r,o){const a=this._items[e];if(a.isHidden)return;let l=this._handles[e].style;t?(i+=this.widgetOffset,a.update(i,n,o,s),i+=o,l.top=`${n}px`,l.left=`${i}px`,l.width=`${this._spacing}px`,l.height=`${s}px`):(n+=this.widgetOffset,a.update(i,n,r,o),n+=o,l.top=`${n}px`,l.left=`${i}px`,l.width=`${r}px`,l.height=`${this._spacing}px`)}_fit(){let e=0,t=-1;for(let i=0,n=this._items.length;i0&&(r.sizeHint=r.size),t.isHidden?(r.minSize=0,r.maxSize=0):(t.fit(),r.stretch=Mm.getStretch(t.widget),i?(r.minSize=t.minWidth,r.maxSize=t.maxWidth,n+=t.minWidth,s=Math.max(s,t.minHeight)):(r.minSize=t.minHeight,r.maxSize=t.maxHeight,s+=t.minHeight,n=Math.max(n,t.minWidth)))}let r=this._box=Af.boxSizing(this.parent.node);n+=r.horizontalSum,s+=r.verticalSum;let o=this.parent.node.style;o.minWidth=`${n}px`,o.minHeight=`${s}px`,this._dirty=!0,this.parent.parent&&Lf.sendMessage(this.parent.parent,fm.Msg.FitRequest),this._dirty&&Lf.sendMessage(this.parent,fm.Msg.UpdateRequest)}_update(e,t){this._dirty=!1;let i=0;for(let e=0,t=this._items.length;e0){let e;if(e=h?Math.max(0,r-this._fixed):Math.max(0,o-this._fixed),this._hasNormedSizes){for(let t of this._sizers)t.sizeHint*=e;this._hasNormedSizes=!1}let t=sm.calc(this._sizers,e);if(t>0)switch(this._alignment){case"start":break;case"center":a=0,l=t/2;break;case"end":a=0,l=t;break;case"justify":a=t/i,l=0;break;default:throw"unreachable"}}for(let e=0,t=this._items.length;e0,coerce:(e,t)=>Math.max(0,Math.floor(t)),changed:function(e){e.parent&&e.parent.layout instanceof Mm&&e.parent.fit()}}),e.createSizer=function(e){let t=new um;return t.sizeHint=Math.floor(e),t},e.createHandle=function(e){let t=e.createHandle();return t.style.position="absolute",t.style.contain="style",t},e.averageSize=function(e){return e.reduce(((e,t)=>e+t.size),0)/e.length||0},e.normalize=function(e){let t=e.length;if(0===t)return[];let i=e.reduce(((e,t)=>e+Math.abs(t)),0);return 0===i?e.map((e=>1/t)):e.map((e=>e/i))}}(Om||(Om={}));class Em extends Mm{constructor(e){super({...e,orientation:e.orientation||"vertical"}),this._titles=[],this.titleSpace=e.titleSpace||22}get titleSpace(){return this.widgetOffset}set titleSpace(e){e=Pm.clampDimension(e),this.widgetOffset!==e&&(this.widgetOffset=e,this.parent&&this.parent.fit())}get titles(){return this._titles}dispose(){this.isDisposed||(this._titles.length=0,super.dispose())}updateTitle(e,t){const i=this._titles[e],n=i.classList.contains("lm-mod-expanded"),s=bm.createTitle(this.renderer,t.title,n);this._titles[e]=s,this.parent.node.replaceChild(s,i)}insertWidget(e,t){t.id||(t.id=`id-${Wf.UUID.uuid4()}`),super.insertWidget(e,t)}attachWidget(e,t){const i=bm.createTitle(this.renderer,t.title);jf.RO.insert(this._titles,e,i),this.parent.node.appendChild(i),t.node.setAttribute("role","region"),t.node.setAttribute("aria-labelledby",i.id),super.attachWidget(e,t)}moveWidget(e,t,i){jf.RO.move(this._titles,e,t),super.moveWidget(e,t,i)}detachWidget(e,t){const i=jf.RO.removeAt(this._titles,e);this.parent.node.removeChild(i),super.detachWidget(e,t)}updateItemPosition(e,t,i,n,s,r,o){const a=this._titles[e].style;a.top=`${n}px`,a.left=`${i}px`,a.height=`${this.widgetOffset}px`,a.width=t?`${s}px`:`${r}px`,super.updateItemPosition(e,t,i,n,s,r,o)}}!function(e){e.createTitle=function(e,t,i=!0){const n=e.createSectionTitle(t);return n.style.position="absolute",n.style.contain="strict",n.setAttribute("aria-label",`${t.label} Section`),n.setAttribute("aria-expanded",i?"true":"false"),n.setAttribute("aria-controls",t.owner.id),i&&n.classList.add("lm-mod-expanded"),n}}(bm||(bm={}));class Am extends fm{constructor(e={}){super(),this.addClass("lm-Panel"),this.layout=_m.createLayout(e)}get widgets(){return this.layout.widgets}addWidget(e){this.layout.addWidget(e)}insertWidget(e,t){this.layout.insertWidget(e,t)}}!function(e){e.createLayout=function(e){return e.layout||new vm}}(_m||(_m={}));class Rm extends Am{constructor(e={}){super({layout:ym.createLayout(e)}),this._handleMoved=new zf.Signal(this),this._pressData=null,this.addClass("lm-SplitPanel")}dispose(){this._releaseMouse(),super.dispose()}get orientation(){return this.layout.orientation}set orientation(e){this.layout.orientation=e}get alignment(){return this.layout.alignment}set alignment(e){this.layout.alignment=e}get spacing(){return this.layout.spacing}set spacing(e){this.layout.spacing=e}get renderer(){return this.layout.renderer}get handleMoved(){return this._handleMoved}get handles(){return this.layout.handles}relativeSizes(){return this.layout.relativeSizes()}setRelativeSizes(e,t=!0){this.layout.setRelativeSizes(e,t)}handleEvent(e){switch(e.type){case"pointerdown":this._evtPointerDown(e);break;case"pointermove":this._evtPointerMove(e);break;case"pointerup":this._evtPointerUp(e);break;case"keydown":this._evtKeyDown(e);break;case"contextmenu":e.preventDefault(),e.stopPropagation()}}onBeforeAttach(e){this.node.addEventListener("pointerdown",this)}onAfterDetach(e){this.node.removeEventListener("pointerdown",this),this._releaseMouse()}onChildAdded(e){e.child.addClass("lm-SplitPanel-child"),this._releaseMouse()}onChildRemoved(e){e.child.removeClass("lm-SplitPanel-child"),this._releaseMouse()}_evtKeyDown(e){this._pressData&&(e.preventDefault(),e.stopPropagation()),27===e.keyCode&&this._releaseMouse()}_evtPointerDown(e){if(0!==e.button)return;let t,i=this.layout,n=jf.RO.findFirstIndex(i.handles,(t=>t.contains(e.target)));if(-1===n)return;e.preventDefault(),e.stopPropagation(),document.addEventListener("pointerup",this,!0),document.addEventListener("pointermove",this,!0),document.addEventListener("keydown",this,!0),document.addEventListener("contextmenu",this,!0);let s=i.handles[n],r=s.getBoundingClientRect();t="horizontal"===i.orientation?e.clientX-r.left:e.clientY-r.top;let o=window.getComputedStyle(s),a=Gf.overrideCursor(o.cursor);this._pressData={index:n,delta:t,override:a}}_evtPointerMove(e){let t;e.preventDefault(),e.stopPropagation();let i=this.layout,n=this.node.getBoundingClientRect();t="horizontal"===i.orientation?e.clientX-n.left-this._pressData.delta:e.clientY-n.top-this._pressData.delta,i.moveHandle(this._pressData.index,t)}_evtPointerUp(e){0===e.button&&(e.preventDefault(),e.stopPropagation(),this._releaseMouse())}_releaseMouse(){this._pressData&&(this._pressData.override.dispose(),this._pressData=null,this._handleMoved.emit(),document.removeEventListener("keydown",this,!0),document.removeEventListener("pointerup",this,!0),document.removeEventListener("pointermove",this,!0),document.removeEventListener("contextmenu",this,!0))}}!function(e){class t{createHandle(){let e=document.createElement("div");return e.className="lm-SplitPanel-handle",e}}e.Renderer=t,e.defaultRenderer=new t,e.getStretch=function(e){return Mm.getStretch(e)},e.setStretch=function(e,t){Mm.setStretch(e,t)}}(Rm||(Rm={})),function(e){e.createLayout=function(e){return e.layout||new Mm({renderer:e.renderer||Rm.defaultRenderer,orientation:e.orientation,alignment:e.alignment,spacing:e.spacing})}}(ym||(ym={}));class Dm extends Rm{constructor(e={}){super({...e,layout:wm.createLayout(e)}),this._widgetSizesCache=new WeakMap,this._expansionToggled=new zf.Signal(this),this.addClass("lm-AccordionPanel")}get renderer(){return this.layout.renderer}get titleSpace(){return this.layout.titleSpace}set titleSpace(e){this.layout.titleSpace=e}get titles(){return this.layout.titles}get expansionToggled(){return this._expansionToggled}addWidget(e){super.addWidget(e),e.title.changed.connect(this._onTitleChanged,this)}collapse(e){const t=this.layout.widgets[e];t&&!t.isHidden&&this._toggleExpansion(e)}expand(e){const t=this.layout.widgets[e];t&&t.isHidden&&this._toggleExpansion(e)}insertWidget(e,t){super.insertWidget(e,t),t.title.changed.connect(this._onTitleChanged,this)}handleEvent(e){switch(super.handleEvent(e),e.type){case"click":this._evtClick(e);break;case"keydown":this._eventKeyDown(e)}}onBeforeAttach(e){this.node.addEventListener("click",this),this.node.addEventListener("keydown",this),super.onBeforeAttach(e)}onAfterDetach(e){super.onAfterDetach(e),this.node.removeEventListener("click",this),this.node.removeEventListener("keydown",this)}_onTitleChanged(e){const t=jf.RO.findFirstIndex(this.widgets,(t=>t.contains(e.owner)));t>=0&&(this.layout.updateTitle(t,e.owner),this.update())}_computeWidgetSize(e){const t=this.layout,i=t.widgets[e];if(!i)return;const n=i.isHidden,s=t.absoluteSizes(),r=(n?-1:1)*this.spacing,o=s.reduce(((e,t)=>e+t));let a=[...s];if(n){const t=this._widgetSizesCache.get(i);if(!t)return;a[e]+=t;const n=a.map((e=>e-t>0)).lastIndexOf(!0);-1===n?a.forEach(((i,n)=>{n!==e&&(a[n]-=s[n]/o*(t-r))})):a[n]-=t-r}else{const t=s[e];this._widgetSizesCache.set(i,t),a[e]=0;const n=a.map((e=>e>0)).lastIndexOf(!0);if(-1===n)return;a[n]=s[n]+t+r}return a.map((e=>e/(o+r)))}_evtClick(e){const t=e.target;if(t){const i=jf.RO.findFirstIndex(this.titles,(e=>e.contains(t)));i>=0&&(e.preventDefault(),e.stopPropagation(),this._toggleExpansion(i))}}_eventKeyDown(e){if(e.defaultPrevented)return;const t=e.target;let i=!1;if(t){const n=jf.RO.findFirstIndex(this.titles,(e=>e.contains(t)));if(n>=0){const s=e.keyCode.toString();if(e.key.match(/Space|Enter/)||s.match(/13|32/))t.click(),i=!0;else if("horizontal"===this.orientation?e.key.match(/ArrowLeft|ArrowRight/)||s.match(/37|39/):e.key.match(/ArrowUp|ArrowDown/)||s.match(/38|40/)){const t=e.key.match(/ArrowLeft|ArrowUp/)||s.match(/37|38/)?-1:1,r=this.titles.length,o=(n+r+t)%r;this.titles[o].focus(),i=!0}else"End"===e.key||"35"===s?(this.titles[this.titles.length-1].focus(),i=!0):"Home"!==e.key&&"36"!==s||(this.titles[0].focus(),i=!0)}i&&e.preventDefault()}}_toggleExpansion(e){const t=this.titles[e],i=this.layout.widgets[e],n=this._computeWidgetSize(e);n&&this.setRelativeSizes(n,!1),i.isHidden?(t.classList.add("lm-mod-expanded"),t.setAttribute("aria-expanded","true"),i.show()):(t.classList.remove("lm-mod-expanded"),t.setAttribute("aria-expanded","false"),i.hide()),this._expansionToggled.emit(e)}}!function(e){class t extends Rm.Renderer{constructor(){super(),this.titleClassName="lm-AccordionPanel-title",this._titleID=0,this._titleKeys=new WeakMap,this._uuid=++t._nInstance}createCollapseIcon(e){return document.createElement("span")}createSectionTitle(e){const t=document.createElement("h3");t.setAttribute("tabindex","0"),t.id=this.createTitleKey(e),t.className=this.titleClassName;for(const i in e.dataset)t.dataset[i]=e.dataset[i];t.appendChild(this.createCollapseIcon(e)).className="lm-AccordionPanel-titleCollapser";const i=t.appendChild(document.createElement("span"));return i.className="lm-AccordionPanel-titleLabel",i.textContent=e.label,i.title=e.caption||e.label,t}createTitleKey(e){let t=this._titleKeys.get(e);return void 0===t&&(t=`title-key-${this._uuid}-${this._titleID++}`,this._titleKeys.set(e,t)),t}}t._nInstance=0,e.Renderer=t,e.defaultRenderer=new t}(Dm||(Dm={})),function(e){e.createLayout=function(e){return e.layout||new Em({renderer:e.renderer||Dm.defaultRenderer,orientation:e.orientation,alignment:e.alignment,spacing:e.spacing,titleSpace:e.titleSpace})}}(wm||(wm={}));class Im extends vm{constructor(e={}){super(),this._fixed=0,this._spacing=4,this._dirty=!1,this._sizers=[],this._items=[],this._box=null,this._alignment="start",this._direction="top-to-bottom",void 0!==e.direction&&(this._direction=e.direction),void 0!==e.alignment&&(this._alignment=e.alignment),void 0!==e.spacing&&(this._spacing=Pm.clampDimension(e.spacing))}dispose(){for(const e of this._items)e.dispose();this._box=null,this._items.length=0,this._sizers.length=0,super.dispose()}get direction(){return this._direction}set direction(e){this._direction!==e&&(this._direction=e,this.parent&&(this.parent.dataset.direction=e,this.parent.fit()))}get alignment(){return this._alignment}set alignment(e){this._alignment!==e&&(this._alignment=e,this.parent&&(this.parent.dataset.alignment=e,this.parent.update()))}get spacing(){return this._spacing}set spacing(e){e=Pm.clampDimension(e),this._spacing!==e&&(this._spacing=e,this.parent&&this.parent.fit())}init(){this.parent.dataset.direction=this.direction,this.parent.dataset.alignment=this.alignment,super.init()}attachWidget(e,t){jf.RO.insert(this._items,e,new gm(t)),jf.RO.insert(this._sizers,e,new um),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeAttach),this.parent.node.appendChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterAttach),this.parent.fit()}moveWidget(e,t,i){jf.RO.move(this._items,e,t),jf.RO.move(this._sizers,e,t),this.parent.update()}detachWidget(e,t){let i=jf.RO.removeAt(this._items,e);jf.RO.removeAt(this._sizers,e),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeDetach),this.parent.node.removeChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterDetach),i.dispose(),this.parent.fit()}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}_fit(){let e=0;for(let t=0,i=this._items.length;t0)switch(this._alignment){case"start":break;case"center":l=0,h=n/2;break;case"end":l=0,h=n;break;case"justify":l=n/i,h=0;break;default:throw"unreachable"}for(let e=0,t=this._items.length;e0,coerce:(e,t)=>Math.max(0,Math.floor(t)),changed:t}),e.sizeBasisProperty=new Xf.AttachedProperty({name:"sizeBasis",create:()=>0,coerce:(e,t)=>Math.max(0,Math.floor(t)),changed:t}),e.isHorizontal=function(e){return"left-to-right"===e||"right-to-left"===e},e.clampSpacing=function(e){return Math.max(0,Math.floor(e))}}(xm||(xm={}));class qm extends Am{constructor(e={}){super({layout:Sm.createLayout(e)}),this.addClass("lm-BoxPanel")}get direction(){return this.layout.direction}set direction(e){this.layout.direction=e}get alignment(){return this.layout.alignment}set alignment(e){this.layout.alignment=e}get spacing(){return this.layout.spacing}set spacing(e){this.layout.spacing=e}onChildAdded(e){e.child.addClass("lm-BoxPanel-child")}onChildRemoved(e){e.child.removeClass("lm-BoxPanel-child")}}!function(e){e.getStretch=function(e){return Im.getStretch(e)},e.setStretch=function(e,t){Im.setStretch(e,t)},e.getSizeBasis=function(e){return Im.getSizeBasis(e)},e.setSizeBasis=function(e,t){Im.setSizeBasis(e,t)}}(qm||(qm={})),function(e){e.createLayout=function(e){return e.layout||new Im(e)}}(Sm||(Sm={}));class Lm extends fm{constructor(e){super({node:km.createNode()}),this._activeIndex=-1,this._items=[],this._results=null,this.addClass("lm-CommandPalette"),this.setFlag(fm.Flag.DisallowLayout),this.commands=e.commands,this.renderer=e.renderer||Lm.defaultRenderer,this.commands.commandChanged.connect(this._onGenericChange,this),this.commands.keyBindingChanged.connect(this._onGenericChange,this)}dispose(){this._items.length=0,this._results=null,super.dispose()}get searchNode(){return this.node.getElementsByClassName("lm-CommandPalette-search")[0]}get inputNode(){return this.node.getElementsByClassName("lm-CommandPalette-input")[0]}get contentNode(){return this.node.getElementsByClassName("lm-CommandPalette-content")[0]}get items(){return this._items}addItem(e){let t=km.createItem(this.commands,e);return this._items.push(t),this.refresh(),t}addItems(e){const t=e.map((e=>km.createItem(this.commands,e)));return t.forEach((e=>this._items.push(e))),this.refresh(),t}removeItem(e){this.removeItemAt(this._items.indexOf(e))}removeItemAt(e){jf.RO.removeAt(this._items,e)&&this.refresh()}clearItems(){0!==this._items.length&&(this._items.length=0,this.refresh())}refresh(){this._results=null,""!==this.inputNode.value?this.node.getElementsByClassName("lm-close-icon")[0].style.display="inherit":this.node.getElementsByClassName("lm-close-icon")[0].style.display="none",this.update()}handleEvent(e){switch(e.type){case"click":this._evtClick(e);break;case"keydown":this._evtKeyDown(e);break;case"input":this.refresh();break;case"focus":case"blur":this._toggleFocused()}}onBeforeAttach(e){this.node.addEventListener("click",this),this.node.addEventListener("keydown",this),this.node.addEventListener("input",this),this.node.addEventListener("focus",this,!0),this.node.addEventListener("blur",this,!0)}onAfterDetach(e){this.node.removeEventListener("click",this),this.node.removeEventListener("keydown",this),this.node.removeEventListener("input",this),this.node.removeEventListener("focus",this,!0),this.node.removeEventListener("blur",this,!0)}onAfterShow(e){this.update(),super.onAfterShow(e)}onActivateRequest(e){if(this.isAttached){let e=this.inputNode;e.focus(),e.select()}}onUpdateRequest(e){if(this.isHidden)return;let t=this.inputNode.value,i=this.contentNode,n=this._results;if(n||(n=this._results=km.search(this._items,t),this._activeIndex=t?jf.RO.findFirstIndex(n,km.canActivate):-1),!t&&0===n.length)return void im.render(null,i);if(t&&0===n.length){let e=this.renderer.renderEmptyMessage({query:t});return void im.render(e,i)}let s=this.renderer,r=this._activeIndex,o=new Array(n.length);for(let e=0,t=n.length;e=n.length)i.scrollTop=0;else{let e=i.children[r];Af.scrollIntoViewIfNeeded(i,e)}}_evtClick(e){if(0!==e.button)return;if(e.target.classList.contains("lm-close-icon"))return this.inputNode.value="",void this.refresh();let t=jf.RO.findFirstIndex(this.contentNode.children,(t=>t.contains(e.target)));-1!==t&&(e.preventDefault(),e.stopPropagation(),this._execute(t))}_evtKeyDown(e){if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey))switch(e.keyCode){case 13:e.preventDefault(),e.stopPropagation(),this._execute(this._activeIndex);break;case 38:e.preventDefault(),e.stopPropagation(),this._activatePreviousItem();break;case 40:e.preventDefault(),e.stopPropagation(),this._activateNextItem()}}_activateNextItem(){if(!this._results||0===this._results.length)return;let e=this._activeIndex,t=this._results.length,i=ee-t)),h=r.slice(0,l),c=r.slice(l);for(let e=0,t=c.length;ei.command===e&&Wf.JSONExt.deepEqual(i.args,t)))||null}}}(km||(km={}));class Nm extends fm{constructor(e){super({node:Tm.createNode()}),this._childIndex=-1,this._activeIndex=-1,this._openTimerID=0,this._closeTimerID=0,this._items=[],this._childMenu=null,this._parentMenu=null,this._aboutToClose=new zf.Signal(this),this._menuRequested=new zf.Signal(this),this.addClass("lm-Menu"),this.setFlag(fm.Flag.DisallowLayout),this.commands=e.commands,this.renderer=e.renderer||Nm.defaultRenderer}dispose(){this.close(),this._items.length=0,super.dispose()}get aboutToClose(){return this._aboutToClose}get menuRequested(){return this._menuRequested}get parentMenu(){return this._parentMenu}get childMenu(){return this._childMenu}get rootMenu(){let e=this;for(;e._parentMenu;)e=e._parentMenu;return e}get leafMenu(){let e=this;for(;e._childMenu;)e=e._childMenu;return e}get contentNode(){return this.node.getElementsByClassName("lm-Menu-content")[0]}get activeItem(){return this._items[this._activeIndex]||null}set activeItem(e){this.activeIndex=e?this._items.indexOf(e):-1}get activeIndex(){return this._activeIndex}set activeIndex(e){(e<0||e>=this._items.length)&&(e=-1),-1===e||Tm.canActivate(this._items[e])||(e=-1),this._activeIndex!==e&&(this._activeIndex=e,this._activeIndex>=0&&this.contentNode.childNodes[this._activeIndex]&&this.contentNode.childNodes[this._activeIndex].focus(),this.update())}get items(){return this._items}activateNextItem(){let e=this._items.length,t=this._activeIndex,i=t{this.activeIndex=e}})}im.render(r,this.contentNode)}onCloseRequest(e){this._cancelOpenTimer(),this._cancelCloseTimer(),this.activeIndex=-1;let t=this._childMenu;t&&(this._childIndex=-1,this._childMenu=null,t._parentMenu=null,t.close());let i=this._parentMenu;i&&(this._parentMenu=null,i._childIndex=-1,i._childMenu=null,i.activate()),this.isAttached&&this._aboutToClose.emit(void 0),super.onCloseRequest(e)}_evtKeyDown(e){e.preventDefault(),e.stopPropagation();let t=e.keyCode;if(13===t)return void this.triggerActiveItem();if(27===t)return void this.close();if(37===t)return void(this._parentMenu?this.close():this._menuRequested.emit("previous"));if(38===t)return void this.activatePreviousItem();if(39===t){let e=this.activeItem;return void(e&&"submenu"===e.type?this.triggerActiveItem():this.rootMenu._menuRequested.emit("next"))}if(40===t)return void this.activateNextItem();let i=Zf().keyForKeydownEvent(e);if(!i)return;let n=this._activeIndex+1,s=Tm.findMnemonic(this._items,i,n);-1===s.index||s.multiple?-1!==s.index?this.activeIndex=s.index:-1!==s.auto&&(this.activeIndex=s.auto):(this.activeIndex=s.index,this.triggerActiveItem())}_evtMouseUp(e){0===e.button&&(e.preventDefault(),e.stopPropagation(),this.triggerActiveItem())}_evtMouseMove(e){let t=jf.RO.findFirstIndex(this.contentNode.children,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(t===this._activeIndex)return;if(this.activeIndex=t,t=this.activeIndex,t===this._childIndex)return this._cancelOpenTimer(),void this._cancelCloseTimer();-1!==this._childIndex&&this._startCloseTimer(),this._cancelOpenTimer();let i=this.activeItem;i&&"submenu"===i.type&&i.submenu&&this._startOpenTimer()}_evtMouseEnter(e){for(let e=this._parentMenu;e;e=e._parentMenu)e._cancelOpenTimer(),e._cancelCloseTimer(),e.activeIndex=e._childIndex}_evtMouseLeave(e){if(this._cancelOpenTimer(),!this._childMenu)return void(this.activeIndex=-1);let{clientX:t,clientY:i}=e;Af.hitTest(this._childMenu.node,t,i)?this._cancelCloseTimer():(this.activeIndex=-1,this._startCloseTimer())}_evtMouseDown(e){this._parentMenu||(Tm.hitTestMenus(this,e.clientX,e.clientY)?(e.preventDefault(),e.stopPropagation()):this.close())}_openChildMenu(e=!1){let t=this.activeItem;if(!t||"submenu"!==t.type||!t.submenu)return void this._closeChildMenu();let i=t.submenu;if(i===this._childMenu)return;Nm.saveWindowData(),this._closeChildMenu(),this._childMenu=i,this._childIndex=this._activeIndex,i._parentMenu=this,Lf.sendMessage(this,fm.Msg.UpdateRequest);let n=this.contentNode.children[this._activeIndex];Tm.openSubmenu(i,n),e&&(i.activeIndex=-1,i.activateNextItem()),i.activate()}_closeChildMenu(){this._childMenu&&this._childMenu.close()}_startOpenTimer(){0===this._openTimerID&&(this._openTimerID=window.setTimeout((()=>{this._openTimerID=0,this._openChildMenu()}),Tm.TIMER_DELAY))}_startCloseTimer(){0===this._closeTimerID&&(this._closeTimerID=window.setTimeout((()=>{this._closeTimerID=0,this._closeChildMenu()}),Tm.TIMER_DELAY))}_cancelOpenTimer(){0!==this._openTimerID&&(clearTimeout(this._openTimerID),this._openTimerID=0)}_cancelCloseTimer(){0!==this._closeTimerID&&(clearTimeout(this._closeTimerID),this._closeTimerID=0)}static saveWindowData(){Tm.saveWindowData()}}!function(e){class t{renderItem(e){let t=this.createItemClass(e),i=this.createItemDataset(e),n=this.createItemARIA(e);return dm.li({className:t,dataset:i,tabindex:"0",onfocus:e.onfocus,...n},this.renderIcon(e),this.renderLabel(e),this.renderShortcut(e),this.renderSubmenu(e))}renderIcon(e){let t=this.createIconClass(e);return dm.div({className:t},e.item.icon,e.item.iconLabel)}renderLabel(e){let t=this.formatLabel(e);return dm.div({className:"lm-Menu-itemLabel"},t)}renderShortcut(e){let t=this.formatShortcut(e);return dm.div({className:"lm-Menu-itemShortcut"},t)}renderSubmenu(e){return dm.div({className:"lm-Menu-itemSubmenuIcon"})}createItemClass(e){let t="lm-Menu-item";e.item.isEnabled||(t+=" lm-mod-disabled"),e.item.isToggled&&(t+=" lm-mod-toggled"),e.item.isVisible||(t+=" lm-mod-hidden"),e.active&&(t+=" lm-mod-active"),e.collapsed&&(t+=" lm-mod-collapsed");let i=e.item.className;return i&&(t+=` ${i}`),t}createItemDataset(e){let t,{type:i,command:n,dataset:s}=e.item;return t="command"===i?{...s,type:i,command:n}:{...s,type:i},t}createIconClass(e){let t="lm-Menu-itemIcon",i=e.item.iconClass;return i?`${t} ${i}`:t}createItemARIA(e){let t={};switch(e.item.type){case"separator":t.role="presentation";break;case"submenu":t["aria-haspopup"]="true",e.item.isEnabled||(t["aria-disabled"]="true");break;default:e.item.isEnabled||(t["aria-disabled"]="true"),t.role="menuitem"}return t}formatLabel(e){let{label:t,mnemonic:i}=e.item;if(i<0||i>=t.length)return t;let n=t.slice(0,i),s=t.slice(i+1),r=t[i];return[n,dm.span({className:"lm-Menu-itemMnemonic"},r),s]}formatShortcut(e){let t=e.item.keyBinding;return t?lm.formatKeystroke(t.keys):null}}e.Renderer=t,e.defaultRenderer=new t}(Nm||(Nm={})),function(e){e.TIMER_DELAY=300,e.SUBMENU_OVERLAP=3;let t=null,i=0;function n(){return i>0?(i--,t):r()}function s(e){return"separator"!==e.type&&e.isEnabled&&e.isVisible}function r(){return{pageXOffset:window.pageXOffset,pageYOffset:window.pageYOffset,clientWidth:document.documentElement.clientWidth,clientHeight:document.documentElement.clientHeight}}e.saveWindowData=function(){t=r(),i++},e.createNode=function(){let e=document.createElement("div"),t=document.createElement("ul");return t.className="lm-Menu-content",e.appendChild(t),t.setAttribute("role","menu"),e.tabIndex=0,e},e.canActivate=s,e.createItem=function(e,t){return new o(e.commands,t)},e.hitTestMenus=function(e,t,i){for(let n=e;n;n=n.childMenu)if(Af.hitTest(n.node,t,i))return!0;return!1},e.computeCollapsed=function(e){let t=new Array(e.length);jf.RO.fill(t,!1);let i=0,n=e.length;for(;i=0;--s){let i=e[s];if(i.isVisible){if("separator"!==i.type)break;t[s]=!0}}let r=!1;for(;++ia+h&&(t=a+h-f),!r&&i+m>l+c&&(i>l+c?i=l+c-m:i-=m),p.transform=`translate(${Math.max(0,t)}px, ${Math.max(0,i)}px`,p.opacity="1"},e.openSubmenu=function(t,i){const s=n();let r=s.pageXOffset,o=s.pageYOffset,a=s.clientWidth,l=s.clientHeight;Lf.sendMessage(t,fm.Msg.UpdateRequest);let h=l,c=t.node,d=c.style;d.opacity="0",d.maxHeight=`${h}px`,fm.attach(t,document.body);let{width:u,height:p}=c.getBoundingClientRect(),f=Af.boxSizing(t.node),m=i.getBoundingClientRect(),g=m.right-e.SUBMENU_OVERLAP;g+u>r+a&&(g=m.left+e.SUBMENU_OVERLAP-u);let v=m.top-f.borderTop-f.paddingTop;v+p>o+l&&(v=m.bottom+f.borderBottom+f.paddingBottom-p),d.transform=`translate(${Math.max(0,g)}px, ${Math.max(0,v)}px`,d.opacity="1"},e.findMnemonic=function(e,t,i){let n=-1,r=-1,o=!1,a=t.toUpperCase();for(let t=0,l=e.length;t=0&&ui.command===e&&Wf.JSONExt.deepEqual(i.args,t)))||null}return null}}}(Tm||(Tm={})),function(e){function t(e,t){let i=e.rank,n=t.rank;return i!==n?i=this._titles.length)&&(e=-1),this._currentIndex===e)return;let t=this._currentIndex,i=this._titles[t]||null,n=e,s=this._titles[n]||null;this._currentIndex=n,this._previousTitle=i,this.update(),this._currentChanged.emit({previousIndex:t,previousTitle:i,currentIndex:n,currentTitle:s})}get name(){return this._name}set name(e){this._name=e,e?this.contentNode.setAttribute("aria-label",e):this.contentNode.removeAttribute("aria-label")}get orientation(){return this._orientation}set orientation(e){this._orientation!==e&&(this._releaseMouse(),this._orientation=e,this.dataset.orientation=e,this.contentNode.setAttribute("aria-orientation",e))}get addButtonEnabled(){return this._addButtonEnabled}set addButtonEnabled(e){this._addButtonEnabled!==e&&(this._addButtonEnabled=e,e?this.addButtonNode.classList.remove("lm-mod-hidden"):this.addButtonNode.classList.add("lm-mod-hidden"))}get titles(){return this._titles}get contentNode(){return this.node.getElementsByClassName("lm-TabBar-content")[0]}get addButtonNode(){return this.node.getElementsByClassName("lm-TabBar-addButton")[0]}addTab(e){return this.insertTab(this._titles.length,e)}insertTab(e,t){this._releaseMouse();let i=Qm.asTitle(t),n=this._titles.indexOf(i),s=Math.max(0,Math.min(e,this._titles.length));return-1===n?(jf.RO.insert(this._titles,s,i),i.changed.connect(this._onTitleChanged,this),this.update(),this._adjustCurrentForInsert(s,i),i):(s===this._titles.length&&s--,n===s||(jf.RO.move(this._titles,n,s),this.update(),this._adjustCurrentForMove(n,s)),i)}removeTab(e){this.removeTabAt(this._titles.indexOf(e))}removeTabAt(e){this._releaseMouse();let t=jf.RO.removeAt(this._titles,e);t&&(t.changed.disconnect(this._onTitleChanged,this),t===this._previousTitle&&(this._previousTitle=null),this.update(),this._adjustCurrentForRemove(e,t))}clearTabs(){if(0===this._titles.length)return;this._releaseMouse();for(let e of this._titles)e.changed.disconnect(this._onTitleChanged,this);let e=this.currentIndex,t=this.currentTitle;this._currentIndex=-1,this._previousTitle=null,this._titles.length=0,this.update(),-1!==e&&this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:-1,currentTitle:null})}releaseMouse(){this._releaseMouse()}handleEvent(e){switch(e.type){case"pointerdown":this._evtPointerDown(e);break;case"pointermove":this._evtPointerMove(e);break;case"pointerup":this._evtPointerUp(e);break;case"dblclick":this._evtDblClick(e);break;case"keydown":e.eventPhase===Event.CAPTURING_PHASE?this._evtKeyDownCapturing(e):this._evtKeyDown(e);break;case"contextmenu":e.preventDefault(),e.stopPropagation()}}onBeforeAttach(e){this.node.addEventListener("pointerdown",this),this.node.addEventListener("dblclick",this),this.node.addEventListener("keydown",this)}onAfterDetach(e){this.node.removeEventListener("pointerdown",this),this.node.removeEventListener("dblclick",this),this.node.removeEventListener("keydown",this),this._releaseMouse()}onUpdateRequest(e){var t;let i=this._titles,n=this.renderer,s=this.currentTitle,r=new Array(i.length);const o=null!==(t=this._getCurrentTabindex())&&void 0!==t?t:this._currentIndex>-1?this._currentIndex:0;for(let e=0,t=i.length;eAf.hitTest(t,e.clientX,e.clientY)));if(-1===i)return;let n=this.titles[i],s=t[i].querySelector(".lm-TabBar-tabLabel");if(s&&s.contains(e.target)){let e=n.label||"",t=s.innerHTML;s.innerHTML="";let i=document.createElement("input");i.classList.add("lm-TabBar-tabInput"),i.value=e,s.appendChild(i);let r=()=>{i.removeEventListener("blur",r),s.innerHTML=t,this.node.addEventListener("keydown",this)};i.addEventListener("dblclick",(e=>e.stopPropagation())),i.addEventListener("blur",r),i.addEventListener("keydown",(e=>{"Enter"===e.key?(""!==i.value&&(n.label=n.caption=i.value),r()):"Escape"===e.key&&r()})),this.node.removeEventListener("keydown",this),i.select(),i.focus(),s.children.length>0&&s.children[0].focus()}}_evtKeyDownCapturing(e){e.eventPhase===Event.CAPTURING_PHASE&&(e.preventDefault(),e.stopPropagation(),"Escape"===e.key&&this._releaseMouse())}_evtKeyDown(e){var t,i,n;if("Tab"!==e.key&&e.eventPhase!==Event.CAPTURING_PHASE)if("Enter"===e.key||"Spacebar"===e.key||" "===e.key){const t=document.activeElement;if(this.addButtonEnabled&&this.addButtonNode.contains(t))e.preventDefault(),e.stopPropagation(),this._addRequested.emit();else{const i=jf.RO.findFirstIndex(this.contentNode.children,(e=>e.contains(t)));i>=0&&(e.preventDefault(),e.stopPropagation(),this.currentIndex=i)}}else if(Bm.includes(e.key)){const s=[...this.contentNode.children];if(this.addButtonEnabled&&s.push(this.addButtonNode),s.length<=1)return;e.preventDefault(),e.stopPropagation();let r,o=s.indexOf(document.activeElement);-1===o&&(o=this._currentIndex),"ArrowRight"===e.key&&"horizontal"===this._orientation||"ArrowDown"===e.key&&"vertical"===this._orientation?r=null!==(t=s[o+1])&&void 0!==t?t:s[0]:"ArrowLeft"===e.key&&"horizontal"===this._orientation||"ArrowUp"===e.key&&"vertical"===this._orientation?r=null!==(i=s[o-1])&&void 0!==i?i:s[s.length-1]:"Home"===e.key?r=s[0]:"End"===e.key&&(r=s[s.length-1]),r&&(null===(n=s[o])||void 0===n||n.setAttribute("tabindex","-1"),null==r||r.setAttribute("tabindex","0"),r.focus())}}_evtPointerDown(e){if(0!==e.button&&1!==e.button)return;if(this._dragData)return;if(e.target.classList.contains("lm-TabBar-tabInput"))return;let t=this.addButtonEnabled&&this.addButtonNode.contains(e.target),i=this.contentNode.children,n=jf.RO.findFirstIndex(i,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(-1===n&&!t)return;if(e.preventDefault(),e.stopPropagation(),this._dragData={tab:i[n],index:n,pressX:e.clientX,pressY:e.clientY,tabPos:-1,tabSize:-1,tabPressPos:-1,targetIndex:-1,tabLayout:null,contentRect:null,override:null,dragActive:!1,dragAborted:!1,detachRequested:!1},this.document.addEventListener("pointerup",this,!0),1===e.button||t)return;let s=i[n].querySelector(this.renderer.closeIconSelector);s&&s.contains(e.target)||(this.tabsMovable&&(this.document.addEventListener("pointermove",this,!0),this.document.addEventListener("keydown",this,!0),this.document.addEventListener("contextmenu",this,!0)),this.allowDeselect&&this.currentIndex===n?this.currentIndex=-1:this.currentIndex=n,-1!==this.currentIndex&&this._tabActivateRequested.emit({index:this.currentIndex,title:this.currentTitle}))}_evtPointerMove(e){let t=this._dragData;if(!t)return;e.preventDefault(),e.stopPropagation();let i=this.contentNode.children;if(t.dragActive||Qm.dragExceeded(t,e)){if(!t.dragActive){let e=t.tab.getBoundingClientRect();"horizontal"===this._orientation?(t.tabPos=t.tab.offsetLeft,t.tabSize=e.width,t.tabPressPos=t.pressX-e.left):(t.tabPos=t.tab.offsetTop,t.tabSize=e.height,t.tabPressPos=t.pressY-e.top),t.tabPressOffset={x:t.pressX-e.left,y:t.pressY-e.top},t.tabLayout=Qm.snapTabLayout(i,this._orientation),t.contentRect=this.contentNode.getBoundingClientRect(),t.override=Gf.overrideCursor("default"),t.tab.classList.add("lm-mod-dragging"),this.addClass("lm-mod-dragging"),t.dragActive=!0}if(!t.detachRequested&&Qm.detachExceeded(t,e)){t.detachRequested=!0;let n=t.index,s=e.clientX,r=e.clientY,o=i[n],a=this._titles[n];if(this._tabDetachRequested.emit({index:n,title:a,tab:o,clientX:s,clientY:r,offset:t.tabPressOffset}),t.dragAborted)return}Qm.layoutTabs(i,t,e,this._orientation)}}_evtPointerUp(e){if(0!==e.button&&1!==e.button)return;const t=this._dragData;if(!t)return;if(e.preventDefault(),e.stopPropagation(),this.document.removeEventListener("pointermove",this,!0),this.document.removeEventListener("pointerup",this,!0),this.document.removeEventListener("keydown",this,!0),this.document.removeEventListener("contextmenu",this,!0),!t.dragActive){if(this._dragData=null,this.addButtonEnabled&&this.addButtonNode.contains(e.target))return void this._addRequested.emit(void 0);let i=this.contentNode.children,n=jf.RO.findFirstIndex(i,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(n!==t.index)return;let s=this._titles[n];if(!s.closable)return;if(1===e.button)return void this._tabCloseRequested.emit({index:n,title:s});let r=i[n].querySelector(this.renderer.closeIconSelector);return r&&r.contains(e.target)?void this._tabCloseRequested.emit({index:n,title:s}):void 0}if(0!==e.button)return;Qm.finalizeTabPosition(t,this._orientation),t.tab.classList.remove("lm-mod-dragging");let i=Qm.parseTransitionDuration(t.tab);setTimeout((()=>{if(t.dragAborted)return;this._dragData=null,Qm.resetTabPositions(this.contentNode.children,this._orientation),t.override.dispose(),this.removeClass("lm-mod-dragging");let e=t.index,i=t.targetIndex;-1!==i&&e!==i&&(jf.RO.move(this._titles,e,i),this._adjustCurrentForMove(e,i),this._tabMoved.emit({fromIndex:e,toIndex:i,title:this._titles[i]}),Lf.sendMessage(this,fm.Msg.UpdateRequest))}),i)}_releaseMouse(){let e=this._dragData;e&&(this._dragData=null,this.document.removeEventListener("pointermove",this,!0),this.document.removeEventListener("pointerup",this,!0),this.document.removeEventListener("keydown",this,!0),this.document.removeEventListener("contextmenu",this,!0),e.dragAborted=!0,e.dragActive&&(Qm.resetTabPositions(this.contentNode.children,this._orientation),e.override.dispose(),e.tab.classList.remove("lm-mod-dragging"),this.removeClass("lm-mod-dragging")))}_adjustCurrentForInsert(e,t){let i=this.currentTitle,n=this._currentIndex,s=this.insertBehavior;if("select-tab"===s||"select-tab-if-needed"===s&&-1===n)return this._currentIndex=e,this._previousTitle=i,void this._currentChanged.emit({previousIndex:n,previousTitle:i,currentIndex:e,currentTitle:t});n>=e&&this._currentIndex++}_adjustCurrentForMove(e,t){this._currentIndex===e?this._currentIndex=t:this._currentIndex=t?this._currentIndex++:this._currentIndex>e&&this._currentIndex<=t&&this._currentIndex--}_adjustCurrentForRemove(e,t){let i=this._currentIndex,n=this.removeBehavior;if(i===e){if(0===this._titles.length)return this._currentIndex=-1,void this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:-1,currentTitle:null});if("select-tab-after"===n)return this._currentIndex=Math.min(e,this._titles.length-1),void this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:this._currentIndex,currentTitle:this.currentTitle});if("select-tab-before"===n)return this._currentIndex=Math.max(0,e-1),void this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:this._currentIndex,currentTitle:this.currentTitle});if("select-previous-tab"===n)return this._previousTitle?(this._currentIndex=this._titles.indexOf(this._previousTitle),this._previousTitle=null):this._currentIndex=Math.min(e,this._titles.length-1),void this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:this._currentIndex,currentTitle:this.currentTitle});this._currentIndex=-1,this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:-1,currentTitle:null})}else i>e&&this._currentIndex--}_onTitleChanged(e){this.update()}}var Qm,zm,jm,Wm,Vm,Um,Fm,Hm;!function(e){class t{constructor(){this.closeIconSelector=".lm-TabBar-tabCloseIcon",this._tabID=0,this._tabKeys=new WeakMap,this._uuid=++t._nInstance}renderTab(e){let t=e.title.caption,i=this.createTabKey(e),n=i,s=this.createTabStyle(e),r=this.createTabClass(e),o=this.createTabDataset(e),a=this.createTabARIA(e);return e.title.closable?dm.li({id:n,key:i,className:r,title:t,style:s,dataset:o,...a},this.renderIcon(e),this.renderLabel(e),this.renderCloseIcon(e)):dm.li({id:n,key:i,className:r,title:t,style:s,dataset:o,...a},this.renderIcon(e),this.renderLabel(e))}renderIcon(e){const{title:t}=e;let i=this.createIconClass(e);return dm.div({className:i},t.icon,t.iconLabel)}renderLabel(e){return dm.div({className:"lm-TabBar-tabLabel"},e.title.label)}renderCloseIcon(e){return dm.div({className:"lm-TabBar-tabCloseIcon"})}createTabKey(e){let t=this._tabKeys.get(e.title);return void 0===t&&(t=`tab-key-${this._uuid}-${this._tabID++}`,this._tabKeys.set(e.title,t)),t}createTabStyle(e){return{zIndex:`${e.zIndex}`}}createTabClass(e){let t="lm-TabBar-tab";return e.title.className&&(t+=` ${e.title.className}`),e.title.closable&&(t+=" lm-mod-closable"),e.current&&(t+=" lm-mod-current"),t}createTabDataset(e){return e.title.dataset}createTabARIA(e){var t;return{role:"tab","aria-selected":e.current.toString(),tabindex:`${null!==(t=e.tabIndex)&&void 0!==t?t:"-1"}`}}createIconClass(e){let t="lm-TabBar-tabIcon",i=e.title.iconClass;return i?`${t} ${i}`:t}}t._nInstance=0,e.Renderer=t,e.defaultRenderer=new t,e.addButtonSelector=".lm-TabBar-addButton"}($m||($m={})),function(e){e.DRAG_THRESHOLD=5,e.DETACH_THRESHOLD=20,e.createNode=function(){let e=document.createElement("div"),t=document.createElement("ul");t.setAttribute("role","tablist"),t.className="lm-TabBar-content",e.appendChild(t);let i=document.createElement("div");return i.className="lm-TabBar-addButton lm-mod-hidden",i.setAttribute("tabindex","-1"),e.appendChild(i),e},e.asTitle=function(e){return e instanceof pm?e:new pm(e)},e.parseTransitionDuration=function(e){let t=window.getComputedStyle(e);return 1e3*(parseFloat(t.transitionDuration)||0)},e.snapTabLayout=function(e,t){let i=new Array(e.length);for(let n=0,s=e.length;n=e.DRAG_THRESHOLD||s>=e.DRAG_THRESHOLD},e.detachExceeded=function(t,i){let n=t.contentRect;return i.clientX=n.right+e.DETACH_THRESHOLD||i.clientY=n.bottom+e.DETACH_THRESHOLD},e.layoutTabs=function(e,t,i,n){let s,r,o,a;"horizontal"===n?(s=t.pressX,r=i.clientX-t.contentRect.left,o=i.clientX,a=t.contentRect.width):(s=t.pressY,r=i.clientY-t.contentRect.top,o=i.clientY,a=t.contentRect.height);let l=t.index,h=r-t.tabPressPos,c=h+t.tabSize;for(let i=0,r=e.length;i>1);if(it.index&&c>u)r=-t.tabSize-d.margin+"px",l=Math.max(l,i);else if(i===t.index){let e=o-s,i=a-(t.tabPos+t.tabSize);r=`${Math.max(-t.tabPos,Math.min(e,i))}px`}else r="";"horizontal"===n?e[i].style.left=r:e[i].style.top=r}t.targetIndex=l},e.finalizeTabPosition=function(e,t){let i,n;if(i="horizontal"===t?e.contentRect.width:e.contentRect.height,e.targetIndex===e.index)n=0;else if(e.targetIndex>e.index){let t=e.tabLayout[e.targetIndex];n=t.pos+t.size-e.tabSize-e.tabPos}else n=e.tabLayout[e.targetIndex].pos-e.tabPos;let s=i-(e.tabPos+e.tabSize),r=Math.max(-e.tabPos,Math.min(n,s));"horizontal"===t?e.tab.style.left=`${r}px`:e.tab.style.top=`${r}px`},e.resetTabPositions=function(e,t){for(const i of e)"horizontal"===t?i.style.left="":i.style.top=""}}(Qm||(Qm={}));class Xm extends mm{constructor(e){super(),this._spacing=4,this._dirty=!1,this._root=null,this._box=null,this._items=new Map,this.renderer=e.renderer,void 0!==e.spacing&&(this._spacing=Pm.clampDimension(e.spacing)),this._document=e.document||document,this._hiddenMode=void 0!==e.hiddenMode?e.hiddenMode:fm.HiddenMode.Display}dispose(){let e=this[Symbol.iterator]();this._items.forEach((e=>{e.dispose()})),this._box=null,this._root=null,this._items.clear();for(const t of e)t.dispose();super.dispose()}get hiddenMode(){return this._hiddenMode}set hiddenMode(e){if(this._hiddenMode!==e){this._hiddenMode=e;for(const e of this.tabBars())if(e.titles.length>1)for(const t of e.titles)t.owner.hiddenMode=this._hiddenMode}}get spacing(){return this._spacing}set spacing(e){e=Pm.clampDimension(e),this._spacing!==e&&(this._spacing=e,this.parent&&this.parent.fit())}get isEmpty(){return null===this._root}[Symbol.iterator](){return this._root?this._root.iterAllWidgets():(0,jf.cS)()}widgets(){return this._root?this._root.iterUserWidgets():(0,jf.cS)()}selectedWidgets(){return this._root?this._root.iterSelectedWidgets():(0,jf.cS)()}tabBars(){return this._root?this._root.iterTabBars():(0,jf.cS)()}handles(){return this._root?this._root.iterHandles():(0,jf.cS)()}moveHandle(e,t,i){let n=e.classList.contains("lm-mod-hidden");if(!this._root||n)return;let s,r=this._root.findSplitNode(e);r&&(s="horizontal"===r.node.orientation?t-e.offsetLeft:i-e.offsetTop,0!==s&&(r.node.holdSizes(),sm.adjust(r.node.sizers,r.index,s),this.parent&&this.parent.update()))}saveLayout(){return this._root?(this._root.holdAllSizes(),{main:this._root.createConfig()}):{main:null}}restoreLayout(e){let t,i=new Set;t=e.main?zm.normalizeAreaConfig(e.main,i):null;let n=this.widgets(),s=this.tabBars(),r=this.handles();this._root=null;for(const e of n)i.has(e)||(e.parent=null);for(const e of s)e.dispose();for(const e of r)e.parentNode&&e.parentNode.removeChild(e);for(const e of i)e.parent=this.parent;this._root=t?zm.realizeAreaConfig(t,{createTabBar:e=>this._createTabBar(),createHandle:()=>this._createHandle()},this._document):null,this.parent&&(i.forEach((e=>{this.attachWidget(e)})),this.parent.fit())}addWidget(e,t={}){let i=t.ref||null,n=t.mode||"tab-after",s=null;if(this._root&&i&&(s=this._root.findTabNode(i)),i&&!s)throw new Error("Reference widget is not in the layout.");switch(e.parent=this.parent,n){case"tab-after":this._insertTab(e,i,s,!0);break;case"tab-before":this._insertTab(e,i,s,!1);break;case"split-top":this._insertSplit(e,i,s,"vertical",!1);break;case"split-left":this._insertSplit(e,i,s,"horizontal",!1);break;case"split-right":this._insertSplit(e,i,s,"horizontal",!0);break;case"split-bottom":this._insertSplit(e,i,s,"vertical",!0);break;case"merge-top":this._insertSplit(e,i,s,"vertical",!1,!0);break;case"merge-left":this._insertSplit(e,i,s,"horizontal",!1,!0);break;case"merge-right":this._insertSplit(e,i,s,"horizontal",!0,!0);break;case"merge-bottom":this._insertSplit(e,i,s,"vertical",!0,!0)}this.parent&&(this.attachWidget(e),this.parent.fit())}removeWidget(e){this._removeWidget(e),this.parent&&(this.detachWidget(e),this.parent.fit())}hitTestTabAreas(e,t){if(!this._root||!this.parent||!this.parent.isVisible)return null;this._box||(this._box=Af.boxSizing(this.parent.node));let i=this.parent.node.getBoundingClientRect(),n=e-i.left-this._box.borderLeft,s=t-i.top-this._box.borderTop,r=this._root.hitTestTabNodes(n,s);if(!r)return null;let{tabBar:o,top:a,left:l,width:h,height:c}=r,d=this._box.borderLeft+this._box.borderRight,u=this._box.borderTop+this._box.borderBottom;return{tabBar:o,x:n,y:s,top:a,left:l,right:i.width-d-(l+h),bottom:i.height-u-(a+c),width:h,height:c}}init(){super.init();for(const e of this)this.attachWidget(e);for(const e of this.handles())this.parent.node.appendChild(e);this.parent.fit()}attachWidget(e){this.parent.node!==e.node.parentNode&&(this._items.set(e,new gm(e)),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.BeforeAttach),this.parent.node.appendChild(e.node),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.AfterAttach))}detachWidget(e){if(this.parent.node!==e.node.parentNode)return;this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.BeforeDetach),this.parent.node.removeChild(e.node),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.AfterDetach);let t=this._items.get(e);t&&(this._items.delete(e),t.dispose())}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}_removeWidget(e){if(!this._root)return;let t=this._root.findTabNode(e);if(!t)return;if(zm.removeAria(e),t.tabBar.titles.length>1)return t.tabBar.removeTab(e.title),void(this._hiddenMode===fm.HiddenMode.Scale&&1==t.tabBar.titles.length&&(t.tabBar.titles[0].owner.hiddenMode=fm.HiddenMode.Display));if(t.tabBar.dispose(),this._root===t)return void(this._root=null);this._root.holdAllSizes();let i=t.parent;t.parent=null;let n=jf.RO.removeFirstOf(i.children,t),s=jf.RO.removeAt(i.handles,n);if(jf.RO.removeAt(i.sizers,n),s.parentNode&&s.parentNode.removeChild(s),i.children.length>1)return void i.syncHandles();let r=i.parent;i.parent=null;let o=i.children[0],a=i.handles[0];if(i.children.length=0,i.handles.length=0,i.sizers.length=0,a.parentNode&&a.parentNode.removeChild(a),this._root===i)return o.parent=null,void(this._root=o);let l=r,h=l.children.indexOf(i);if(o instanceof zm.TabLayoutNode)return o.parent=l,void(l.children[h]=o);let c=jf.RO.removeAt(l.handles,h);jf.RO.removeAt(l.children,h),jf.RO.removeAt(l.sizers,h),c.parentNode&&c.parentNode.removeChild(c);for(let e=0,t=o.children.length;e=i.length)&&(n=0),{type:"tab-area",widgets:i,currentIndex:n}}(t,i):function(t,i){let n=t.orientation,s=[],r=[];for(let o=0,a=t.children.length;o{let l=s(n,i,r),h=t(e.sizes[a]),c=i.createHandle();o.children.push(l),o.handles.push(c),o.sizers.push(h),l.parent=o})),o.syncHandles(),o.normalizeSizes(),o}(r,o,a),l};class i{constructor(e){this.parent=null,this._top=0,this._left=0,this._width=0,this._height=0;let t=new um,i=new um;t.stretch=0,i.stretch=1,this.tabBar=e,this.sizers=[t,i]}get top(){return this._top}get left(){return this._left}get width(){return this._width}get height(){return this._height}*iterAllWidgets(){yield this.tabBar,yield*this.iterUserWidgets()}*iterUserWidgets(){for(const e of this.tabBar.titles)yield e.owner}*iterSelectedWidgets(){let e=this.tabBar.currentTitle;e&&(yield e.owner)}*iterTabBars(){yield this.tabBar}*iterHandles(){}findTabNode(e){return-1!==this.tabBar.titles.indexOf(e.title)?this:null}findSplitNode(e){return null}findFirstTabNode(){return this}hitTestTabNodes(e,t){return e=this._left+this._width||t=this._top+this._height?null:this}createConfig(){return{type:"tab-area",widgets:this.tabBar.titles.map((e=>e.owner)),currentIndex:this.tabBar.currentIndex}}holdAllSizes(){}fit(e,t){let i=0,n=0,s=t.get(this.tabBar),r=this.tabBar.currentTitle,o=r?t.get(r.owner):void 0,[a,l]=this.sizers;return s&&s.fit(),o&&o.fit(),s&&!s.isHidden?(i=Math.max(i,s.minWidth),n+=s.minHeight,a.minSize=s.minHeight,a.maxSize=s.maxHeight):(a.minSize=0,a.maxSize=0),o&&!o.isHidden?(i=Math.max(i,o.minWidth),n+=o.minHeight,l.minSize=o.minHeight,l.maxSize=1/0):(l.minSize=0,l.maxSize=1/0),{minWidth:i,minHeight:n,maxWidth:1/0,maxHeight:1/0}}update(e,t,i,n,s,r){this._top=t,this._left=e,this._width=i,this._height=n;let o=r.get(this.tabBar),a=this.tabBar.currentTitle,l=a?r.get(a.owner):void 0;if(sm.calc(this.sizers,n),o&&!o.isHidden){let n=this.sizers[0].size;o.update(e,t,i,n),t+=n}if(l&&!l.isHidden){let n=this.sizers[1].size;l.update(e,t,i,n)}}}e.TabLayoutNode=i;class n{constructor(e){this.parent=null,this.normalized=!1,this.children=[],this.sizers=[],this.handles=[],this.orientation=e}*iterAllWidgets(){for(const e of this.children)yield*e.iterAllWidgets()}*iterUserWidgets(){for(const e of this.children)yield*e.iterUserWidgets()}*iterSelectedWidgets(){for(const e of this.children)yield*e.iterSelectedWidgets()}*iterTabBars(){for(const e of this.children)yield*e.iterTabBars()}*iterHandles(){yield*this.handles;for(const e of this.children)yield*e.iterHandles()}findTabNode(e){for(let t=0,i=this.children.length;te.createConfig())),sizes:t}}syncHandles(){this.handles.forEach(((e,t)=>{e.setAttribute("data-orientation",this.orientation),t===this.handles.length-1?e.classList.add("lm-mod-hidden"):e.classList.remove("lm-mod-hidden")}))}holdSizes(){for(const e of this.sizers)e.sizeHint=e.size}holdAllSizes(){for(const e of this.children)e.holdAllSizes();this.holdSizes()}normalizeSizes(){let e=this.sizers.length;if(0===e)return;this.holdSizes();let t=this.sizers.reduce(((e,t)=>e+t.sizeHint),0);if(0===t)for(const t of this.sizers)t.size=t.sizeHint=1/e;else for(const e of this.sizers)e.size=e.sizeHint/=t;this.normalized=!0}createNormalizedSizes(){let e=this.sizers.length;if(0===e)return[];let t=this.sizers.map((e=>e.size)),i=t.reduce(((e,t)=>e+t),0);if(0===i)for(let i=t.length-1;i>-1;i--)t[i]=1/e;else for(let e=t.length-1;e>-1;e--)t[e]/=i;return t}fit(e,t){let i="horizontal"===this.orientation,n=Math.max(0,this.children.length-1)*e,s=i?n:0,r=i?0:n;for(let n=0,o=this.children.length;nthis._createTabBar(),createHandle:()=>this._createHandle()};this.layout=new Xm({document:this._document,renderer:t,spacing:e.spacing,hiddenMode:e.hiddenMode}),this.overlay=e.overlay||new Ym.Overlay,this.node.appendChild(this.overlay.node)}dispose(){this._releaseMouse(),this.overlay.hide(0),this._drag&&this._drag.dispose(),super.dispose()}get hiddenMode(){return this.layout.hiddenMode}set hiddenMode(e){this.layout.hiddenMode=e}get layoutModified(){return this._layoutModified}get addRequested(){return this._addRequested}get renderer(){return this.layout.renderer}get spacing(){return this.layout.spacing}set spacing(e){this.layout.spacing=e}get mode(){return this._mode}set mode(e){if(this._mode===e)return;this._mode=e,this.dataset.mode=e;let t=this.layout;switch(e){case"multiple-document":for(const e of t.tabBars())e.show();break;case"single-document":t.restoreLayout(jm.createSingleDocumentConfig(this));break;default:throw"unreachable"}Lf.postMessage(this,jm.LayoutModified)}get tabsMovable(){return this._tabsMovable}set tabsMovable(e){this._tabsMovable=e;for(const t of this.tabBars())t.tabsMovable=e}get tabsConstrained(){return this._tabsConstrained}set tabsConstrained(e){this._tabsConstrained=e}get addButtonEnabled(){return this._addButtonEnabled}set addButtonEnabled(e){this._addButtonEnabled=e;for(const t of this.tabBars())t.addButtonEnabled=e}get isEmpty(){return this.layout.isEmpty}*widgets(){yield*this.layout.widgets()}*selectedWidgets(){yield*this.layout.selectedWidgets()}*tabBars(){yield*this.layout.tabBars()}*handles(){yield*this.layout.handles()}selectWidget(e){let t=(0,jf.sE)(this.tabBars(),(t=>-1!==t.titles.indexOf(e.title)));if(!t)throw new Error("Widget is not contained in the dock panel.");t.currentTitle=e.title}activateWidget(e){this.selectWidget(e),e.activate()}saveLayout(){return this.layout.saveLayout()}restoreLayout(e){this._mode="multiple-document",this.layout.restoreLayout(e),(Rf.IS_EDGE||Rf.IS_IE)&&Lf.flush(),Lf.postMessage(this,jm.LayoutModified)}addWidget(e,t={}){"single-document"===this._mode?this.layout.addWidget(e):this.layout.addWidget(e,t),Lf.postMessage(this,jm.LayoutModified)}processMessage(e){"layout-modified"===e.type?this._layoutModified.emit(void 0):super.processMessage(e)}handleEvent(e){switch(e.type){case"lm-dragenter":this._evtDragEnter(e);break;case"lm-dragleave":this._evtDragLeave(e);break;case"lm-dragover":this._evtDragOver(e);break;case"lm-drop":this._evtDrop(e);break;case"pointerdown":this._evtPointerDown(e);break;case"pointermove":this._evtPointerMove(e);break;case"pointerup":this._evtPointerUp(e);break;case"keydown":this._evtKeyDown(e);break;case"contextmenu":e.preventDefault(),e.stopPropagation()}}onBeforeAttach(e){this.node.addEventListener("lm-dragenter",this),this.node.addEventListener("lm-dragleave",this),this.node.addEventListener("lm-dragover",this),this.node.addEventListener("lm-drop",this),this.node.addEventListener("pointerdown",this)}onAfterDetach(e){this.node.removeEventListener("lm-dragenter",this),this.node.removeEventListener("lm-dragleave",this),this.node.removeEventListener("lm-dragover",this),this.node.removeEventListener("lm-drop",this),this.node.removeEventListener("pointerdown",this),this._releaseMouse()}onChildAdded(e){jm.isGeneratedTabBarProperty.get(e.child)||e.child.addClass("lm-DockPanel-widget")}onChildRemoved(e){jm.isGeneratedTabBarProperty.get(e.child)||(e.child.removeClass("lm-DockPanel-widget"),Lf.postMessage(this,jm.LayoutModified))}_evtDragEnter(e){e.mimeData.hasData("application/vnd.lumino.widget-factory")&&(e.preventDefault(),e.stopPropagation())}_evtDragLeave(e){e.preventDefault(),this._tabsConstrained&&e.source!==this||(e.stopPropagation(),this.overlay.hide(1))}_evtDragOver(e){e.preventDefault(),this._tabsConstrained&&e.source!==this||"invalid"===this._showOverlay(e.clientX,e.clientY)?e.dropAction="none":(e.stopPropagation(),e.dropAction=e.proposedAction)}_evtDrop(e){if(e.preventDefault(),this.overlay.hide(0),"none"===e.proposedAction)return void(e.dropAction="none");let{clientX:t,clientY:i}=e,{zone:n,target:s}=jm.findDropTarget(this,t,i,this._edges);if(this._tabsConstrained&&e.source!==this||"invalid"===n)return void(e.dropAction="none");let r=e.mimeData.getData("application/vnd.lumino.widget-factory");if("function"!=typeof r)return void(e.dropAction="none");let o=r();if(!(o instanceof fm))return void(e.dropAction="none");if(o.contains(this))return void(e.dropAction="none");let a=s?jm.getDropRef(s.tabBar):null;switch(n){case"root-all":this.addWidget(o);break;case"root-top":this.addWidget(o,{mode:"split-top"});break;case"root-left":this.addWidget(o,{mode:"split-left"});break;case"root-right":this.addWidget(o,{mode:"split-right"});break;case"root-bottom":this.addWidget(o,{mode:"split-bottom"});break;case"widget-all":case"widget-tab":this.addWidget(o,{mode:"tab-after",ref:a});break;case"widget-top":this.addWidget(o,{mode:"split-top",ref:a});break;case"widget-left":this.addWidget(o,{mode:"split-left",ref:a});break;case"widget-right":this.addWidget(o,{mode:"split-right",ref:a});break;case"widget-bottom":this.addWidget(o,{mode:"split-bottom",ref:a});break;default:throw"unreachable"}e.dropAction=e.proposedAction,e.stopPropagation(),this.activateWidget(o)}_evtKeyDown(e){e.preventDefault(),e.stopPropagation(),27===e.keyCode&&(this._releaseMouse(),Lf.postMessage(this,jm.LayoutModified))}_evtPointerDown(e){if(0!==e.button)return;let t=this.layout,i=e.target,n=(0,jf.sE)(t.handles(),(e=>e.contains(i)));if(!n)return;e.preventDefault(),e.stopPropagation(),this._document.addEventListener("keydown",this,!0),this._document.addEventListener("pointerup",this,!0),this._document.addEventListener("pointermove",this,!0),this._document.addEventListener("contextmenu",this,!0);let s=n.getBoundingClientRect(),r=e.clientX-s.left,o=e.clientY-s.top,a=window.getComputedStyle(n),l=Gf.overrideCursor(a.cursor,this._document);this._pressData={handle:n,deltaX:r,deltaY:o,override:l}}_evtPointerMove(e){if(!this._pressData)return;e.preventDefault(),e.stopPropagation();let t=this.node.getBoundingClientRect(),i=e.clientX-t.left-this._pressData.deltaX,n=e.clientY-t.top-this._pressData.deltaY;this.layout.moveHandle(this._pressData.handle,i,n)}_evtPointerUp(e){0===e.button&&(e.preventDefault(),e.stopPropagation(),this._releaseMouse(),Lf.postMessage(this,jm.LayoutModified))}_releaseMouse(){this._pressData&&(this._pressData.override.dispose(),this._pressData=null,this._document.removeEventListener("keydown",this,!0),this._document.removeEventListener("pointerup",this,!0),this._document.removeEventListener("pointermove",this,!0),this._document.removeEventListener("contextmenu",this,!0))}_showOverlay(e,t){let i,n,s,r,{zone:o,target:a}=jm.findDropTarget(this,e,t,this._edges);if("invalid"===o)return this.overlay.hide(100),o;let l=Af.boxSizing(this.node),h=this.node.getBoundingClientRect();switch(o){case"root-all":i=l.paddingTop,n=l.paddingLeft,s=l.paddingRight,r=l.paddingBottom;break;case"root-top":i=l.paddingTop,n=l.paddingLeft,s=l.paddingRight,r=h.height*jm.GOLDEN_RATIO;break;case"root-left":i=l.paddingTop,n=l.paddingLeft,s=h.width*jm.GOLDEN_RATIO,r=l.paddingBottom;break;case"root-right":i=l.paddingTop,n=h.width*jm.GOLDEN_RATIO,s=l.paddingRight,r=l.paddingBottom;break;case"root-bottom":i=h.height*jm.GOLDEN_RATIO,n=l.paddingLeft,s=l.paddingRight,r=l.paddingBottom;break;case"widget-all":i=a.top,n=a.left,s=a.right,r=a.bottom;break;case"widget-top":i=a.top,n=a.left,s=a.right,r=a.bottom+a.height/2;break;case"widget-left":i=a.top,n=a.left,s=a.right+a.width/2,r=a.bottom;break;case"widget-right":i=a.top,n=a.left+a.width/2,s=a.right,r=a.bottom;break;case"widget-bottom":i=a.top+a.height/2,n=a.left,s=a.right,r=a.bottom;break;case"widget-tab":{const e=a.tabBar.node.getBoundingClientRect().height;i=a.top,n=a.left,s=a.right,r=a.bottom+a.height-e;break}default:throw"unreachable"}return this.overlay.show({top:i,left:n,right:s,bottom:r}),o}_createTabBar(){let e=this._renderer.createTabBar(this._document);return jm.isGeneratedTabBarProperty.set(e,!0),"single-document"===this._mode&&e.hide(),e.tabsMovable=this._tabsMovable,e.allowDeselect=!1,e.addButtonEnabled=this._addButtonEnabled,e.removeBehavior="select-previous-tab",e.insertBehavior="select-tab-if-needed",e.tabMoved.connect(this._onTabMoved,this),e.currentChanged.connect(this._onCurrentChanged,this),e.tabCloseRequested.connect(this._onTabCloseRequested,this),e.tabDetachRequested.connect(this._onTabDetachRequested,this),e.tabActivateRequested.connect(this._onTabActivateRequested,this),e.addRequested.connect(this._onTabAddRequested,this),e}_createHandle(){return this._renderer.createHandle()}_onTabMoved(){Lf.postMessage(this,jm.LayoutModified)}_onCurrentChanged(e,t){let{previousTitle:i,currentTitle:n}=t;i&&i.owner.hide(),n&&n.owner.show(),(Rf.IS_EDGE||Rf.IS_IE)&&Lf.flush(),Lf.postMessage(this,jm.LayoutModified)}_onTabAddRequested(e){this._addRequested.emit(e)}_onTabActivateRequested(e,t){t.title.owner.activate()}_onTabCloseRequested(e,t){t.title.owner.close()}_onTabDetachRequested(e,t){if(this._drag)return;e.releaseMouse();let{title:i,tab:n,clientX:s,clientY:r,offset:o}=t,a=new Wf.MimeData;a.setData("application/vnd.lumino.widget-factory",(()=>i.owner));let l=n.cloneNode(!0);o&&(l.style.top=`-${o.y}px`,l.style.left=`-${o.x}px`),this._drag=new Gf({document:this._document,mimeData:a,dragImage:l,proposedAction:"move",supportedActions:"move",source:this}),n.classList.add("lm-mod-hidden"),this._drag.start(s,r).then((()=>{this._drag=null,n.classList.remove("lm-mod-hidden")}))}}!function(e){e.Overlay=class{constructor(){this._timer=-1,this._hidden=!0,this.node=document.createElement("div"),this.node.classList.add("lm-DockPanel-overlay"),this.node.classList.add("lm-mod-hidden"),this.node.style.position="absolute",this.node.style.contain="strict"}show(e){let t=this.node.style;t.top=`${e.top}px`,t.left=`${e.left}px`,t.right=`${e.right}px`,t.bottom=`${e.bottom}px`,clearTimeout(this._timer),this._timer=-1,this._hidden&&(this._hidden=!1,this.node.classList.remove("lm-mod-hidden"))}hide(e){if(!this._hidden)return e<=0?(clearTimeout(this._timer),this._timer=-1,this._hidden=!0,void this.node.classList.add("lm-mod-hidden")):void(-1===this._timer&&(this._timer=window.setTimeout((()=>{this._timer=-1,this._hidden=!0,this.node.classList.add("lm-mod-hidden")}),e)))}};class t{createTabBar(e){let t=new $m({document:e});return t.addClass("lm-DockPanel-tabBar"),t}createHandle(){let e=document.createElement("div");return e.className="lm-DockPanel-handle",e}}e.Renderer=t,e.defaultRenderer=new t}(Ym||(Ym={})),function(e){e.GOLDEN_RATIO=.618,e.DEFAULT_EDGES={top:12,right:40,bottom:40,left:40},e.LayoutModified=new Ff("layout-modified"),e.isGeneratedTabBarProperty=new Xf.AttachedProperty({name:"isGeneratedTabBar",create:()=>!1}),e.createSingleDocumentConfig=function(e){if(e.isEmpty)return{main:null};let t=Array.from(e.widgets()),i=e.selectedWidgets().next().value,n=i?t.indexOf(i):-1;return{main:{type:"tab-area",widgets:t,currentIndex:n}}},e.findDropTarget=function(e,t,i,n){if(!Af.hitTest(e.node,t,i))return{zone:"invalid",target:null};let s=e.layout;if(s.isEmpty)return{zone:"root-all",target:null};if("multiple-document"===e.mode){let s=e.node.getBoundingClientRect(),r=t-s.left+1,o=i-s.top+1,a=s.right-t,l=s.bottom-i;switch(Math.min(o,a,l,r)){case o:if(od&&l>d&&a>u&&h>u)return{zone:"widget-all",target:r};switch(o/=d,a/=u,l/=d,h/=u,Math.min(o,a,l,h)){case o:c="widget-left";break;case a:c="widget-top";break;case l:c="widget-right";break;case h:c="widget-bottom";break;default:throw"unreachable"}return{zone:c,target:r}},e.getDropRef=function(e){return 0===e.titles.length?null:e.currentTitle?e.currentTitle.owner:e.titles[e.titles.length-1].owner}}(jm||(jm={}));class Gm{constructor(){this._counter=0,this._widgets=[],this._activeWidget=null,this._currentWidget=null,this._numbers=new Map,this._nodes=new Map,this._activeChanged=new zf.Signal(this),this._currentChanged=new zf.Signal(this)}dispose(){if(!(this._counter<0)){this._counter=-1,zf.Signal.clearData(this);for(const e of this._widgets)e.node.removeEventListener("focus",this,!0),e.node.removeEventListener("blur",this,!0);this._activeWidget=null,this._currentWidget=null,this._nodes.clear(),this._numbers.clear(),this._widgets.length=0}}get currentChanged(){return this._currentChanged}get activeChanged(){return this._activeChanged}get isDisposed(){return this._counter<0}get currentWidget(){return this._currentWidget}get activeWidget(){return this._activeWidget}get widgets(){return this._widgets}focusNumber(e){let t=this._numbers.get(e);return void 0===t?-1:t}has(e){return this._numbers.has(e)}add(e){if(this._numbers.has(e))return;let t=e.node.contains(document.activeElement),i=t?this._counter++:-1;this._widgets.push(e),this._numbers.set(e,i),this._nodes.set(e.node,e),e.node.addEventListener("focus",this,!0),e.node.addEventListener("blur",this,!0),e.disposed.connect(this._onWidgetDisposed,this),t&&this._setWidgets(e,e)}remove(e){if(!this._numbers.has(e))return;if(e.disposed.disconnect(this._onWidgetDisposed,this),e.node.removeEventListener("focus",this,!0),e.node.removeEventListener("blur",this,!0),jf.RO.removeFirstOf(this._widgets,e),this._nodes.delete(e.node),this._numbers.delete(e),this._currentWidget!==e)return;let t=this._widgets.filter((e=>-1!==this._numbers.get(e))),i=(0,jf.Fp)(t,((e,t)=>this._numbers.get(e)-this._numbers.get(t)))||null;this._setWidgets(i,null)}handleEvent(e){switch(e.type){case"focus":this._evtFocus(e);break;case"blur":this._evtBlur(e)}}_setWidgets(e,t){let i=this._currentWidget;this._currentWidget=e;let n=this._activeWidget;this._activeWidget=t,i!==e&&this._currentChanged.emit({oldValue:i,newValue:e}),n!==t&&this._activeChanged.emit({oldValue:n,newValue:t})}_evtFocus(e){let t=this._nodes.get(e.currentTarget);t!==this._currentWidget&&this._numbers.set(t,this._counter++),this._setWidgets(t,t)}_evtBlur(e){let t=this._nodes.get(e.currentTarget),i=e.relatedTarget;i&&(t.node.contains(i)||(0,jf.sE)(this._widgets,(e=>e.node.contains(i))))||this._setWidgets(this._currentWidget,null)}_onWidgetDisposed(e){this.remove(e)}}class Zm extends mm{constructor(e={}){super(e),this._dirty=!1,this._rowSpacing=4,this._columnSpacing=4,this._items=[],this._rowStarts=[],this._columnStarts=[],this._rowSizers=[new um],this._columnSizers=[new um],this._box=null,void 0!==e.rowCount&&Wm.reallocSizers(this._rowSizers,e.rowCount),void 0!==e.columnCount&&Wm.reallocSizers(this._columnSizers,e.columnCount),void 0!==e.rowSpacing&&(this._rowSpacing=Wm.clampValue(e.rowSpacing)),void 0!==e.columnSpacing&&(this._columnSpacing=Wm.clampValue(e.columnSpacing))}dispose(){for(const e of this._items){let t=e.widget;e.dispose(),t.dispose()}this._box=null,this._items.length=0,this._rowStarts.length=0,this._rowSizers.length=0,this._columnStarts.length=0,this._columnSizers.length=0,super.dispose()}get rowCount(){return this._rowSizers.length}set rowCount(e){e!==this.rowCount&&(Wm.reallocSizers(this._rowSizers,e),this.parent&&this.parent.fit())}get columnCount(){return this._columnSizers.length}set columnCount(e){e!==this.columnCount&&(Wm.reallocSizers(this._columnSizers,e),this.parent&&this.parent.fit())}get rowSpacing(){return this._rowSpacing}set rowSpacing(e){e=Wm.clampValue(e),this._rowSpacing!==e&&(this._rowSpacing=e,this.parent&&this.parent.fit())}get columnSpacing(){return this._columnSpacing}set columnSpacing(e){e=Wm.clampValue(e),this._columnSpacing!==e&&(this._columnSpacing=e,this.parent&&this.parent.fit())}rowStretch(e){let t=this._rowSizers[e];return t?t.stretch:-1}setRowStretch(e,t){let i=this._rowSizers[e];i&&(t=Wm.clampValue(t),i.stretch!==t&&(i.stretch=t,this.parent&&this.parent.update()))}columnStretch(e){let t=this._columnSizers[e];return t?t.stretch:-1}setColumnStretch(e,t){let i=this._columnSizers[e];i&&(t=Wm.clampValue(t),i.stretch!==t&&(i.stretch=t,this.parent&&this.parent.update()))}*[Symbol.iterator](){for(const e of this._items)yield e.widget}addWidget(e){-1===jf.RO.findFirstIndex(this._items,(t=>t.widget===e))&&(this._items.push(new gm(e)),this.parent&&this.attachWidget(e))}removeWidget(e){let t=jf.RO.findFirstIndex(this._items,(t=>t.widget===e));if(-1===t)return;let i=jf.RO.removeAt(this._items,t);this.parent&&this.detachWidget(e),i.dispose()}init(){super.init();for(const e of this)this.attachWidget(e)}attachWidget(e){this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.BeforeAttach),this.parent.node.appendChild(e.node),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.AfterAttach),this.parent.fit()}detachWidget(e){this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.BeforeDetach),this.parent.node.removeChild(e.node),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.AfterDetach),this.parent.fit()}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}_fit(){for(let e=0,t=this.rowCount;e!e.isHidden));for(let t=0,i=e.length;t({row:0,column:0,rowSpan:1,columnSpan:1}),changed:function(e){e.parent&&e.parent.layout instanceof Zm&&e.parent.fit()}}),e.normalizeConfig=function(e){return{row:Math.max(0,Math.floor(e.row||0)),column:Math.max(0,Math.floor(e.column||0)),rowSpan:Math.max(1,Math.floor(e.rowSpan||0)),columnSpan:Math.max(1,Math.floor(e.columnSpan||0))}},e.clampValue=function(e){return Math.max(0,Math.floor(e))},e.rowSpanCmp=function(t,i){let n=e.cellConfigProperty.get(t.widget),s=e.cellConfigProperty.get(i.widget);return n.rowSpan-s.rowSpan},e.columnSpanCmp=function(t,i){let n=e.cellConfigProperty.get(t.widget),s=e.cellConfigProperty.get(i.widget);return n.columnSpan-s.columnSpan},e.reallocSizers=function(e,t){for(t=Math.max(1,Math.floor(t));e.lengtht&&(e.length=t)},e.distributeMin=function(e,t,i,n){if(i=n)return;let r=(n-s)/(i-t+1);for(let n=t;n<=i;++n)e[n].minSize+=r}}(Wm||(Wm={}));class Km extends fm{constructor(e={}){super({node:Vm.createNode()}),this._activeIndex=-1,this._tabFocusIndex=0,this._menus=[],this._childMenu=null,this._overflowMenu=null,this._menuItemSizes=[],this._overflowIndex=-1,this.addClass("lm-MenuBar"),this.setFlag(fm.Flag.DisallowLayout),this.renderer=e.renderer||Km.defaultRenderer,this._forceItemsPosition=e.forceItemsPosition||{forceX:!0,forceY:!0},this._overflowMenuOptions=e.overflowMenuOptions||{isVisible:!0}}dispose(){this._closeChildMenu(),this._menus.length=0,super.dispose()}get childMenu(){return this._childMenu}get overflowIndex(){return this._overflowIndex}get overflowMenu(){return this._overflowMenu}get contentNode(){return this.node.getElementsByClassName("lm-MenuBar-content")[0]}get activeMenu(){return this._menus[this._activeIndex]||null}set activeMenu(e){this.activeIndex=e?this._menus.indexOf(e):-1}get activeIndex(){return this._activeIndex}set activeIndex(e){(e<0||e>=this._menus.length)&&(e=-1),this._activeIndex!==e&&(this._activeIndex=e,-1!==e&&(this._tabFocusIndex=e),this._activeIndex>=0&&this.contentNode.childNodes[this._activeIndex]&&this.contentNode.childNodes[this._activeIndex].focus(),this.update())}get menus(){return this._menus}openActiveMenu(){-1!==this._activeIndex&&(this._openChildMenu(),this._childMenu&&(this._childMenu.activeIndex=-1,this._childMenu.activateNextItem()))}addMenu(e,t=!0){this.insertMenu(this._menus.length,e,t)}insertMenu(e,t,i=!0){this._closeChildMenu();let n=this._menus.indexOf(t),s=Math.max(0,Math.min(e,this._menus.length));if(-1===n)return jf.RO.insert(this._menus,s,t),t.addClass("lm-MenuBar-menu"),t.aboutToClose.connect(this._onMenuAboutToClose,this),t.menuRequested.connect(this._onMenuMenuRequested,this),t.title.changed.connect(this._onTitleChanged,this),void(i&&this.update());s===this._menus.length&&s--,n!==s&&(jf.RO.move(this._menus,n,s),i&&this.update())}removeMenu(e,t=!0){this.removeMenuAt(this._menus.indexOf(e),t)}removeMenuAt(e,t=!0){this._closeChildMenu();let i=jf.RO.removeAt(this._menus,e);i&&(i.aboutToClose.disconnect(this._onMenuAboutToClose,this),i.menuRequested.disconnect(this._onMenuMenuRequested,this),i.title.changed.disconnect(this._onTitleChanged,this),i.removeClass("lm-MenuBar-menu"),t&&this.update())}clearMenus(){if(0!==this._menus.length){this._closeChildMenu();for(let e of this._menus)e.aboutToClose.disconnect(this._onMenuAboutToClose,this),e.menuRequested.disconnect(this._onMenuMenuRequested,this),e.title.changed.disconnect(this._onTitleChanged,this),e.removeClass("lm-MenuBar-menu");this._menus.length=0,this.update()}}handleEvent(e){switch(e.type){case"keydown":this._evtKeyDown(e);break;case"mousedown":this._evtMouseDown(e);break;case"mousemove":this._evtMouseMove(e);break;case"mouseleave":this._evtMouseLeave(e);break;case"contextmenu":e.preventDefault(),e.stopPropagation()}}onBeforeAttach(e){this.node.addEventListener("keydown",this),this.node.addEventListener("mousedown",this),this.node.addEventListener("mousemove",this),this.node.addEventListener("mouseleave",this),this.node.addEventListener("contextmenu",this)}onAfterDetach(e){this.node.removeEventListener("keydown",this),this.node.removeEventListener("mousedown",this),this.node.removeEventListener("mousemove",this),this.node.removeEventListener("mouseleave",this),this.node.removeEventListener("contextmenu",this),this._closeChildMenu()}onActivateRequest(e){this.isAttached&&(this.activeIndex=0)}onResize(e){this.update(),super.onResize(e)}onUpdateRequest(e){var t;let i=this._menus,n=this.renderer,s=this._activeIndex,r=this._tabFocusIndex>=0&&this._tabFocusIndex-1?this._overflowIndex:i.length,a=0,l=!1;o=null!==this._overflowMenu?o-1:o;let h=new Array(o);for(let e=0;e{this.activeIndex=e}}),a+=this._menuItemSizes[e],i[e].title.label===this._overflowMenuOptions.title&&(l=!0,o--);if(this._overflowMenuOptions.isVisible)if(this._overflowIndex>-1&&!l){if(null===this._overflowMenu){const e=null!==(t=this._overflowMenuOptions.title)&&void 0!==t?t:"...";this._overflowMenu=new Nm({commands:new lm}),this._overflowMenu.title.label=e,this._overflowMenu.title.mnemonic=0,this.addMenu(this._overflowMenu,!1)}for(let e=i.length-2;e>=o;e--){const t=this.menus[e];t.title.mnemonic=0,this._overflowMenu.insertItem(0,{type:"submenu",submenu:t}),this.removeMenu(t,!1)}h[o]=n.renderItem({title:this._overflowMenu.title,active:o===s&&0!==i[o].items.length,tabbable:o===r,onfocus:()=>{this.activeIndex=o}}),o++}else if(null!==this._overflowMenu){let e=this._overflowMenu.items,t=this.node.offsetWidth,s=this._overflowMenu.items.length;for(let l=0;lthis._menuItemSizes[s]){let t=e[0].submenu;this._overflowMenu.removeItemAt(0),this.insertMenu(o,t,!1),h[o]=n.renderItem({title:t.title,active:!1,tabbable:o===r,onfocus:()=>{this.activeIndex=o}}),o++}}0===this._overflowMenu.items.length&&(this.removeMenu(this._overflowMenu,!1),h.pop(),this._overflowMenu=null,this._overflowIndex=-1)}im.render(h,this.contentNode),this._updateOverflowIndex()}_updateOverflowIndex(){if(!this._overflowMenuOptions.isVisible)return;const e=this.contentNode.childNodes;let t=this.node.offsetWidth,i=0,n=-1,s=e.length;if(0==this._menuItemSizes.length)for(let r=0;rt&&-1===n&&(n=r)}else for(let e=0;et){n=e;break}this._overflowIndex=n}_evtKeyDown(e){let t=e.keyCode;if(9===t)return void(this.activeIndex=-1);if(e.preventDefault(),e.stopPropagation(),13===t||32===t||38===t||40===t)return void this.openActiveMenu();if(27===t)return this._closeChildMenu(),this.activeIndex=-1,void this.node.blur();if(37===t){let e=this._activeIndex,t=this._menus.length;return void(this.activeIndex=0===e?t-1:e-1)}if(39===t){let e=this._activeIndex,t=this._menus.length;return void(this.activeIndex=e===t-1?0:e+1)}let i=Zf().keyForKeydownEvent(e);if(!i)return;let n=this._activeIndex+1,s=Vm.findMnemonic(this._menus,i,n);-1===s.index||s.multiple?-1!==s.index?this.activeIndex=s.index:-1!==s.auto&&(this.activeIndex=s.auto):(this.activeIndex=s.index,this.openActiveMenu())}_evtMouseDown(e){if(!Af.hitTest(this.node,e.clientX,e.clientY))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();let t=jf.RO.findFirstIndex(this.contentNode.children,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(-1!==t){if(0===e.button)if(this._childMenu)this._closeChildMenu(),this.activeIndex=t;else{const e=this._positionForMenu(t);Nm.saveWindowData(),this.activeIndex=t,this._openChildMenu(e)}}else this._closeChildMenu()}_evtMouseMove(e){let t=jf.RO.findFirstIndex(this.contentNode.children,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(t===this._activeIndex)return;if(-1===t&&this._childMenu)return;const i=t>=0&&this._childMenu?this._positionForMenu(t):null;Nm.saveWindowData(),this.activeIndex=t,i&&this._openChildMenu(i)}_positionForMenu(e){let t=this.contentNode.children[e],{left:i,bottom:n}=t.getBoundingClientRect();return{top:n,left:i}}_evtMouseLeave(e){this._childMenu||(this.activeIndex=-1)}_openChildMenu(e={}){let t=this.activeMenu;if(!t)return void this._closeChildMenu();let i=this._childMenu;if(i===t)return;this._childMenu=t,i?i.close():document.addEventListener("mousedown",this,!0),Lf.sendMessage(this,fm.Msg.UpdateRequest);let{left:n,top:s}=e;void 0!==n&&void 0!==s||({left:n,top:s}=this._positionForMenu(this._activeIndex)),i||this.addClass("lm-mod-active"),t.items.length>0&&t.open(n,s,this._forceItemsPosition)}_closeChildMenu(){if(!this._childMenu)return;this.removeClass("lm-mod-active"),document.removeEventListener("mousedown",this,!0);let e=this._childMenu;this._childMenu=null,e.close(),this.activeIndex=-1}_onMenuAboutToClose(e){e===this._childMenu&&(this.removeClass("lm-mod-active"),document.removeEventListener("mousedown",this,!0),this._childMenu=null,this.activeIndex=-1)}_onMenuMenuRequested(e,t){if(e!==this._childMenu)return;let i=this._activeIndex,n=this._menus.length;switch(t){case"next":this.activeIndex=i===n-1?0:i+1;break;case"previous":this.activeIndex=0===i?n-1:i-1}this.openActiveMenu()}_onTitleChanged(){this.update()}}!function(e){class t{renderItem(e){let t=this.createItemClass(e),i=this.createItemDataset(e),n=this.createItemARIA(e);return dm.li({className:t,dataset:i,tabindex:e.tabbable?"0":"-1",onfocus:e.onfocus,...n},this.renderIcon(e),this.renderLabel(e))}renderIcon(e){let t=this.createIconClass(e);return dm.div({className:t},e.title.icon,e.title.iconLabel)}renderLabel(e){let t=this.formatLabel(e);return dm.div({className:"lm-MenuBar-itemLabel"},t)}createItemClass(e){let t="lm-MenuBar-item";return e.title.className&&(t+=` ${e.title.className}`),e.active&&(t+=" lm-mod-active"),t}createItemDataset(e){return e.title.dataset}createItemARIA(e){return{role:"menuitem","aria-haspopup":"true"}}createIconClass(e){let t="lm-MenuBar-itemIcon",i=e.title.iconClass;return i?`${t} ${i}`:t}formatLabel(e){let{label:t,mnemonic:i}=e.title;if(i<0||i>=t.length)return t;let n=t.slice(0,i),s=t.slice(i+1),r=t[i];return[n,dm.span({className:"lm-MenuBar-itemMnemonic"},r),s]}}e.Renderer=t,e.defaultRenderer=new t}(Km||(Km={})),function(e){e.createNode=function(){let e=document.createElement("div"),t=document.createElement("ul");return t.className="lm-MenuBar-content",e.appendChild(t),t.setAttribute("role","menubar"),e},e.findMnemonic=function(e,t,i){let n=-1,s=-1,r=!1,o=t.toUpperCase();for(let t=0,a=e.length;t=0&&c1&&this.widgets.forEach((e=>{e.hiddenMode=this._hiddenMode})))}dispose(){for(const e of this._items)e.dispose();this._box=null,this._items.length=0,super.dispose()}attachWidget(e,t){this._hiddenMode===fm.HiddenMode.Scale&&this._items.length>0?(1===this._items.length&&(this.widgets[0].hiddenMode=fm.HiddenMode.Scale),t.hiddenMode=fm.HiddenMode.Scale):t.hiddenMode=fm.HiddenMode.Display,jf.RO.insert(this._items,e,new gm(t)),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeAttach),this.parent.node.appendChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterAttach),this.parent.fit()}moveWidget(e,t,i){jf.RO.move(this._items,e,t),this.parent.update()}detachWidget(e,t){let i=jf.RO.removeAt(this._items,e);this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeDetach),this.parent.node.removeChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterDetach),i.widget.node.style.zIndex="",this._hiddenMode===fm.HiddenMode.Scale&&(t.hiddenMode=fm.HiddenMode.Display,1===this._items.length&&(this._items[0].widget.hiddenMode=fm.HiddenMode.Display)),i.dispose(),this.parent.fit()}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}_fit(){let e=0,t=0;for(let i=0,n=this._items.length;i{t.newValue!==this.currentWidget&&(i.current=t.newValue)}),this),i.added.connect(((e,t)=>{this._widgetAdded.emit(t)}),this),i.currentChanged.connect(((e,n)=>{null===n&&t.currentWidget?i.current=t.currentWidget:(this.onCurrentChanged(n),this._currentChanged.emit(n))}),this),i.updated.connect(((e,t)=>{this._widgetUpdated.emit(t)}),this)}get currentChanged(){return this._currentChanged}get currentWidget(){return this._pool.current||null}get restored(){return this._deferred?Promise.resolve():this._pool.restored}get size(){return this._pool.size}get widgetAdded(){return this._widgetAdded}get widgetUpdated(){return this._widgetUpdated}async add(e){this._focusTracker.add(e),await this._pool.add(e),this._focusTracker.activeWidget||(this._pool.current=e)}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,this._pool.dispose(),this._focusTracker.dispose(),zf.Signal.clearData(this))}find(e){return this._pool.find(e)}forEach(e){return this._pool.forEach(e)}filter(e){return this._pool.filter(e)}inject(e){return this._pool.inject(e)}has(e){return this._pool.has(e)}async restore(e){const t=this._deferred;return t?(this._deferred=null,this._pool.restore(t)):e?this._pool.restore(e):void console.warn("No options provided to restore the tracker.")}defer(e){this._deferred=e}async save(e){return this._pool.save(e)}onCurrentChanged(e){}}function tg(e){return e.replace("-","_")}class ig{constructor(e){e=e||{},this._defaults={domain:"messages",locale:document.documentElement.getAttribute("lang")||"en",pluralFunc:function(e){return{nplurals:2,plural:1!=e?1:0}},contextDelimiter:String.fromCharCode(4),stringsPrefix:""},this._locale=(e.locale||this._defaults.locale).replace("_","-"),this._domain=tg(e.domain||this._defaults.domain),this._contextDelimiter=e.contextDelimiter||this._defaults.contextDelimiter,this._stringsPrefix=e.stringsPrefix||this._defaults.stringsPrefix,this._pluralFuncs={},this._dictionary={},this._pluralForms={},e.messages&&(this._dictionary[this._domain]={},this._dictionary[this._domain][this._locale]=e.messages),e.pluralForms&&(this._pluralForms[this._locale]=e.pluralForms)}setContextDelimiter(e){this._contextDelimiter=e}getContextDelimiter(){return this._contextDelimiter}setLocale(e){this._locale=e.replace("_","-")}getLocale(){return this._locale}setDomain(e){this._domain=tg(e)}getDomain(){return this._domain}setStringsPrefix(e){this._stringsPrefix=e}getStringsPrefix(){return this._stringsPrefix}static strfmt(e,...t){return e.replace(/%%/g,"%% ").replace(/%(\d+)/g,(function(e,i){return t[i-1]})).replace(/%% /g,"%")}loadJSON(e,t){if(!e[""]||!e[""].language||!e[""].pluralForms)throw new Error(`Wrong jsonData, it must have an empty key ("") with "language" and "pluralForms" information: ${e}`);t=tg(t);let i=e[""],n=JSON.parse(JSON.stringify(e));delete n[""],this.setMessages(t||this._defaults.domain,i.language,n,i.pluralForms)}__(e,...t){return this.gettext(e,...t)}_n(e,t,i,...n){return this.ngettext(e,t,i,...n)}_p(e,t,...i){return this.pgettext(e,t,...i)}_np(e,t,i,n,...s){return this.npgettext(e,t,i,n,...s)}gettext(e,...t){return this.dcnpgettext("","",e,"",0,...t)}ngettext(e,t,i,...n){return this.dcnpgettext("","",e,t,i,...n)}pgettext(e,t,...i){return this.dcnpgettext("",e,t,"",0,...i)}npgettext(e,t,i,n,...s){return this.dcnpgettext("",e,t,i,n,...s)}dcnpgettext(e,t,i,n,s,...r){let o;e=tg(e)||this._domain;let a=t?t+this._contextDelimiter+i:i,l={pluralForm:!1},h=!1,c=this._locale,d=this.expandLocale(this._locale);for(let t in d)if(c=d[t],h=this._dictionary[e]&&this._dictionary[e][c]&&this._dictionary[e][c][a],h=n?h&&this._dictionary[e][c][a].length>1:h&&1==this._dictionary[e][c][a].length,h){l.locale=c;break}if(h?o=this._dictionary[e][c][a]:(o=[i],l.pluralFunc=this._defaults.pluralFunc),!n)return this.t(o,s,l,...r);l.pluralForm=!0;let u=h?o:[i,n];return this.t(u,s,l,...r)}expandLocale(e){let t=[e],i=e.lastIndexOf("-");for(;i>0;)e=e.slice(0,i),t.push(e),i=e.lastIndexOf("-");return t}getPluralFunc(e){if(!new RegExp("^\\s*nplurals\\s*=\\s*[0-9]+\\s*;\\s*plural\\s*=\\s*(?:\\s|[-\\?\\|&=!<>+*/%:;n0-9_()])+").test(e))throw new Error(ig.strfmt('The plural form "%1" is not valid',e));return new Function("n","let plural, nplurals; "+e+" return { nplurals: nplurals, plural: (plural === true ? 1 : (plural ? plural : 0)) };")}removeContext(e){return-1!==e.indexOf(this._contextDelimiter)?e.split(this._contextDelimiter)[1]:e}t(e,t,i,...n){if(!i.pluralForm)return this._stringsPrefix+ig.strfmt(this.removeContext(e[0]),...n);let s;return i.pluralFunc?s=i.pluralFunc(t):(this._pluralFuncs[i.locale||""]||(this._pluralFuncs[i.locale||""]=this.getPluralFunc(this._pluralForms[i.locale||""])),s=this._pluralFuncs[i.locale||""](t)),(void 0===!s.plural||s.plural>s.nplurals||e.length<=s.plural)&&(s.plural=0),this._stringsPrefix+ig.strfmt(this.removeContext(e[s.plural]),...[t].concat(n))}setMessages(e,t,i,n){e=tg(e),n&&(this._pluralForms[t]=n),this._dictionary[e]||(this._dictionary[e]={}),this._dictionary[e][t]=i}}const ng=new class{constructor(e){this.languageCode="en",this._languageBundle=e}load(e){return this._languageBundle}}(new class{__(e,...t){return this.gettext(e,...t)}_n(e,t,i,...n){return this.ngettext(e,t,i,...n)}_p(e,t,...i){return this.pgettext(e,t,...i)}_np(e,t,i,n,...s){return this.npgettext(e,t,i,n,...s)}gettext(e,...t){return ig.strfmt(e,...t)}ngettext(e,t,i,...n){return ig.strfmt(1==i?e:t,...[i].concat(n))}pgettext(e,t,...i){return ig.strfmt(t,...i)}npgettext(e,t,i,n,...s){return this.ngettext(t,i,n,...s)}dcnpgettext(e,t,i,n,s,...r){return this.ngettext(i,n,s,...r)}});new Wf.Token("@jupyterlab/translation:ITranslatorConnector","A service to connect to the server translation endpoint."),new Wf.Token("@jupyterlab/translation:ITranslator","A service to translate strings.");const sg="jp-OutputArea-child",rg="jp-OutputArea-output",og="jp-OutputArea-prompt";class ag extends fm{constructor(e){var t,i,n,s;super(),this.outputLengthChanged=new zf.Signal(this),this._onIOPub=e=>{const t=this.model,i=e.header.msg_type;let n;const s=(e.content.transient||{}).display_id;let r;switch(i){case"execute_result":case"display_data":case"stream":case"error":n={...e.content,output_type:i},t.add(n);break;case"clear_output":{const i=e.content.wait;t.clear(i);break}case"update_display_data":if(n={...e.content,output_type:"display_data"},r=this._displayIdMap.get(s),r)for(const e of r)t.set(e,n)}s&&"display_data"===i&&(r=this._displayIdMap.get(s)||[],r.push(t.length-1),this._displayIdMap.set(s,r))},this._onExecuteReply=e=>{const t=this.model,i=e.content;if("ok"!==i.status)return;const n=i&&i.payload;if(!n||!n.length)return;const s=n.filter((e=>"page"===e.source));if(!s.length)return;const r={output_type:"display_data",data:JSON.parse(JSON.stringify(s[0])).data,metadata:{}};t.add(r)},this._displayIdMap=new Map,this._minHeightTimeout=null,this._inputRequested=new zf.Signal(this),this._toggleScrolling=new zf.Signal(this),this._outputTracker=new eg({namespace:Wf.UUID.uuid4()}),this._inputHistoryScope="global",super.layout=new vm,this.addClass("jp-OutputArea"),this.contentFactory=null!==(t=e.contentFactory)&&void 0!==t?t:ag.defaultContentFactory,this.rendermime=e.rendermime,this._maxNumberOutputs=null!==(i=e.maxNumberOutputs)&&void 0!==i?i:1/0,this._translator=null!==(n=e.translator)&&void 0!==n?n:ng,this._inputHistoryScope=null!==(s=e.inputHistoryScope)&&void 0!==s?s:"global";const r=this.model=e.model;for(let e=0;e{$f.KernelMessage.isInputRequestMsg(t)&&this.onInputRequest(t,e)})}get inputRequested(){return this._inputRequested}get maxNumberOutputs(){return this._maxNumberOutputs}set maxNumberOutputs(e){if(e<=0)return void console.warn("OutputArea.maxNumberOutputs must be strictly positive.");const t=this._maxNumberOutputs;this._maxNumberOutputs=e,t{this._toggleScrolling.emit()})),this.node.appendChild(e)}_moveDisplayIdIndices(e,t){this._displayIdMap.forEach((i=>{const n=e+t;for(let s=i.length-1;s>=0;--s){const r=i[s];r>=e&&r=n&&(i[s]-=t)}}))}onStateChanged(e,t){const i=Math.min(this.model.length,this._maxNumberOutputs);if(t){if(t>=this._maxNumberOutputs)return;this._setOutput(t,this.model.get(t))}else for(let e=0;e{this.isDisposed||(this.node.style.minHeight="")}),50)}onInputRequest(e,t){const i=this.contentFactory,n=e.content.prompt,s=e.content.password,r=new Am;r.addClass(sg),r.addClass("jp-OutputArea-stdin-item");const o=i.createOutputPrompt();o.addClass(og),r.addWidget(o);const a=i.createStdin({parent_header:e.header,prompt:n,password:s,future:t,translator:this._translator,inputHistoryScope:this._inputHistoryScope});a.addClass(rg),r.addWidget(a),this.model.length>=this.maxNumberOutputs&&(this.maxNumberOutputs=this.model.length),this.layout.addWidget(r),this._inputRequested.emit(),a.value.then((e=>{this.model.length>=this.maxNumberOutputs&&(this.maxNumberOutputs=this.model.length+1),this.model.add({output_type:"stream",name:"stdin",text:e+"\n"}),r.dispose()}))}_setOutput(e,t){if(e>=this._maxNumberOutputs)return;const i=this.layout.widgets[e],n=i.widgets?i.widgets[1]:i,s=this.rendermime.preferredMimeType(t.data,t.trusted?"any":"ensure");cg.currentPreferredMimetype.get(n)===s&&ag.isIsolated(s,t.metadata)===n instanceof cg.IsolatedRenderer?n.renderModel(t):(this.layout.widgets[e].dispose(),this._insertOutput(e,t))}_insertOutput(e,t){if(e>this._maxNumberOutputs)return;const i=this.layout;if(e===this._maxNumberOutputs){const t=new cg.TrimmedOutputs(this._maxNumberOutputs,(()=>{const e=this._maxNumberOutputs;this._maxNumberOutputs=1/0,this._showTrimmedOutputs(e)}));i.insertWidget(e,this._wrappedOutput(t))}else{let n=this.createOutputItem(t);n?n.toggleClass("jp-OutputArea-executeResult",null!==t.executionCount):n=new fm,this._outputTracker.has(n)||this._outputTracker.add(n),i.insertWidget(e,n)}}get outputTracker(){return this._outputTracker}_showTrimmedOutputs(e){this.widgets[e].dispose();for(let t=e;t{const t=document.createElement("pre"),n=this._translator.load("jupyterlab");t.textContent=n.__("Javascript Error: %1",e.message),i.node.appendChild(t),i.node.className="lm-Widget jp-RenderedText",i.node.setAttribute("data-mime-type","application/vnd.jupyter.stderr")})),i}_wrappedOutput(e,t=null){const i=new cg.OutputPanel;i.addClass(sg);const n=this.contentFactory.createOutputPrompt();return n.executionCount=t,n.addClass(og),i.addWidget(n),e.addClass(rg),i.addWidget(e),i}}!function(e){e.execute=async function(e,t,i,n){var s;let r=!0;n&&Array.isArray(n.tags)&&-1!==n.tags.indexOf("raises-exception")&&(r=!1);const o={code:e,stop_on_error:r},a=null===(s=i.session)||void 0===s?void 0:s.kernel;if(!a)throw new Error("Session has no kernel.");const l=a.requestExecute(o,!1,n);return t.future=l,l.done},e.isIsolated=function(e,t){const i=t[e];return i&&void 0!==i.isolated?!!i.isolated:!!t.isolated};class t{createOutputPrompt(){return new lg}createStdin(e){return new hg(e)}}e.ContentFactory=t,e.defaultContentFactory=new t}(ag||(ag={}));class lg extends fm{constructor(){super(),this._executionCount=null,this.addClass("jp-OutputPrompt")}get executionCount(){return this._executionCount}set executionCount(e){this._executionCount=e,this.node.textContent=null===e?"":`[${e}]:`}}class hg extends fm{static _historyIx(e,t){const i=hg._history.get(e);if(!i)return;const n=i.length;return t<=0?n+t:void 0}static _historyAt(e,t){const i=hg._history.get(e);if(!i)return;const n=i.length,s=hg._historyIx(e,t);return void 0!==s&&s1e3&&i.shift()}static _historySearch(e,t,i,n=!0){const s=hg._history.get(e),r=s.length,o=hg._historyIx(e,i),a=e=>-1!==e.search(t);if(void 0!==o)if(n){if(0===o)return;const e=s.slice(0,o).findLastIndex(a);if(-1!==e)return e-r}else{if(o>=r-1)return;const e=s.slice(o+1).findIndex(a);if(-1!==e)return e-r+o+1}}constructor(e){var t;super({node:cg.createInputWidgetNode(e.prompt,e.password)}),this._promise=new Wf.PromiseDelegate,this.addClass("jp-Stdin"),this._future=e.future,this._historyIndex=0,this._historyKey="session"===e.inputHistoryScope?e.parent_header.session:"",this._historyPat="",this._parentHeader=e.parent_header,this._password=e.password,this._trans=(null!==(t=e.translator)&&void 0!==t?t:ng).load("jupyterlab"),this._value=e.prompt+" ",this._input=this.node.getElementsByTagName("input")[0],this._input.placeholder=this._trans.__("↑↓ for history. Search history with c-↑/c-↓"),hg._history.has(this._historyKey)||hg._history.set(this._historyKey,[])}get value(){return this._promise.promise.then((()=>this._value))}handleEvent(e){const t=this._input;if("keydown"===e.type)if("Enter"===e.key)this.resetSearch(),this._future.sendInputReply({status:"ok",value:t.value},this._parentHeader),this._password?this._value+="········":(this._value+=t.value,hg._historyPush(this._historyKey,t.value)),this._promise.resolve(void 0);else if("Escape"===e.key)this.resetSearch(),t.blur();else if(!e.ctrlKey||"ArrowUp"!==e.key&&"ArrowDown"!==e.key){if("ArrowUp"===e.key){this.resetSearch();const i=hg._historyAt(this._historyKey,this._historyIndex-1);i&&(0===this._historyIndex&&(this._valueCache=t.value),this._setInputValue(i),--this._historyIndex,e.preventDefault())}else if("ArrowDown"===e.key)if(this.resetSearch(),0===this._historyIndex);else if(-1===this._historyIndex)this._setInputValue(this._valueCache),++this._historyIndex;else{const e=hg._historyAt(this._historyKey,this._historyIndex+1);e&&(this._setInputValue(e),++this._historyIndex)}}else{""===this._historyPat&&(this._historyPat=t.value);const i="ArrowUp"===e.key,n=hg._historySearch(this._historyKey,this._historyPat,this._historyIndex,i);if(void 0!==n){const i=hg._historyAt(this._historyKey,n);void 0!==i&&(0===this._historyIndex&&(this._valueCache=t.value),this._setInputValue(i),this._historyIndex=n,e.preventDefault())}}}resetSearch(){this._historyPat=""}onAfterAttach(e){this._input.addEventListener("keydown",this),this._input.focus()}onBeforeDetach(e){this._input.removeEventListener("keydown",this)}_setInputValue(e){this._input.value=e,this._input.setSelectionRange(e.length,e.length)}}var cg,dg,ug,pg,fg;function mg(e){return"execute_result"===e.output_type}function gg(e){return"display_data"===e.output_type}function vg(e){return"stream"===e.output_type}hg._history=new Map,function(e){e.createInputWidgetNode=function(e,t){const i=document.createElement("div"),n=document.createElement("pre");n.className="jp-Stdin-prompt",n.textContent=e;const s=document.createElement("input");return s.className="jp-Stdin-input",t&&(s.type="password"),i.appendChild(n),n.appendChild(s),i},e.IsolatedRenderer=class extends fm{constructor(e){super({node:document.createElement("iframe")}),this.addClass("jp-mod-isolated"),this._wrapped=e;const t=this.node;t.frameBorder="0",t.scrolling="auto",t.addEventListener("load",(()=>{t.contentDocument.open(),t.contentDocument.write(this._wrapped.node.innerHTML),t.contentDocument.close();const e=t.contentDocument.body;t.style.height=`${e.scrollHeight}px`,t.heightChangeObserver=new ResizeObserver((()=>{t.style.height=`${e.scrollHeight}px`})),t.heightChangeObserver.observe(e)}))}renderModel(e){return this._wrapped.renderModel(e)}},e.currentPreferredMimetype=new Xf.AttachedProperty({name:"preferredMimetype",create:e=>""}),e.OutputPanel=class extends Am{constructor(e){super(e)}_onContext(e){this.node.focus()}onAfterAttach(e){super.onAfterAttach(e),this.node.addEventListener("contextmenu",this._onContext.bind(this))}onBeforeDetach(e){super.onAfterDetach(e),this.node.removeEventListener("contextmenu",this._onContext.bind(this))}},e.TrimmedOutputs=class extends fm{constructor(e,t){const i=document.createElement("div"),n=`The first ${e} are displayed`;i.insertAdjacentHTML("afterbegin",`\n
Show more outputs
\n
`),super({node:i}),this._onClick=t,this.addClass("jp-TrimmedOutputs"),this.addClass("jp-RenderedHTMLCommon")}handleEvent(e){"click"===e.type&&this._onClick(e)}onAfterAttach(e){super.onAfterAttach(e),this.node.addEventListener("click",this)}onBeforeDetach(e){super.onBeforeDetach(e),this.node.removeEventListener("click",this)}}}(cg||(cg={}));class Og{constructor(e={}){if(this._array=[],this._isDisposed=!1,this._changed=new zf.Signal(this),e.values)for(const t of e.values)this._array.push(t);this._itemCmp=e.itemCmp||dg.itemCmp}get type(){return"List"}get changed(){return this._changed}get length(){return this._array.length}get isDisposed(){return this._isDisposed}dispose(){this._isDisposed||(this._isDisposed=!0,zf.Signal.clearData(this),this.clear())}[Symbol.iterator](){return this._array[Symbol.iterator]()}get(e){return this._array[e]}set(e,t){const i=this._array[e];if(void 0===t)throw new Error("Cannot set an undefined item");(0,this._itemCmp)(i,t)||(this._array[e]=t,this._changed.emit({type:"set",oldIndex:e,newIndex:e,oldValues:[i],newValues:[t]}))}push(e){const t=this._array.push(e);return this._changed.emit({type:"add",oldIndex:-1,newIndex:this.length-1,oldValues:[],newValues:[e]}),t}insert(e,t){e===this._array.length?this._array.push(t):jf.RO.insert(this._array,e,t),this._changed.emit({type:"add",oldIndex:-2,newIndex:e,oldValues:[],newValues:[t]})}removeValue(e){const t=this._itemCmp,i=jf.RO.findFirstIndex(this._array,(i=>t(i,e)));return this.remove(i),i}remove(e){const t=jf.RO.removeAt(this._array,e);if(void 0!==t)return this._changed.emit({type:"remove",oldIndex:e,newIndex:-1,newValues:[],oldValues:[t]}),t}clear(){const e=this._array.slice();this._array.length=0,this._changed.emit({type:"remove",oldIndex:0,newIndex:0,newValues:[],oldValues:e})}move(e,t){if(this.length<=1||e===t)return;const i=[this._array[e]];jf.RO.move(this._array,e,t),this._changed.emit({type:"move",oldIndex:e,newIndex:t,oldValues:i,newValues:i})}pushAll(e){const t=this.length;for(const t of e)this._array.push(t);return this._changed.emit({type:"add",oldIndex:-1,newIndex:t,oldValues:[],newValues:Array.from(e)}),this.length}insertAll(e,t){const i=e;for(const i of t)jf.RO.insert(this._array,e++,i);this._changed.emit({type:"add",oldIndex:-2,newIndex:i,oldValues:[],newValues:Array.from(t)})}removeRange(e,t){const i=this._array.slice(e,t);for(let i=e;i{e.push(i)})),e}values(){const e=[];return this._map.forEach(((t,i)=>{e.push(t)})),e}delete(e){const t=this._map.get(e);return this._map.delete(e)&&this._changed.emit({type:"remove",key:e,oldValue:t,newValue:void 0}),t}clear(){const e=this.keys();for(let t=0;te.toJSON())))}_add(e){const t=this._trusted;if(e=Wf.JSONExt.deepCopy(e),fg.normalize(e),vg(e)&&this._lastStream&&e.name===this._lastName&&this.shouldCombine({value:e,lastModel:this.list.get(this.length-1)})){this._lastStream+=e.text,this._lastStream=fg.removeOverwrittenChars(this._lastStream),e.text=this._lastStream;const i=this._createItem({value:e,trusted:t}),n=this.length-1,s=this.list.get(n);return this.list.set(n,i),s.dispose(),this.length}vg(e)&&(e.text=fg.removeOverwrittenChars(e.text));const i=this._createItem({value:e,trusted:t});return vg(e)?(this._lastStream=e.text,this._lastName=e.name):this._lastStream="",this.list.push(i)}shouldCombine(e){return!0}_createItem(e){return this.contentFactory.createOutputModel(e)}_onListChanged(e,t){switch(t.type){case"add":t.newValues.forEach((e=>{e.changed.connect(this._onGenericChange,this)}));break;case"remove":t.oldValues.forEach((e=>{e.changed.disconnect(this._onGenericChange,this)}));break;case"set":t.newValues.forEach((e=>{e.changed.connect(this._onGenericChange,this)})),t.oldValues.forEach((e=>{e.changed.disconnect(this._onGenericChange,this)}))}this._changed.emit(t)}_onGenericChange(e){let t,i=null;for(t=0;t-1;){const t=e.match(/^(.*)\r+/m)[1];let i=e.match(/\r+(.*)$/m)[1];i+=t.slice(i.length,t.length),e=e.replace(/\r+.*$/m,"\r").replace(/^.*\r/m,i)}return e}(function(e){let t=e;do{t=(e=t).replace(/[^\n]\x08/gm,"")}while(t.length{const n=e[t],s=e[i];return n.rank!==s.rank?n.rank-s.rank:n.id-s.id}))}}(Pg||(Pg={}));var Rg=__webpack_require__(6145),Dg=__webpack_require__.n(Rg);const Ig=/(\$\$?|\\(?:begin|end)\{[a-z]*\*?\}|\\[{}$]|[{}]|(?:\n\s*)+|@@\d+@@|\\\\(?:\(|\)|\[|\]))/i;function qg(e,t,i,n,s){let r=s.slice(e,t+1).join("").replace(/&/g,"&").replace(//g,">");for(navigator&&"Microsoft Internet Explorer"===navigator.appName&&(r=r.replace(/(%[^\n]*)\n/g,"$1
\n"));t>e;)s[t]="",t--;return s[e]="@@"+n.length+"@@",i&&(r=i(r)),n.push(r),s}function Lg(e){let{host:t,source:i,trusted:n,sanitizer:s,resolver:r,linkHandler:o,shouldTypeset:a,latexTypesetter:l,translator:h}=e;h=h||ng;const c=null==h?void 0:h.load("jupyterlab");let d,u=i;if(!i)return t.textContent="",Promise.resolve(void 0);if(n||(u=`${i}`,i=s.sanitize(i)),t.innerHTML=i,t.getElementsByTagName("script").length>0)if(n)zg.evalInnerHTMLScriptTags(t);else{const e=document.createElement("div"),i=document.createElement("pre");i.textContent=c.__("This HTML output contains inline scripts. Are you sure that you want to run arbitrary Javascript within your JupyterLab session?");const n=document.createElement("button");n.textContent=c.__("Run"),n.onclick=e=>{t.innerHTML=u,zg.evalInnerHTMLScriptTags(t),t.firstChild&&t.removeChild(t.firstChild)},e.appendChild(i),e.appendChild(n),t.insertBefore(e,t.firstChild)}return zg.handleDefaults(t,r),d=r?zg.handleUrls(t,r,o):Promise.resolve(void 0),d.then((()=>{a&&l&&l.typeset(t)}))}async function Ng(e){const{host:t,source:i,markdownParser:n,...s}=e;if(!i)return void(t.textContent="");let r="";if(n){const e=function(e){const t=[];let i,n=null,s=null,r=null,o=0;e.includes("`")||e.includes("~~~")?(e=e.replace(/~/g,"~T").replace(/^(?`{3,}|(~T){3,})[^`\n]*\n([\s\S]*?)^\k`*$/gm,(e=>e.replace(/\$/g,"~D"))).replace(/(^|[^\\])(`+)([^\n]*?[^`\n])\2(?!`)/gm,(e=>e.replace(/\$/g,"~D"))),i=e=>e.replace(/~([TD])/g,((e,t)=>"T"===t?"~":"$"))):i=e=>e;let a=e.replace(/\r\n?/g,"\n").split(Ig);for(let e=1,l=a.length;e{let i=a[t];return"\\\\("===i.substr(0,3)&&"\\\\)"===i.substr(i.length-3)?i="\\("+i.substring(3,i.length-3)+"\\)":"\\\\["===i.substr(0,3)&&"\\\\]"===i.substr(i.length-3)&&(i="\\["+i.substring(3,i.length-3)+"\\]"),i}))}else r=`
${i}
`;var o,a;await Lg({host:t,source:r,...s}),zg.headerAnchors(t)}function Bg(e,t){var i,n;const s=e.cloneNode();s.textContent=null===(i=e.textContent)||void 0===i?void 0:i.slice(0,t);const r=e.cloneNode();return r.textContent=null===(n=e.textContent)||void 0===n?void 0:n.slice(t),{pre:s,post:r}}function*$g(e){var t;let i,n=0;for(let s of e)i=n+((null===(t=s.textContent)||void 0===t?void 0:t.length)||0),yield{node:s,start:n,end:i,isText:s.nodeType===Node.TEXT_NODE},n=i}function Qg(e){var t,i;const{host:n,sanitizer:s,source:r}=e,o=s.sanitize(zg.ansiSpan(r),{allowedTags:["span"]}),a=document.createElement("pre"),l=document.createElement("pre");l.innerHTML=o;const h=l.textContent;if(h){const e=null===(i=null===(t=s.getAutolink)||void 0===t?void 0:t.call(s))||void 0===i||i?function(e){const t="\\u0000-\\u0020\\u007f-\\u009f",i=new RegExp("(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\\/\\/|data:|www\\.)[^\\s"+t+'"]{2,}[^\\s'+t+"\"'(){}\\[\\],:;.!?]","ug"),n=[];let s,r=0;for(;null!=(s=i.exec(e));){s.index!==r&&n.push(document.createTextNode(e.slice(r,s.index)));let t=s[0];const i=t.slice(-1),o=-1!==[">","<"].indexOf(i)?t.length-1:t.length,a=document.createElement("a");t=t.slice(0,o),a.href=t.startsWith("www.")?"https://"+t:t,a.rel="noopener",a.target="_blank",a.appendChild(document.createTextNode(t.slice(0,o))),n.push(a),r=s.index+o}return r!==e.length&&n.push(document.createTextNode(e.slice(r,e.length))),n}(h):[document.createTextNode(o)];let n=!1;const r=[],c=Array.from(l.childNodes);for(let t of function*(e,t){var i,n;let s=$g(e),r=$g(t),o=s.next(),a=r.next();for(;!o.done&&!a.done;){let e=o.value,t=a.value;if(e.isText&&e.start<=t.start&&e.end>=t.end)yield[null,t.node],a=r.next();else if(t.isText&&t.start<=e.start&&t.end>=e.end)yield[e.node,null],o=s.next();else if(e.end===t.end&&e.start===t.start)yield[e.node,t.node],o=s.next(),a=r.next();else if(e.end>t.end){let{pre:n,post:s}=Bg(e.node,t.end-e.start);t.starte.end))throw new Error(`Unexpected intersection: ${JSON.stringify(e)} ${JSON.stringify(t)}`);{let{pre:i,post:r}=Bg(t.node,e.end-t.start);e.start{const s=decodeURIComponent(n);return i&&i.handleLink(e,s,r),t.getDownloadUrl(n)})).then((t=>{e.href=t+r})).catch((t=>{e.href=""}))}e.evalInnerHTMLScriptTags=function(e){const t=Array.from(e.getElementsByTagName("script"));for(const e of t){if(!e.parentNode)continue;const t=document.createElement("script"),i=e.attributes;for(let e=0,n=i.length;e{}))},e.headerAnchors=function(e){const t=["h1","h2","h3","h4","h5","h6"];for(const i of t){const t=e.getElementsByTagName(i);for(let e=0;e"),a.push(e),a.push("")):a.push(e)}}function r(e){let t,i,n;const s=e.shift();if(2===s&&e.length>=3){if(t=e.shift(),i=e.shift(),n=e.shift(),[t,i,n].some((e=>e<0||255=1))throw new RangeError("Invalid extended color specification");{const s=e.shift();if(s<0)throw new RangeError("Color index must be >= 0");if(s<16)return s;if(s<232)t=Math.floor((s-16)/36),t=t>0?55+40*t:0,i=Math.floor((s-16)%36/6),i=i>0?55+40*i:0,n=(s-16)%6,n=n>0?55+40*n:0;else{if(!(s<256))throw new RangeError("Color index must be < 256");t=i=n=10*(s-232)+8}}}return[t,i,n]}e.ansiSpan=function(e){const t=/\x1b\[(.*?)([@-~])/g;let i,n=[],o=[],a=!1,l=!1,h=!1;const c=[],d=[];let u=0;for(e=Dg()(e),e+="";i=t.exec(e);){if("m"===i[2]){const e=i[1].split(";");for(let t=0;t]+xmlns=[^>]+svg")<0&&(i=i.replace("new Vg(e)},{safe:!0,mimeTypes:["text/markdown"],defaultRank:60,createRenderer:e=>new Hg(e)},{safe:!0,mimeTypes:["text/latex"],defaultRank:70,createRenderer:e=>new Ug(e)},{safe:!1,mimeTypes:["image/svg+xml"],defaultRank:80,createRenderer:e=>new Xg(e)},{safe:!0,mimeTypes:["image/bmp","image/png","image/jpeg","image/gif","image/webp"],defaultRank:90,createRenderer:e=>new Fg(e)},{safe:!1,mimeTypes:["text/javascript","application/javascript"],defaultRank:110,createRenderer:e=>new Gg(e)},{safe:!0,mimeTypes:["text/plain","application/vnd.jupyter.stdout","application/vnd.jupyter.stderr"],defaultRank:120,createRenderer:e=>new Yg(e)}];var Kg=function(e,t,i,n){return new(i||(i=Promise))((function(s,r){function o(e){try{l(n.next(e))}catch(e){r(e)}}function a(e){try{l(n.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,a)}l((n=n.apply(e,t||[])).next())}))};const Jg={cell:"manim-binder-cell",input:"manim-binder-input",button:"manim-binder-button",output:"manim-binder-output",wrapper:"manim-binder-wrapper",title:"manim-binder-title",meta:"manim-binder-meta",buttonWrapper:"manim-binder-button-wrapper"};!function(e){let t="ManimCommunity/jupyter_examples",i="main",n=60,s="manim-notebook-kernel",r="python3",o=Jg,a="https://mybinder.org",l=!1,h=null,c=null,d=null,u=null;function p(t){if(void 0!==e){const i=(new Date).getTime()+60*n*1e3,r=JSON.stringify({settings:t,timestamp:i});e.localStorage.setItem(s,r)}const i=$f.ServerConnection.makeSettings(t);return c=new $f.KernelManager({serverSettings:i}),u=new $f.ContentsManager({serverSettings:i}),c.startNew({name:r}).then((e=>e))}function f(e,t="",i=""){const n=document.createElement(e);return n.className=t,n.textContent=i,n}function m(e,t){return Kg(this,void 0,void 0,(function*(){const i=h.requestExecute({code:"from manim import *"});yield i.done,console.log("Import done. Now running code"),e.future=h.requestExecute({code:t}),e.model.add({output_type:"stream",name:"loading",text:"Loading..."}),e.model.clear(!0)}))}function g(n,r){if(h)return n.model.clear(),n.model.add({output_type:"stream",name:"loading",text:"Loading..."}),void m(n,r);const o=a.split("//")[1],c=l?"Reconnecting to":"Launching";n.model.clear(),n.model.add({output_type:"stream",name:"stdout",text:`${c} Docker container on ${o}...`}),new Promise(((n,r)=>function(){if(void 0!==e){const t=e.localStorage.getItem(s);if(t){l=!0;const{settings:i,timestamp:n}=JSON.parse(t);if(n&&(new Date).getTime(){const i=new EventSource(n);i.onerror=e=>{i.close(),t(new Error("Unable to connect to Binder"))};let s=null;i.onmessage=({data:n})=>{const r=JSON.parse(n);if(r.phase&&r.phase!=s&&(s=r.phase.toLowerCase()),"failed"==r.phase)i.close(),t(new Error(r));else if("ready"==r.phase){i.close();const t={baseUrl:r.url,wsUrl:`ws${r.url.slice(4)}`,token:r.token};e(t)}}}))}(t,i,a).then((e=>p(e)))}().then(n).catch(r))).then((e=>{h=e,m(n,r)})).catch((()=>{h=null,void 0!==e&&(l=!1,e.localStorage.removeItem(s)),n.model.clear(),n.model.add({output_type:"stream",name:"failure",text:"Failed to connect to kernel"})}))}e.initManimBinder=function({repo:l,branch:h,storage_expire:c,storage_key:p,kernel_type:m,class_names:v,binder_url:O}={}){t=l||t,i=h||i,n=c||n,s=p||s,r=m||r,o=v||o,a=O||a,function(){const e=document.createElement("style");e.textContent=`\n .${o.wrapper} {\n padding: 10px;\n }\n\n .${o.title} {\n text-align: center;\n display: flex;\n justify-content: space-between;\n }\n\n .${o.meta} {\n font-size: 0.75rem;\n font-weight: 400;\n padding-top: 0.1rem;\n color: #666;\n }\n\n .${o.button} {\n cursor: pointer;\n }\n `,document.head.appendChild(e)}(),[...document.querySelectorAll("[data-manim-binder]")].forEach((t=>function(t){const i=t.getAttribute("data-manim-classname");if(!i)return void console.error("No manim classname provided.");const n=f("div",o.buttonWrapper);t.replaceWith(n);const s=f("button",o.button,"Make interactive");n.appendChild(s),s.addEventListener("click",(s=>{let r=t.textContent||"";r+="\n\n# don't remove below command for run button to work",r+=`\n%manim -qm -v WARNING ${i}`,function(t,i=""){const n=new ag({model:new wg({trusted:!0}),rendermime:new Ag({initialFactories:(d||(d=Zg.filter((t=>!t.mimeTypes.includes("text/latex")||void 0!==e&&e.MathJax))),d)})}),s=f("div",o.wrapper);t.replaceWith(s);const r=f("h4",o.title,"Try out manim!");s.appendChild(r);const l=f("span",o.meta,"Python 3 · via ");r.appendChild(l);const h=f("a","","Binder");h.setAttribute("href",a),l.appendChild(h);const c=f("div",o.cell);s.appendChild(c);const p=f("div",o.input);c.appendChild(p);const m=f("button",o.button,"Run");c.appendChild(m);const v=f("div",o.output);c.appendChild(v),Lf.sendMessage(n,fm.Msg.BeforeAttach),v.appendChild(n.node),Lf.sendMessage(n,fm.Msg.AfterAttach),n.model.changed.connect((()=>{v.querySelectorAll("video").forEach((e=>Kg(this,void 0,void 0,(function*(){console.log("fixing video");const t=e.getAttribute("src");if(!t)return void console.error("no src for the video.");e.style.maxWidth="100%";const i=yield u.get(t);if(!i.mimetype.startsWith("video/"))return void console.error("not a video");const n=atob(i.content),s=new ArrayBuffer(n.length),r=new Uint8Array(s);for(let e=0;e(g(n,O.state.doc.toString()),!0)},{key:"Ctrl-Enter",run:()=>(g(n,O.state.doc.toString()),!0)}]),zs.of([...Cc,...Dh])],parent:p});O.contentDOM.setAttribute("data-enable-grammarly","false"),O.dispatch({changes:{from:0,to:O.state.doc.length,insert:i.trim()}}),m.addEventListener("click",(e=>g(n,O.state.doc.toString())))}(n,r)}))}(t)))}}(window)})()})(); +//# sourceMappingURL=manim-binder.min.js.map diff --git a/docs/source/_static/manim-binder.min.js.LICENSE.txt b/docs/source/_static/manim-binder.min.js.LICENSE.txt new file mode 100644 index 0000000000..fe4c1fe307 --- /dev/null +++ b/docs/source/_static/manim-binder.min.js.LICENSE.txt @@ -0,0 +1,6 @@ +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ diff --git a/docs/source/_static/manim-binder.min.js.map b/docs/source/_static/manim-binder.min.js.map new file mode 100644 index 0000000000..25b36df03d --- /dev/null +++ b/docs/source/_static/manim-binder.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"manim-binder.min.js","mappings":"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CT,IACA,OACA,UACA,UACA,OACA,UACA,QACA,QACA,IACA,MACA,MACA,MACA,aACA,KACA,SACA,SACA,UACA,SACA,OACA,OACA,MACA,WACA,UACA,UACA,OACA,WACA,KACA,MACA,UACA,MACA,MACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,OACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,KACA,IAGA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,MACA,OACA,OACA,QACA,MACA,OACA,KACA,WACA,SACA,SACA,IACA,MACA,WACA,IACA,UACA,IACA,OACA,UACA,SACA,QACA,SACA,OACA,SACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,QACA,KACA,QACA,OACA,KACA,QACA,KACA,IACA,KACA,MACA,QACA,OAIJM,kBAAmB,CACf,IAAK,CACD,QACA,MACA,YACA,SACA,KACA,QACA,WACA,UACA,YACA,OACA,aACA,QACA,QACA,aAGJp7D,EAAG,CACC,YACA,SACA,OACA,WACA,OACA,MACA,QACA,WACA,SACA,QAEJ+8J,KAAM,CACF,YACA,MACA,SACA,OACA,SACA,QACA,YAGJ+P,MAAO,CACH,WACA,WACA,OACA,aACA,QACA,UACA,OAEJE,IAAK,CAAC,OACNr8H,WAAY,CAAC,QACbmgD,GAAI,CAAC,SACL7gD,OAAQ,CACJ,YACA,0BACA,6BACA,WACA,OACA,WACA,OACA,SAEJg9H,OAAQ,CAAC,SAAU,SACnB/E,QAAS,CAAC,SACVpgH,IAAK,CAAC,QAAS,OAAQ,UAAW,OAAQ,SAAU,SACpDqlH,SAAU,CAAC,QAAS,OAAQ,UAAW,OAAQ,SAAU,SACzDl9I,QAAS,CACL,UACA,UACA,WACA,OACA,QACA,aACA,QAEJttB,KAAM,CAAC,SACPygG,IAAK,CAAC,OAAQ,YACdxyD,QAAS,CAAC,QACVn0C,IAAK,CAAC,WACNo0C,IAAK,CAAC,SACNC,GAAI,CAAC,WACLC,SAAU,CAAC,YACX6rG,KAAM,CAAC,QAAS,OAAQ,QACxBzr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","sources":["webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/activitymonitor.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/interfaces.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/pageconfig.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/path.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/signal.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/text.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/time.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/url.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/basemanager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/builder/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/config/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/contents/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/contents/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/event/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/comm.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/default.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/future.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/kernel.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/messages.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/restapi.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/serialize.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/restapi.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/nbconvert/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/serverconnection.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/default.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/restapi.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/session.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/setting/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/shim/ws.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/default.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/restapi.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/terminal.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/user/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/workspace/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/dataconnector.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/interfaces.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/restorablepool.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/statedb.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/tokens.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+algorithm@2.0.1/node_modules/@lumino/algorithm/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+coreutils@2.1.2/node_modules/@lumino/coreutils/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+disposable@2.1.2/node_modules/@lumino/disposable/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+polling@2.1.2/node_modules/@lumino/polling/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+properties@2.0.1/node_modules/@lumino/properties/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+signaling@2.1.2/node_modules/@lumino/signaling/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js","webpack://manim-binder/./node_modules/.pnpm/dom-serializer@1.4.1/node_modules/dom-serializer/lib/foreignNames.js","webpack://manim-binder/./node_modules/.pnpm/dom-serializer@1.4.1/node_modules/dom-serializer/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/domelementtype@2.3.0/node_modules/domelementtype/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/domhandler@4.3.1/node_modules/domhandler/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/domhandler@4.3.1/node_modules/domhandler/lib/node.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/feeds.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/helpers.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/legacy.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/manipulation.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/querying.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/stringify.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/traversal.js","webpack://manim-binder/./node_modules/.pnpm/entities@2.2.0/node_modules/entities/lib/decode.js","webpack://manim-binder/./node_modules/.pnpm/entities@2.2.0/node_modules/entities/lib/decode_codepoint.js","webpack://manim-binder/./node_modules/.pnpm/entities@2.2.0/node_modules/entities/lib/encode.js","webpack://manim-binder/./node_modules/.pnpm/entities@2.2.0/node_modules/entities/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/escape-string-regexp@4.0.0/node_modules/escape-string-regexp/index.js","webpack://manim-binder/./node_modules/.pnpm/htmlparser2@6.1.0/node_modules/htmlparser2/lib/FeedHandler.js","webpack://manim-binder/./node_modules/.pnpm/htmlparser2@6.1.0/node_modules/htmlparser2/lib/Parser.js","webpack://manim-binder/./node_modules/.pnpm/htmlparser2@6.1.0/node_modules/htmlparser2/lib/Tokenizer.js","webpack://manim-binder/./node_modules/.pnpm/htmlparser2@6.1.0/node_modules/htmlparser2/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/is-plain-object@5.0.0/node_modules/is-plain-object/dist/is-plain-object.js","webpack://manim-binder/./node_modules/.pnpm/lodash.escape@4.0.1/node_modules/lodash.escape/index.js","webpack://manim-binder/./node_modules/.pnpm/minimist@1.2.8/node_modules/minimist/index.js","webpack://manim-binder/./node_modules/.pnpm/parse-srcset@1.0.2/node_modules/parse-srcset/src/parse-srcset.js","webpack://manim-binder/./node_modules/.pnpm/path-browserify@1.0.1/node_modules/path-browserify/index.js","webpack://manim-binder/./node_modules/.pnpm/picocolors@1.0.0/node_modules/picocolors/picocolors.browser.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/at-rule.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/comment.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/container.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/css-syntax-error.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/declaration.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/document.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/fromJSON.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/input.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/lazy-result.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/list.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/map-generator.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/no-work-result.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/node.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/parse.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/parser.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/postcss.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/previous-map.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/processor.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/result.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/root.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/rule.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/stringifier.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/stringify.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/symbols.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/tokenize.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/warn-once.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/warning.js","webpack://manim-binder/./node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.js","webpack://manim-binder/./node_modules/.pnpm/requires-port@1.0.0/node_modules/requires-port/index.js","webpack://manim-binder/./node_modules/.pnpm/sanitize-html@2.7.3/node_modules/sanitize-html/index.js","webpack://manim-binder/./node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.js","webpack://manim-binder/./node_modules/.pnpm/nanoid@3.3.6/node_modules/nanoid/non-secure/index.cjs","webpack://manim-binder/webpack/bootstrap","webpack://manim-binder/webpack/runtime/compat get default export","webpack://manim-binder/webpack/runtime/define property getters","webpack://manim-binder/webpack/runtime/global","webpack://manim-binder/webpack/runtime/hasOwnProperty shorthand","webpack://manim-binder/webpack/runtime/make namespace object","webpack://manim-binder/./node_modules/.pnpm/@codemirror+state@6.3.1/node_modules/@codemirror/state/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/style-mod@4.1.0/node_modules/style-mod/src/style-mod.js","webpack://manim-binder/./node_modules/.pnpm/w3c-keyname@2.2.8/node_modules/w3c-keyname/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+view@6.21.4/node_modules/@codemirror/view/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lezer+common@1.1.0/node_modules/@lezer/common/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lezer+highlight@1.1.6/node_modules/@lezer/highlight/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+language@6.9.2/node_modules/@codemirror/language/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+commands@6.3.0/node_modules/@codemirror/commands/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/crelt@1.0.6/node_modules/crelt/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+search@6.5.4/node_modules/@codemirror/search/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+autocomplete@6.10.2_@codemirror+language@6.9.2_@codemirror+state@6.3.1_@codemirro_qlo7c5orcxst6mqbb4ug325pdq/node_modules/@codemirror/autocomplete/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+lint@6.4.2/node_modules/@codemirror/lint/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/codemirror@6.0.1_@lezer+common@1.1.0/node_modules/codemirror/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lezer+lr@1.3.13/node_modules/@lezer/lr/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lezer+python@1.1.9/node_modules/@lezer/python/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+lang-python@6.1.3_@codemirror+state@6.3.1_@codemirror+view@6.21.4_@lezer+common@1.1.0/node_modules/@codemirror/lang-python/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+theme-one-dark@6.1.2/node_modules/@codemirror/theme-one-dark/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+domutils@2.0.1/node_modules/@lumino/domutils/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+collections@2.0.1/node_modules/@lumino/collections/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+messaging@2.0.1/node_modules/@lumino/messaging/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+dragdrop@2.1.3/node_modules/@lumino/dragdrop/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+keyboard@2.0.1/node_modules/@lumino/keyboard/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+commands@2.1.3/node_modules/@lumino/commands/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+virtualdom@2.0.1/node_modules/@lumino/virtualdom/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+widgets@2.3.0/node_modules/@lumino/widgets/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+apputils@4.1.7/node_modules/@jupyterlab/apputils/lib/widgettracker.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+translation@4.0.7_react@18.2.0/node_modules/@jupyterlab/translation/lib/utils.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+translation@4.0.7_react@18.2.0/node_modules/@jupyterlab/translation/lib/gettext.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+translation@4.0.7_react@18.2.0/node_modules/@jupyterlab/translation/lib/base.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+translation@4.0.7_react@18.2.0/node_modules/@jupyterlab/translation/lib/tokens.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+outputarea@4.0.7_react@18.2.0/node_modules/@jupyterlab/outputarea/lib/widget.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+observables@5.0.7/node_modules/@jupyterlab/observables/lib/observablelist.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+observables@5.0.7/node_modules/@jupyterlab/observables/lib/observablemap.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/outputmodel.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+outputarea@4.0.7_react@18.2.0/node_modules/@jupyterlab/outputarea/lib/model.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+nbformat@4.0.7/node_modules/@jupyterlab/nbformat/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+observables@5.0.7/node_modules/@jupyterlab/observables/lib/observablejson.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+apputils@4.1.7/node_modules/@jupyterlab/apputils/lib/sanitizer.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/mimemodel.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/registry.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/latex.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/renderers.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/widgets.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/factories.js","webpack://manim-binder/./src/main.ts"],"sourcesContent":["\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ActivityMonitor = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\n/**\n * A class that monitors activity on a signal.\n */\nclass ActivityMonitor {\n /**\n * Construct a new activity monitor.\n */\n constructor(options) {\n this._timer = -1;\n this._timeout = -1;\n this._isDisposed = false;\n this._activityStopped = new signaling_1.Signal(this);\n options.signal.connect(this._onSignalFired, this);\n this._timeout = options.timeout || 1000;\n }\n /**\n * A signal emitted when activity has ceased.\n */\n get activityStopped() {\n return this._activityStopped;\n }\n /**\n * The timeout associated with the monitor, in milliseconds.\n */\n get timeout() {\n return this._timeout;\n }\n set timeout(value) {\n this._timeout = value;\n }\n /**\n * Test whether the monitor has been disposed.\n *\n * #### Notes\n * This is a read-only property.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources used by the activity monitor.\n */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n signaling_1.Signal.clearData(this);\n }\n /**\n * A signal handler for the monitored signal.\n */\n _onSignalFired(sender, args) {\n clearTimeout(this._timer);\n this._sender = sender;\n this._args = args;\n this._timer = setTimeout(() => {\n this._activityStopped.emit({\n sender: this._sender,\n args: this._args\n });\n }, this._timeout);\n }\n}\nexports.ActivityMonitor = ActivityMonitor;\n//# sourceMappingURL=activitymonitor.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/**\n * @packageDocumentation\n * @module coreutils\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./activitymonitor\"), exports);\n__exportStar(require(\"./interfaces\"), exports);\n__exportStar(require(\"./markdowncodeblocks\"), exports);\n__exportStar(require(\"./pageconfig\"), exports);\n__exportStar(require(\"./path\"), exports);\n__exportStar(require(\"./signal\"), exports);\n__exportStar(require(\"./text\"), exports);\n__exportStar(require(\"./time\"), exports);\n__exportStar(require(\"./url\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=interfaces.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MarkdownCodeBlocks = void 0;\n/**\n * The namespace for code block functions which help\n * in extract code from markdown text\n */\nvar MarkdownCodeBlocks;\n(function (MarkdownCodeBlocks) {\n MarkdownCodeBlocks.CODE_BLOCK_MARKER = '```';\n const markdownExtensions = [\n '.markdown',\n '.mdown',\n '.mkdn',\n '.md',\n '.mkd',\n '.mdwn',\n '.mdtxt',\n '.mdtext',\n '.text',\n '.txt',\n '.Rmd'\n ];\n class MarkdownCodeBlock {\n constructor(startLine) {\n this.startLine = startLine;\n this.code = '';\n this.endLine = -1;\n }\n }\n MarkdownCodeBlocks.MarkdownCodeBlock = MarkdownCodeBlock;\n /**\n * Check whether the given file extension is a markdown extension\n * @param extension - A file extension\n *\n * @returns true/false depending on whether this is a supported markdown extension\n */\n function isMarkdown(extension) {\n return markdownExtensions.indexOf(extension) > -1;\n }\n MarkdownCodeBlocks.isMarkdown = isMarkdown;\n /**\n * Construct all code snippets from current text\n * (this could be potentially optimized if we can cache and detect differences)\n * @param text - A string to parse codeblocks from\n *\n * @returns An array of MarkdownCodeBlocks.\n */\n function findMarkdownCodeBlocks(text) {\n if (!text || text === '') {\n return [];\n }\n const lines = text.split('\\n');\n const codeBlocks = [];\n let currentBlock = null;\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n const lineContainsMarker = line.indexOf(MarkdownCodeBlocks.CODE_BLOCK_MARKER) === 0;\n const constructingBlock = currentBlock != null;\n // Skip this line if it is not part of any code block and doesn't contain a marker.\n if (!lineContainsMarker && !constructingBlock) {\n continue;\n }\n // Check if we are already constructing a code block.\n if (!constructingBlock) {\n // Start constructing a new code block.\n currentBlock = new MarkdownCodeBlock(lineIndex);\n // Check whether this is a single line code block of the form ```a = 10```.\n const firstIndex = line.indexOf(MarkdownCodeBlocks.CODE_BLOCK_MARKER);\n const lastIndex = line.lastIndexOf(MarkdownCodeBlocks.CODE_BLOCK_MARKER);\n const isSingleLine = firstIndex !== lastIndex;\n if (isSingleLine) {\n currentBlock.code = line.substring(firstIndex + MarkdownCodeBlocks.CODE_BLOCK_MARKER.length, lastIndex);\n currentBlock.endLine = lineIndex;\n codeBlocks.push(currentBlock);\n currentBlock = null;\n }\n }\n else if (currentBlock) {\n if (lineContainsMarker) {\n // End of block, finish it up.\n currentBlock.endLine = lineIndex - 1;\n codeBlocks.push(currentBlock);\n currentBlock = null;\n }\n else {\n // Append the current line.\n currentBlock.code += line + '\\n';\n }\n }\n }\n return codeBlocks;\n }\n MarkdownCodeBlocks.findMarkdownCodeBlocks = findMarkdownCodeBlocks;\n})(MarkdownCodeBlocks = exports.MarkdownCodeBlocks || (exports.MarkdownCodeBlocks = {}));\n//# sourceMappingURL=markdowncodeblocks.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PageConfig = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nconst minimist_1 = __importDefault(require(\"minimist\"));\nconst url_1 = require(\"./url\");\n/**\n * The namespace for `PageConfig` functions.\n */\nvar PageConfig;\n(function (PageConfig) {\n /**\n * Get global configuration data for the Jupyter application.\n *\n * @param name - The name of the configuration option.\n *\n * @returns The config value or an empty string if not found.\n *\n * #### Notes\n * All values are treated as strings.\n * For browser based applications, it is assumed that the page HTML\n * includes a script tag with the id `jupyter-config-data` containing the\n * configuration as valid JSON. In order to support the classic Notebook,\n * we fall back on checking for `body` data of the given `name`.\n *\n * For node applications, it is assumed that the process was launched\n * with a `--jupyter-config-data` option pointing to a JSON settings\n * file.\n */\n function getOption(name) {\n if (configData) {\n return configData[name] || getBodyData(name);\n }\n configData = Object.create(null);\n let found = false;\n // Use script tag if available.\n if (typeof document !== 'undefined' && document) {\n const el = document.getElementById('jupyter-config-data');\n if (el) {\n configData = JSON.parse(el.textContent || '');\n found = true;\n }\n }\n // Otherwise use CLI if given.\n if (!found && typeof process !== 'undefined' && process.argv) {\n try {\n const cli = (0, minimist_1.default)(process.argv.slice(2));\n const path = require('path');\n let fullPath = '';\n if ('jupyter-config-data' in cli) {\n fullPath = path.resolve(cli['jupyter-config-data']);\n }\n else if ('JUPYTER_CONFIG_DATA' in process.env) {\n fullPath = path.resolve(process.env['JUPYTER_CONFIG_DATA']);\n }\n if (fullPath) {\n // Force Webpack to ignore this require.\n // eslint-disable-next-line\n configData = eval('require')(fullPath);\n }\n }\n catch (e) {\n console.error(e);\n }\n }\n if (!coreutils_1.JSONExt.isObject(configData)) {\n configData = Object.create(null);\n }\n else {\n for (const key in configData) {\n // PageConfig expects strings\n if (typeof configData[key] !== 'string') {\n configData[key] = JSON.stringify(configData[key]);\n }\n }\n }\n return configData[name] || getBodyData(name);\n }\n PageConfig.getOption = getOption;\n /**\n * Set global configuration data for the Jupyter application.\n *\n * @param name - The name of the configuration option.\n * @param value - The value to set the option to.\n *\n * @returns The last config value or an empty string if it doesn't exist.\n */\n function setOption(name, value) {\n const last = getOption(name);\n configData[name] = value;\n return last;\n }\n PageConfig.setOption = setOption;\n /**\n * Get the base url for a Jupyter application, or the base url of the page.\n */\n function getBaseUrl() {\n return url_1.URLExt.normalize(getOption('baseUrl') || '/');\n }\n PageConfig.getBaseUrl = getBaseUrl;\n /**\n * Get the tree url for a JupyterLab application.\n */\n function getTreeUrl() {\n return url_1.URLExt.join(getBaseUrl(), getOption('treeUrl'));\n }\n PageConfig.getTreeUrl = getTreeUrl;\n /**\n * Get the base url for sharing links (usually baseUrl)\n */\n function getShareUrl() {\n return url_1.URLExt.normalize(getOption('shareUrl') || getBaseUrl());\n }\n PageConfig.getShareUrl = getShareUrl;\n /**\n * Get the tree url for shareable links.\n * Usually the same as treeUrl,\n * but overrideable e.g. when sharing with JupyterHub.\n */\n function getTreeShareUrl() {\n return url_1.URLExt.normalize(url_1.URLExt.join(getShareUrl(), getOption('treeUrl')));\n }\n PageConfig.getTreeShareUrl = getTreeShareUrl;\n /**\n * Create a new URL given an optional mode and tree path.\n *\n * This is used to create URLS when the mode or tree path change as the user\n * changes mode or the current document in the main area. If fields in\n * options are omitted, the value in PageConfig will be used.\n *\n * @param options - IGetUrlOptions for the new path.\n */\n function getUrl(options) {\n var _a, _b, _c, _d;\n let path = options.toShare ? getShareUrl() : getBaseUrl();\n const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : getOption('mode');\n const workspace = (_b = options.workspace) !== null && _b !== void 0 ? _b : getOption('workspace');\n const labOrDoc = mode === 'single-document' ? 'doc' : 'lab';\n path = url_1.URLExt.join(path, labOrDoc);\n if (workspace !== PageConfig.defaultWorkspace) {\n path = url_1.URLExt.join(path, 'workspaces', encodeURIComponent((_c = getOption('workspace')) !== null && _c !== void 0 ? _c : PageConfig.defaultWorkspace));\n }\n const treePath = (_d = options.treePath) !== null && _d !== void 0 ? _d : getOption('treePath');\n if (treePath) {\n path = url_1.URLExt.join(path, 'tree', url_1.URLExt.encodeParts(treePath));\n }\n return path;\n }\n PageConfig.getUrl = getUrl;\n PageConfig.defaultWorkspace = 'default';\n /**\n * Get the base websocket url for a Jupyter application, or an empty string.\n */\n function getWsUrl(baseUrl) {\n let wsUrl = getOption('wsUrl');\n if (!wsUrl) {\n baseUrl = baseUrl ? url_1.URLExt.normalize(baseUrl) : getBaseUrl();\n if (baseUrl.indexOf('http') !== 0) {\n return '';\n }\n wsUrl = 'ws' + baseUrl.slice(4);\n }\n return url_1.URLExt.normalize(wsUrl);\n }\n PageConfig.getWsUrl = getWsUrl;\n /**\n * Returns the URL converting this notebook to a certain\n * format with nbconvert.\n */\n function getNBConvertURL({ path, format, download }) {\n const notebookPath = url_1.URLExt.encodeParts(path);\n const url = url_1.URLExt.join(getBaseUrl(), 'nbconvert', format, notebookPath);\n if (download) {\n return url + '?download=true';\n }\n return url;\n }\n PageConfig.getNBConvertURL = getNBConvertURL;\n /**\n * Get the authorization token for a Jupyter application.\n */\n function getToken() {\n return getOption('token') || getBodyData('jupyterApiToken');\n }\n PageConfig.getToken = getToken;\n /**\n * Get the Notebook version info [major, minor, patch].\n */\n function getNotebookVersion() {\n const notebookVersion = getOption('notebookVersion');\n if (notebookVersion === '') {\n return [0, 0, 0];\n }\n return JSON.parse(notebookVersion);\n }\n PageConfig.getNotebookVersion = getNotebookVersion;\n /**\n * Private page config data for the Jupyter application.\n */\n let configData = null;\n /**\n * Get a url-encoded item from `body.data` and decode it\n * We should never have any encoded URLs anywhere else in code\n * until we are building an actual request.\n */\n function getBodyData(key) {\n if (typeof document === 'undefined' || !document.body) {\n return '';\n }\n const val = document.body.dataset[key];\n if (typeof val === 'undefined') {\n return '';\n }\n return decodeURIComponent(val);\n }\n /**\n * The namespace for page config `Extension` functions.\n */\n let Extension;\n (function (Extension) {\n /**\n * Populate an array from page config.\n *\n * @param key - The page config key (e.g., `deferredExtensions`).\n *\n * #### Notes\n * This is intended for `deferredExtensions` and `disabledExtensions`.\n */\n function populate(key) {\n try {\n const raw = getOption(key);\n if (raw) {\n return JSON.parse(raw);\n }\n }\n catch (error) {\n console.warn(`Unable to parse ${key}.`, error);\n }\n return [];\n }\n /**\n * The collection of deferred extensions in page config.\n */\n Extension.deferred = populate('deferredExtensions');\n /**\n * The collection of disabled extensions in page config.\n */\n Extension.disabled = populate('disabledExtensions');\n /**\n * Returns whether a plugin is deferred.\n *\n * @param id - The plugin ID.\n */\n function isDeferred(id) {\n // Check for either a full plugin id match or an extension\n // name match.\n const separatorIndex = id.indexOf(':');\n let extName = '';\n if (separatorIndex !== -1) {\n extName = id.slice(0, separatorIndex);\n }\n return Extension.deferred.some(val => val === id || (extName && val === extName));\n }\n Extension.isDeferred = isDeferred;\n /**\n * Returns whether a plugin is disabled.\n *\n * @param id - The plugin ID.\n */\n function isDisabled(id) {\n // Check for either a full plugin id match or an extension\n // name match.\n const separatorIndex = id.indexOf(':');\n let extName = '';\n if (separatorIndex !== -1) {\n extName = id.slice(0, separatorIndex);\n }\n return Extension.disabled.some(val => val === id || (extName && val === extName));\n }\n Extension.isDisabled = isDisabled;\n })(Extension = PageConfig.Extension || (PageConfig.Extension = {}));\n})(PageConfig = exports.PageConfig || (exports.PageConfig = {}));\n//# sourceMappingURL=pageconfig.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PathExt = void 0;\nconst path_1 = require(\"path\");\n/**\n * The namespace for path-related functions.\n *\n * Note that Jupyter server paths do not start with a leading slash.\n */\nvar PathExt;\n(function (PathExt) {\n /**\n * Join all arguments together and normalize the resulting path.\n * Arguments must be strings. In v0.8, non-string arguments were silently ignored. In v0.10 and up, an exception is thrown.\n *\n * @param paths - The string paths to join.\n */\n function join(...paths) {\n const path = path_1.posix.join(...paths);\n return path === '.' ? '' : removeSlash(path);\n }\n PathExt.join = join;\n /**\n * Return the last portion of a path. Similar to the Unix basename command.\n * Often used to extract the file name from a fully qualified path.\n *\n * @param path - The path to evaluate.\n *\n * @param ext - An extension to remove from the result.\n */\n function basename(path, ext) {\n return path_1.posix.basename(path, ext);\n }\n PathExt.basename = basename;\n /**\n * Get the directory name of a path, similar to the Unix dirname command.\n * When an empty path is given, returns the root path.\n *\n * @param path - The file path.\n */\n function dirname(path) {\n const dir = removeSlash(path_1.posix.dirname(path));\n return dir === '.' ? '' : dir;\n }\n PathExt.dirname = dirname;\n /**\n * Get the extension of the path.\n *\n * @param path - The file path.\n *\n * @returns the extension of the file.\n *\n * #### Notes\n * The extension is the string from the last occurrence of the `.`\n * character to end of string in the last portion of the path, inclusive.\n * If there is no `.` in the last portion of the path, or if the first\n * character of the basename of path [[basename]] is `.`, then an\n * empty string is returned.\n */\n function extname(path) {\n return path_1.posix.extname(path);\n }\n PathExt.extname = extname;\n /**\n * Normalize a string path, reducing '..' and '.' parts.\n * When multiple slashes are found, they're replaced by a single one; when the path contains a trailing slash, it is preserved. On Windows backslashes are used.\n * When an empty path is given, returns the root path.\n *\n * @param path - The string path to normalize.\n */\n function normalize(path) {\n if (path === '') {\n return '';\n }\n return removeSlash(path_1.posix.normalize(path));\n }\n PathExt.normalize = normalize;\n /**\n * Resolve a sequence of paths or path segments into an absolute path.\n * The root path in the application has no leading slash, so it is removed.\n *\n * @param parts - The paths to join.\n *\n * #### Notes\n * The right-most parameter is considered \\{to\\}. Other parameters are considered an array of \\{from\\}.\n *\n * Starting from leftmost \\{from\\} parameter, resolves \\{to\\} to an absolute path.\n *\n * If \\{to\\} isn't already absolute, \\{from\\} arguments are prepended in right to left order, until an absolute path is found. If after using all \\{from\\} paths still no absolute path is found, the current working directory is used as well. The resulting path is normalized, and trailing slashes are removed unless the path gets resolved to the root directory.\n */\n function resolve(...parts) {\n return removeSlash(path_1.posix.resolve(...parts));\n }\n PathExt.resolve = resolve;\n /**\n * Solve the relative path from \\{from\\} to \\{to\\}.\n *\n * @param from - The source path.\n *\n * @param to - The target path.\n *\n * #### Notes\n * If from and to each resolve to the same path (after calling\n * path.resolve() on each), a zero-length string is returned.\n * If a zero-length string is passed as from or to, `/`\n * will be used instead of the zero-length strings.\n */\n function relative(from, to) {\n return removeSlash(path_1.posix.relative(from, to));\n }\n PathExt.relative = relative;\n /**\n * Normalize a file extension to be of the type `'.foo'`.\n *\n * @param extension - the file extension.\n *\n * #### Notes\n * Adds a leading dot if not present and converts to lower case.\n */\n function normalizeExtension(extension) {\n if (extension.length > 0 && extension.indexOf('.') !== 0) {\n extension = `.${extension}`;\n }\n return extension;\n }\n PathExt.normalizeExtension = normalizeExtension;\n /**\n * Remove the leading slash from a path.\n *\n * @param path: the path from which to remove a leading slash.\n */\n function removeSlash(path) {\n if (path.indexOf('/') === 0) {\n path = path.slice(1);\n }\n return path;\n }\n PathExt.removeSlash = removeSlash;\n})(PathExt = exports.PathExt || (exports.PathExt = {}));\n//# sourceMappingURL=path.js.map","\"use strict\";\n/*\n * Copyright (c) Jupyter Development Team.\n * Distributed under the terms of the Modified BSD License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.signalToPromise = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\n/**\n * Convert a signal into a promise for the first emitted value.\n *\n * @param signal - The signal we are listening to.\n * @param timeout - Timeout to wait for signal in ms (not timeout if not defined or 0)\n *\n * @returns a Promise that resolves with a `(sender, args)` pair.\n */\nfunction signalToPromise(signal, timeout) {\n const waitForSignal = new coreutils_1.PromiseDelegate();\n function cleanup() {\n signal.disconnect(slot);\n }\n function slot(sender, args) {\n cleanup();\n waitForSignal.resolve([sender, args]);\n }\n signal.connect(slot);\n if ((timeout !== null && timeout !== void 0 ? timeout : 0) > 0) {\n setTimeout(() => {\n cleanup();\n waitForSignal.reject(`Signal not emitted within ${timeout} ms.`);\n }, timeout);\n }\n return waitForSignal.promise;\n}\nexports.signalToPromise = signalToPromise;\n//# sourceMappingURL=signal.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Text = void 0;\n/**\n * The namespace for text-related functions.\n */\nvar Text;\n(function (Text) {\n // javascript stores text as utf16 and string indices use \"code units\",\n // which stores high-codepoint characters as \"surrogate pairs\",\n // which occupy two indices in the javascript string.\n // We need to translate cursor_pos in the Jupyter protocol (in characters)\n // to js offset (with surrogate pairs taking two spots).\n const HAS_SURROGATES = '𝐚'.length > 1;\n /**\n * Convert a javascript string index into a unicode character offset\n *\n * @param jsIdx - The javascript string index (counting surrogate pairs)\n *\n * @param text - The text in which the offset is calculated\n *\n * @returns The unicode character offset\n */\n function jsIndexToCharIndex(jsIdx, text) {\n if (HAS_SURROGATES) {\n // not using surrogates, nothing to do\n return jsIdx;\n }\n let charIdx = jsIdx;\n for (let i = 0; i + 1 < text.length && i < jsIdx; i++) {\n const charCode = text.charCodeAt(i);\n // check for surrogate pair\n if (charCode >= 0xd800 && charCode <= 0xdbff) {\n const nextCharCode = text.charCodeAt(i + 1);\n if (nextCharCode >= 0xdc00 && nextCharCode <= 0xdfff) {\n charIdx--;\n i++;\n }\n }\n }\n return charIdx;\n }\n Text.jsIndexToCharIndex = jsIndexToCharIndex;\n /**\n * Convert a unicode character offset to a javascript string index.\n *\n * @param charIdx - The index in unicode characters\n *\n * @param text - The text in which the offset is calculated\n *\n * @returns The js-native index\n */\n function charIndexToJsIndex(charIdx, text) {\n if (HAS_SURROGATES) {\n // not using surrogates, nothing to do\n return charIdx;\n }\n let jsIdx = charIdx;\n for (let i = 0; i + 1 < text.length && i < jsIdx; i++) {\n const charCode = text.charCodeAt(i);\n // check for surrogate pair\n if (charCode >= 0xd800 && charCode <= 0xdbff) {\n const nextCharCode = text.charCodeAt(i + 1);\n if (nextCharCode >= 0xdc00 && nextCharCode <= 0xdfff) {\n jsIdx++;\n i++;\n }\n }\n }\n return jsIdx;\n }\n Text.charIndexToJsIndex = charIndexToJsIndex;\n /**\n * Given a 'snake-case', 'snake_case', 'snake:case', or\n * 'snake case' string, will return the camel case version: 'snakeCase'.\n *\n * @param str: the snake-case input string.\n *\n * @param upper: default = false. If true, the first letter of the\n * returned string will be capitalized.\n *\n * @returns the camel case version of the input string.\n */\n function camelCase(str, upper = false) {\n return str.replace(/^(\\w)|[\\s-_:]+(\\w)/g, function (match, p1, p2) {\n if (p2) {\n return p2.toUpperCase();\n }\n else {\n return upper ? p1.toUpperCase() : p1.toLowerCase();\n }\n });\n }\n Text.camelCase = camelCase;\n /**\n * Given a string, title case the words in the string.\n *\n * @param str: the string to title case.\n *\n * @returns the same string, but with each word capitalized.\n */\n function titleCase(str) {\n return (str || '')\n .toLowerCase()\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n Text.titleCase = titleCase;\n})(Text = exports.Text || (exports.Text = {}));\n//# sourceMappingURL=text.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Time = void 0;\n/**\n * A list of time units with their associated value in milliseconds.\n */\nconst UNITS = [\n { name: 'years', milliseconds: 365 * 24 * 60 * 60 * 1000 },\n { name: 'months', milliseconds: 30 * 24 * 60 * 60 * 1000 },\n { name: 'days', milliseconds: 24 * 60 * 60 * 1000 },\n { name: 'hours', milliseconds: 60 * 60 * 1000 },\n { name: 'minutes', milliseconds: 60 * 1000 },\n { name: 'seconds', milliseconds: 1000 }\n];\n/**\n * The namespace for date functions.\n */\nvar Time;\n(function (Time) {\n /**\n * Convert a timestring to a human readable string (e.g. 'two minutes ago').\n *\n * @param value - The date timestring or date object.\n *\n * @returns A formatted date.\n */\n function formatHuman(value) {\n const lang = document.documentElement.lang || 'en';\n const formatter = new Intl.RelativeTimeFormat(lang, { numeric: 'auto' });\n const delta = new Date(value).getTime() - Date.now();\n for (let unit of UNITS) {\n const amount = Math.ceil(delta / unit.milliseconds);\n if (amount === 0) {\n continue;\n }\n return formatter.format(amount, unit.name);\n }\n return formatter.format(0, 'seconds');\n }\n Time.formatHuman = formatHuman;\n /**\n * Convenient helper to convert a timestring to a date format.\n *\n * @param value - The date timestring or date object.\n *\n * @returns A formatted date.\n */\n function format(value) {\n const lang = document.documentElement.lang || 'en';\n const formatter = new Intl.DateTimeFormat(lang, {\n dateStyle: 'short',\n timeStyle: 'short'\n });\n return formatter.format(new Date(value));\n }\n Time.format = format;\n})(Time = exports.Time || (exports.Time = {}));\n//# sourceMappingURL=time.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URLExt = void 0;\nconst path_1 = require(\"path\");\nconst url_parse_1 = __importDefault(require(\"url-parse\"));\n/**\n * The namespace for URL-related functions.\n */\nvar URLExt;\n(function (URLExt) {\n /**\n * Parse a url into a URL object.\n *\n * @param urlString - The URL string to parse.\n *\n * @returns A URL object.\n */\n function parse(url) {\n if (typeof document !== 'undefined' && document) {\n const a = document.createElement('a');\n a.href = url;\n return a;\n }\n return (0, url_parse_1.default)(url);\n }\n URLExt.parse = parse;\n /**\n * Parse URL and retrieve hostname\n *\n * @param url - The URL string to parse\n *\n * @returns a hostname string value\n */\n function getHostName(url) {\n return (0, url_parse_1.default)(url).hostname;\n }\n URLExt.getHostName = getHostName;\n function normalize(url) {\n return url && parse(url).toString();\n }\n URLExt.normalize = normalize;\n /**\n * Join a sequence of url components and normalizes as in node `path.join`.\n *\n * @param parts - The url components.\n *\n * @returns the joined url.\n */\n function join(...parts) {\n let u = (0, url_parse_1.default)(parts[0], {});\n // Schema-less URL can be only parsed as relative to a base URL\n // see https://github.com/unshiftio/url-parse/issues/219#issuecomment-1002219326\n const isSchemaLess = u.protocol === '' && u.slashes;\n if (isSchemaLess) {\n u = (0, url_parse_1.default)(parts[0], 'https:' + parts[0]);\n }\n const prefix = `${isSchemaLess ? '' : u.protocol}${u.slashes ? '//' : ''}${u.auth}${u.auth ? '@' : ''}${u.host}`;\n // If there was a prefix, then the first path must start at the root.\n const path = path_1.posix.join(`${!!prefix && u.pathname[0] !== '/' ? '/' : ''}${u.pathname}`, ...parts.slice(1));\n return `${prefix}${path === '.' ? '' : path}`;\n }\n URLExt.join = join;\n /**\n * Encode the components of a multi-segment url.\n *\n * @param url - The url to encode.\n *\n * @returns the encoded url.\n *\n * #### Notes\n * Preserves the `'/'` separators.\n * Should not include the base url, since all parts are escaped.\n */\n function encodeParts(url) {\n return join(...url.split('/').map(encodeURIComponent));\n }\n URLExt.encodeParts = encodeParts;\n /**\n * Return a serialized object string suitable for a query.\n *\n * @param object - The source object.\n *\n * @returns an encoded url query.\n *\n * #### Notes\n * Modified version of [stackoverflow](http://stackoverflow.com/a/30707423).\n */\n function objectToQueryString(value) {\n const keys = Object.keys(value).filter(key => key.length > 0);\n if (!keys.length) {\n return '';\n }\n return ('?' +\n keys\n .map(key => {\n const content = encodeURIComponent(String(value[key]));\n return key + (content ? '=' + content : '');\n })\n .join('&'));\n }\n URLExt.objectToQueryString = objectToQueryString;\n /**\n * Return a parsed object that represents the values in a query string.\n */\n function queryStringToObject(value) {\n return value\n .replace(/^\\?/, '')\n .split('&')\n .reduce((acc, val) => {\n const [key, value] = val.split('=');\n if (key.length > 0) {\n acc[key] = decodeURIComponent(value || '');\n }\n return acc;\n }, {});\n }\n URLExt.queryStringToObject = queryStringToObject;\n /**\n * Test whether the url is a local url.\n *\n * #### Notes\n * This function returns `false` for any fully qualified url, including\n * `data:`, `file:`, and `//` protocol URLs.\n */\n function isLocal(url) {\n const { protocol } = parse(url);\n return ((!protocol || url.toLowerCase().indexOf(protocol) !== 0) &&\n url.indexOf('/') !== 0);\n }\n URLExt.isLocal = isLocal;\n})(URLExt = exports.URLExt || (exports.URLExt = {}));\n//# sourceMappingURL=url.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BaseManager = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\nconst serverconnection_1 = require(\"./serverconnection\");\nclass BaseManager {\n constructor(options) {\n var _a;\n this._isDisposed = false;\n this._disposed = new signaling_1.Signal(this);\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n }\n /**\n * A signal emitted when the delegate is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * Test whether the delegate has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Whether the manager is active.\n */\n get isActive() {\n return true;\n }\n /**\n * Dispose of the delegate and invoke the callback function.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._disposed.emit(undefined);\n signaling_1.Signal.clearData(this);\n }\n}\nexports.BaseManager = BaseManager;\n//# sourceMappingURL=basemanager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BuildManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the lab build service.\n */\nconst BUILD_SETTINGS_URL = 'api/build';\n/**\n * The build API service manager.\n */\nclass BuildManager {\n /**\n * Create a new setting manager.\n */\n constructor(options = {}) {\n var _a;\n this._url = '';\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n const { baseUrl, appUrl } = this.serverSettings;\n this._url = coreutils_1.URLExt.join(baseUrl, appUrl, BUILD_SETTINGS_URL);\n }\n /**\n * Test whether the build service is available.\n */\n get isAvailable() {\n return coreutils_1.PageConfig.getOption('buildAvailable').toLowerCase() === 'true';\n }\n /**\n * Test whether to check build status automatically.\n */\n get shouldCheck() {\n return coreutils_1.PageConfig.getOption('buildCheck').toLowerCase() === 'true';\n }\n /**\n * Get whether the application should be built.\n */\n getStatus() {\n const { _url, serverSettings } = this;\n const promise = serverconnection_1.ServerConnection.makeRequest(_url, {}, serverSettings);\n return promise\n .then(response => {\n if (response.status !== 200) {\n throw new serverconnection_1.ServerConnection.ResponseError(response);\n }\n return response.json();\n })\n .then(data => {\n if (typeof data.status !== 'string') {\n throw new Error('Invalid data');\n }\n if (typeof data.message !== 'string') {\n throw new Error('Invalid data');\n }\n return data;\n });\n }\n /**\n * Build the application.\n */\n build() {\n const { _url, serverSettings } = this;\n const init = { method: 'POST' };\n const promise = serverconnection_1.ServerConnection.makeRequest(_url, init, serverSettings);\n return promise.then(response => {\n if (response.status === 400) {\n throw new serverconnection_1.ServerConnection.ResponseError(response, 'Build aborted');\n }\n if (response.status !== 200) {\n const message = `Build failed with ${response.status}.\n\n If you are experiencing the build failure after installing an extension (or trying to include previously installed extension after updating JupyterLab) please check the extension repository for new installation instructions as many extensions migrated to the prebuilt extensions system which no longer requires rebuilding JupyterLab (but uses a different installation procedure, typically involving a package manager such as 'pip' or 'conda').\n\n If you specifically intended to install a source extension, please run 'jupyter lab build' on the server for full output.`;\n throw new serverconnection_1.ServerConnection.ResponseError(response, message);\n }\n });\n }\n /**\n * Cancel an active build.\n */\n cancel() {\n const { _url, serverSettings } = this;\n const init = { method: 'DELETE' };\n const promise = serverconnection_1.ServerConnection.makeRequest(_url, init, serverSettings);\n return promise.then(response => {\n if (response.status !== 204) {\n throw new serverconnection_1.ServerConnection.ResponseError(response);\n }\n });\n }\n}\nexports.BuildManager = BuildManager;\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConfigWithDefaults = exports.ConfigSection = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst __1 = require(\"..\");\n/**\n * The url for the config service.\n */\nconst SERVICE_CONFIG_URL = 'api/config';\n/**\n * The namespace for ConfigSection statics.\n */\nvar ConfigSection;\n(function (ConfigSection) {\n /**\n * Create a config section.\n *\n * @returns A Promise that is fulfilled with the config section is loaded.\n */\n function create(options) {\n const section = new DefaultConfigSection(options);\n return section.load().then(() => {\n return section;\n });\n }\n ConfigSection.create = create;\n})(ConfigSection = exports.ConfigSection || (exports.ConfigSection = {}));\n/**\n * Implementation of the Configurable data section.\n */\nclass DefaultConfigSection {\n /**\n * Construct a new config section.\n */\n constructor(options) {\n var _a;\n this._url = 'unknown';\n const settings = (this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : __1.ServerConnection.makeSettings());\n this._url = coreutils_1.URLExt.join(settings.baseUrl, SERVICE_CONFIG_URL, encodeURIComponent(options.name));\n }\n /**\n * Get the data for this section.\n */\n get data() {\n return this._data;\n }\n /**\n * Load the initial data for this section.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\n async load() {\n const response = await __1.ServerConnection.makeRequest(this._url, {}, this.serverSettings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n this._data = await response.json();\n }\n /**\n * Modify the stored config values.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n *\n * Updates the local data immediately, sends the change to the server,\n * and updates the local data with the response, and fulfils the promise\n * with that data.\n */\n async update(newdata) {\n this._data = { ...this._data, ...newdata };\n const init = {\n method: 'PATCH',\n body: JSON.stringify(newdata)\n };\n const response = await __1.ServerConnection.makeRequest(this._url, init, this.serverSettings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n this._data = await response.json();\n return this._data;\n }\n}\n/**\n * Configurable object with defaults.\n */\nclass ConfigWithDefaults {\n /**\n * Create a new config with defaults.\n */\n constructor(options) {\n var _a, _b;\n this._className = '';\n this._section = options.section;\n this._defaults = (_a = options.defaults) !== null && _a !== void 0 ? _a : {};\n this._className = (_b = options.className) !== null && _b !== void 0 ? _b : '';\n }\n /**\n * Get data from the config section or fall back to defaults.\n */\n get(key) {\n const data = this._classData();\n return key in data ? data[key] : this._defaults[key];\n }\n /**\n * Set a config value.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n *\n * Sends the update to the server, and changes our local copy of the data\n * immediately.\n */\n set(key, value) {\n const d = {};\n d[key] = value;\n if (this._className) {\n const d2 = {};\n d2[this._className] = d;\n return this._section.update(d2);\n }\n else {\n return this._section.update(d);\n }\n }\n /**\n * Get data from the Section with our classname, if available.\n *\n * #### Notes\n * If we have no classname, get all of the data in the Section\n */\n _classData() {\n const data = this._section.data;\n if (this._className && this._className in data) {\n return data[this._className];\n }\n return data;\n }\n}\nexports.ConfigWithDefaults = ConfigWithDefaults;\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Drive = exports.ContentsManager = exports.Contents = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst validate = __importStar(require(\"./validate\"));\n/**\n * The url for the default drive service.\n */\nconst SERVICE_DRIVE_URL = 'api/contents';\n/**\n * The url for the file access.\n */\nconst FILES_URL = 'files';\n/**\n * A namespace for contents interfaces.\n */\nvar Contents;\n(function (Contents) {\n /**\n * Validates an IModel, throwing an error if it does not pass.\n */\n function validateContentsModel(contents) {\n validate.validateContentsModel(contents);\n }\n Contents.validateContentsModel = validateContentsModel;\n /**\n * Validates an ICheckpointModel, throwing an error if it does not pass.\n */\n function validateCheckpointModel(checkpoint) {\n validate.validateCheckpointModel(checkpoint);\n }\n Contents.validateCheckpointModel = validateCheckpointModel;\n})(Contents = exports.Contents || (exports.Contents = {}));\n/**\n * A contents manager that passes file operations to the server.\n * Multiple servers implementing the `IDrive` interface can be\n * attached to the contents manager, so that the same session can\n * perform file operations on multiple backends.\n *\n * This includes checkpointing with the normal file operations.\n */\nclass ContentsManager {\n /**\n * Construct a new contents manager object.\n *\n * @param options - The options used to initialize the object.\n */\n constructor(options = {}) {\n var _a, _b;\n this._isDisposed = false;\n this._additionalDrives = new Map();\n this._fileChanged = new signaling_1.Signal(this);\n const serverSettings = (this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : __1.ServerConnection.makeSettings());\n this._defaultDrive = (_b = options.defaultDrive) !== null && _b !== void 0 ? _b : new Drive({ serverSettings });\n this._defaultDrive.fileChanged.connect(this._onFileChanged, this);\n }\n /**\n * A signal emitted when a file operation takes place.\n */\n get fileChanged() {\n return this._fileChanged;\n }\n /**\n * Test whether the manager has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources held by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n signaling_1.Signal.clearData(this);\n }\n /**\n * Add an `IDrive` to the manager.\n */\n addDrive(drive) {\n this._additionalDrives.set(drive.name, drive);\n drive.fileChanged.connect(this._onFileChanged, this);\n }\n /**\n * Given a path, get a shared model factory from the\n * relevant backend. Returns `null` if the backend\n * does not provide one.\n */\n getSharedModelFactory(path) {\n var _a;\n const [drive] = this._driveForPath(path);\n return (_a = drive === null || drive === void 0 ? void 0 : drive.sharedModelFactory) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Given a path of the form `drive:local/portion/of/it.txt`\n * get the local part of it.\n *\n * @param path: the path.\n *\n * @returns The local part of the path.\n */\n localPath(path) {\n const parts = path.split('/');\n const firstParts = parts[0].split(':');\n if (firstParts.length === 1 || !this._additionalDrives.has(firstParts[0])) {\n return coreutils_1.PathExt.removeSlash(path);\n }\n return coreutils_1.PathExt.join(firstParts.slice(1).join(':'), ...parts.slice(1));\n }\n /**\n * Normalize a global path. Reduces '..' and '.' parts, and removes\n * leading slashes from the local part of the path, while retaining\n * the drive name if it exists.\n *\n * @param path: the path.\n *\n * @returns The normalized path.\n */\n normalize(path) {\n const parts = path.split(':');\n if (parts.length === 1) {\n return coreutils_1.PathExt.normalize(path);\n }\n return `${parts[0]}:${coreutils_1.PathExt.normalize(parts.slice(1).join(':'))}`;\n }\n /**\n * Resolve a global path, starting from the root path. Behaves like\n * posix-path.resolve, with 3 differences:\n * - will never prepend cwd\n * - if root has a drive name, the result is prefixed with \":\"\n * - before adding drive name, leading slashes are removed\n *\n * @param path: the path.\n *\n * @returns The normalized path.\n */\n resolvePath(root, path) {\n const driveName = this.driveName(root);\n const localPath = this.localPath(root);\n const resolved = coreutils_1.PathExt.resolve('/', localPath, path);\n return driveName ? `${driveName}:${resolved}` : resolved;\n }\n /**\n * Given a path of the form `drive:local/portion/of/it.txt`\n * get the name of the drive. If the path is missing\n * a drive portion, returns an empty string.\n *\n * @param path: the path.\n *\n * @returns The drive name for the path, or the empty string.\n */\n driveName(path) {\n const parts = path.split('/');\n const firstParts = parts[0].split(':');\n if (firstParts.length === 1) {\n return '';\n }\n if (this._additionalDrives.has(firstParts[0])) {\n return firstParts[0];\n }\n return '';\n }\n /**\n * Get a file or directory.\n *\n * @param path: The path to the file.\n *\n * @param options: The options used to fetch the file.\n *\n * @returns A promise which resolves with the file content.\n */\n get(path, options) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.get(localPath, options).then(contentsModel => {\n const listing = [];\n if (contentsModel.type === 'directory' && contentsModel.content) {\n for (const item of contentsModel.content) {\n listing.push({ ...item, path: this._toGlobalPath(drive, item.path) });\n }\n return {\n ...contentsModel,\n path: this._toGlobalPath(drive, localPath),\n content: listing,\n serverPath: contentsModel.path\n };\n }\n else {\n return {\n ...contentsModel,\n path: this._toGlobalPath(drive, localPath),\n serverPath: contentsModel.path\n };\n }\n });\n }\n /**\n * Get an encoded download url given a file path.\n *\n * @param path - An absolute POSIX file path on the server.\n *\n * #### Notes\n * It is expected that the path contains no relative paths.\n *\n * The returned URL may include a query parameter.\n */\n getDownloadUrl(path) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.getDownloadUrl(localPath);\n }\n /**\n * Create a new untitled file or directory in the specified directory path.\n *\n * @param options: The options used to create the file.\n *\n * @returns A promise which resolves with the created file content when the\n * file is created.\n */\n newUntitled(options = {}) {\n if (options.path) {\n const globalPath = this.normalize(options.path);\n const [drive, localPath] = this._driveForPath(globalPath);\n return drive\n .newUntitled({ ...options, path: localPath })\n .then(contentsModel => {\n return {\n ...contentsModel,\n path: coreutils_1.PathExt.join(globalPath, contentsModel.name),\n serverPath: contentsModel.path\n };\n });\n }\n else {\n return this._defaultDrive.newUntitled(options);\n }\n }\n /**\n * Delete a file.\n *\n * @param path - The path to the file.\n *\n * @returns A promise which resolves when the file is deleted.\n */\n delete(path) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.delete(localPath);\n }\n /**\n * Rename a file or directory.\n *\n * @param path - The original file path.\n *\n * @param newPath - The new file path.\n *\n * @returns A promise which resolves with the new file contents model when\n * the file is renamed.\n */\n rename(path, newPath) {\n const [drive1, path1] = this._driveForPath(path);\n const [drive2, path2] = this._driveForPath(newPath);\n if (drive1 !== drive2) {\n throw Error('ContentsManager: renaming files must occur within a Drive');\n }\n return drive1.rename(path1, path2).then(contentsModel => {\n return {\n ...contentsModel,\n path: this._toGlobalPath(drive1, path2),\n serverPath: contentsModel.path\n };\n });\n }\n /**\n * Save a file.\n *\n * @param path - The desired file path.\n *\n * @param options - Optional overrides to the model.\n *\n * @returns A promise which resolves with the file content model when the\n * file is saved.\n *\n * #### Notes\n * Ensure that `model.content` is populated for the file.\n */\n save(path, options = {}) {\n const globalPath = this.normalize(path);\n const [drive, localPath] = this._driveForPath(path);\n return drive\n .save(localPath, { ...options, path: localPath })\n .then(contentsModel => {\n return {\n ...contentsModel,\n path: globalPath,\n serverPath: contentsModel.path\n };\n });\n }\n /**\n * Copy a file into a given directory.\n *\n * @param path - The original file path.\n *\n * @param toDir - The destination directory path.\n *\n * @returns A promise which resolves with the new contents model when the\n * file is copied.\n *\n * #### Notes\n * The server will select the name of the copied file.\n */\n copy(fromFile, toDir) {\n const [drive1, path1] = this._driveForPath(fromFile);\n const [drive2, path2] = this._driveForPath(toDir);\n if (drive1 === drive2) {\n return drive1.copy(path1, path2).then(contentsModel => {\n return {\n ...contentsModel,\n path: this._toGlobalPath(drive1, contentsModel.path),\n serverPath: contentsModel.path\n };\n });\n }\n else {\n throw Error('Copying files between drives is not currently implemented');\n }\n }\n /**\n * Create a checkpoint for a file.\n *\n * @param path - The path of the file.\n *\n * @returns A promise which resolves with the new checkpoint model when the\n * checkpoint is created.\n */\n createCheckpoint(path) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.createCheckpoint(localPath);\n }\n /**\n * List available checkpoints for a file.\n *\n * @param path - The path of the file.\n *\n * @returns A promise which resolves with a list of checkpoint models for\n * the file.\n */\n listCheckpoints(path) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.listCheckpoints(localPath);\n }\n /**\n * Restore a file to a known checkpoint state.\n *\n * @param path - The path of the file.\n *\n * @param checkpointID - The id of the checkpoint to restore.\n *\n * @returns A promise which resolves when the checkpoint is restored.\n */\n restoreCheckpoint(path, checkpointID) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.restoreCheckpoint(localPath, checkpointID);\n }\n /**\n * Delete a checkpoint for a file.\n *\n * @param path - The path of the file.\n *\n * @param checkpointID - The id of the checkpoint to delete.\n *\n * @returns A promise which resolves when the checkpoint is deleted.\n */\n deleteCheckpoint(path, checkpointID) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.deleteCheckpoint(localPath, checkpointID);\n }\n /**\n * Given a drive and a local path, construct a fully qualified\n * path. The inverse of `_driveForPath`.\n *\n * @param drive: an `IDrive`.\n *\n * @param localPath: the local path on the drive.\n *\n * @returns the fully qualified path.\n */\n _toGlobalPath(drive, localPath) {\n if (drive === this._defaultDrive) {\n return coreutils_1.PathExt.removeSlash(localPath);\n }\n else {\n return `${drive.name}:${coreutils_1.PathExt.removeSlash(localPath)}`;\n }\n }\n /**\n * Given a path, get the `IDrive to which it refers,\n * where the path satisfies the pattern\n * `'driveName:path/to/file'`. If there is no `driveName`\n * prepended to the path, it returns the default drive.\n *\n * @param path: a path to a file.\n *\n * @returns A tuple containing an `IDrive` object for the path,\n * and a local path for that drive.\n */\n _driveForPath(path) {\n const driveName = this.driveName(path);\n const localPath = this.localPath(path);\n if (driveName) {\n return [this._additionalDrives.get(driveName), localPath];\n }\n else {\n return [this._defaultDrive, localPath];\n }\n }\n /**\n * Respond to fileChanged signals from the drives attached to\n * the manager. This prepends the drive name to the path if necessary,\n * and then forwards the signal.\n */\n _onFileChanged(sender, args) {\n var _a, _b;\n if (sender === this._defaultDrive) {\n this._fileChanged.emit(args);\n }\n else {\n let newValue = null;\n let oldValue = null;\n if ((_a = args.newValue) === null || _a === void 0 ? void 0 : _a.path) {\n newValue = {\n ...args.newValue,\n path: this._toGlobalPath(sender, args.newValue.path)\n };\n }\n if ((_b = args.oldValue) === null || _b === void 0 ? void 0 : _b.path) {\n oldValue = {\n ...args.oldValue,\n path: this._toGlobalPath(sender, args.oldValue.path)\n };\n }\n this._fileChanged.emit({\n type: args.type,\n newValue,\n oldValue\n });\n }\n }\n}\nexports.ContentsManager = ContentsManager;\n/**\n * A default implementation for an `IDrive`, talking to the\n * server using the Jupyter REST API.\n */\nclass Drive {\n /**\n * Construct a new contents manager object.\n *\n * @param options - The options used to initialize the object.\n */\n constructor(options = {}) {\n var _a, _b, _c;\n this._isDisposed = false;\n this._fileChanged = new signaling_1.Signal(this);\n this.name = (_a = options.name) !== null && _a !== void 0 ? _a : 'Default';\n this._apiEndpoint = (_b = options.apiEndpoint) !== null && _b !== void 0 ? _b : SERVICE_DRIVE_URL;\n this.serverSettings =\n (_c = options.serverSettings) !== null && _c !== void 0 ? _c : __1.ServerConnection.makeSettings();\n }\n /**\n * A signal emitted when a file operation takes place.\n */\n get fileChanged() {\n return this._fileChanged;\n }\n /**\n * Test whether the manager has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources held by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n signaling_1.Signal.clearData(this);\n }\n /**\n * Get a file or directory.\n *\n * @param localPath: The path to the file.\n *\n * @param options: The options used to fetch the file.\n *\n * @returns A promise which resolves with the file content.\n *\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async get(localPath, options) {\n let url = this._getUrl(localPath);\n if (options) {\n // The notebook type cannot take an format option.\n if (options.type === 'notebook') {\n delete options['format'];\n }\n const content = options.content ? '1' : '0';\n const params = { ...options, content };\n url += coreutils_1.URLExt.objectToQueryString(params);\n }\n const settings = this.serverSettings;\n const response = await __1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n return data;\n }\n /**\n * Get an encoded download url given a file path.\n *\n * @param localPath - An absolute POSIX file path on the server.\n *\n * #### Notes\n * It is expected that the path contains no relative paths.\n *\n * The returned URL may include a query parameter.\n */\n getDownloadUrl(localPath) {\n const baseUrl = this.serverSettings.baseUrl;\n let url = coreutils_1.URLExt.join(baseUrl, FILES_URL, coreutils_1.URLExt.encodeParts(localPath));\n const xsrfTokenMatch = document.cookie.match('\\\\b_xsrf=([^;]*)\\\\b');\n if (xsrfTokenMatch) {\n const fullUrl = new URL(url);\n fullUrl.searchParams.append('_xsrf', xsrfTokenMatch[1]);\n url = fullUrl.toString();\n }\n return Promise.resolve(url);\n }\n /**\n * Create a new untitled file or directory in the specified directory path.\n *\n * @param options: The options used to create the file.\n *\n * @returns A promise which resolves with the created file content when the\n * file is created.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async newUntitled(options = {}) {\n var _a;\n let body = '{}';\n if (options) {\n if (options.ext) {\n options.ext = Private.normalizeExtension(options.ext);\n }\n body = JSON.stringify(options);\n }\n const settings = this.serverSettings;\n const url = this._getUrl((_a = options.path) !== null && _a !== void 0 ? _a : '');\n const init = {\n method: 'POST',\n body\n };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 201) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n this._fileChanged.emit({\n type: 'new',\n oldValue: null,\n newValue: data\n });\n return data;\n }\n /**\n * Delete a file.\n *\n * @param localPath - The path to the file.\n *\n * @returns A promise which resolves when the file is deleted.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents).\n */\n async delete(localPath) {\n const url = this._getUrl(localPath);\n const settings = this.serverSettings;\n const init = { method: 'DELETE' };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n // TODO: update IPEP27 to specify errors more precisely, so\n // that error types can be detected here with certainty.\n if (response.status !== 204) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n this._fileChanged.emit({\n type: 'delete',\n oldValue: { path: localPath },\n newValue: null\n });\n }\n /**\n * Rename a file or directory.\n *\n * @param oldLocalPath - The original file path.\n *\n * @param newLocalPath - The new file path.\n *\n * @returns A promise which resolves with the new file contents model when\n * the file is renamed.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async rename(oldLocalPath, newLocalPath) {\n const settings = this.serverSettings;\n const url = this._getUrl(oldLocalPath);\n const init = {\n method: 'PATCH',\n body: JSON.stringify({ path: newLocalPath })\n };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n this._fileChanged.emit({\n type: 'rename',\n oldValue: { path: oldLocalPath },\n newValue: data\n });\n return data;\n }\n /**\n * Save a file.\n *\n * @param localPath - The desired file path.\n *\n * @param options - Optional overrides to the model.\n *\n * @returns A promise which resolves with the file content model when the\n * file is saved.\n *\n * #### Notes\n * Ensure that `model.content` is populated for the file.\n *\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async save(localPath, options = {}) {\n const settings = this.serverSettings;\n const url = this._getUrl(localPath);\n const init = {\n method: 'PUT',\n body: JSON.stringify(options)\n };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n // will return 200 for an existing file and 201 for a new file\n if (response.status !== 200 && response.status !== 201) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n this._fileChanged.emit({\n type: 'save',\n oldValue: null,\n newValue: data\n });\n return data;\n }\n /**\n * Copy a file into a given directory.\n *\n * @param localPath - The original file path.\n *\n * @param toDir - The destination directory path.\n *\n * @returns A promise which resolves with the new contents model when the\n * file is copied.\n *\n * #### Notes\n * The server will select the name of the copied file.\n *\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async copy(fromFile, toDir) {\n const settings = this.serverSettings;\n const url = this._getUrl(toDir);\n const init = {\n method: 'POST',\n body: JSON.stringify({ copy_from: fromFile })\n };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 201) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n this._fileChanged.emit({\n type: 'new',\n oldValue: null,\n newValue: data\n });\n return data;\n }\n /**\n * Create a checkpoint for a file.\n *\n * @param localPath - The path of the file.\n *\n * @returns A promise which resolves with the new checkpoint model when the\n * checkpoint is created.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async createCheckpoint(localPath) {\n const url = this._getUrl(localPath, 'checkpoints');\n const init = { method: 'POST' };\n const response = await __1.ServerConnection.makeRequest(url, init, this.serverSettings);\n if (response.status !== 201) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateCheckpointModel(data);\n return data;\n }\n /**\n * List available checkpoints for a file.\n *\n * @param localPath - The path of the file.\n *\n * @returns A promise which resolves with a list of checkpoint models for\n * the file.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async listCheckpoints(localPath) {\n const url = this._getUrl(localPath, 'checkpoints');\n const response = await __1.ServerConnection.makeRequest(url, {}, this.serverSettings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n if (!Array.isArray(data)) {\n throw new Error('Invalid Checkpoint list');\n }\n for (let i = 0; i < data.length; i++) {\n validate.validateCheckpointModel(data[i]);\n }\n return data;\n }\n /**\n * Restore a file to a known checkpoint state.\n *\n * @param localPath - The path of the file.\n *\n * @param checkpointID - The id of the checkpoint to restore.\n *\n * @returns A promise which resolves when the checkpoint is restored.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents).\n */\n async restoreCheckpoint(localPath, checkpointID) {\n const url = this._getUrl(localPath, 'checkpoints', checkpointID);\n const init = { method: 'POST' };\n const response = await __1.ServerConnection.makeRequest(url, init, this.serverSettings);\n if (response.status !== 204) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n }\n /**\n * Delete a checkpoint for a file.\n *\n * @param localPath - The path of the file.\n *\n * @param checkpointID - The id of the checkpoint to delete.\n *\n * @returns A promise which resolves when the checkpoint is deleted.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents).\n */\n async deleteCheckpoint(localPath, checkpointID) {\n const url = this._getUrl(localPath, 'checkpoints', checkpointID);\n const init = { method: 'DELETE' };\n const response = await __1.ServerConnection.makeRequest(url, init, this.serverSettings);\n if (response.status !== 204) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n }\n /**\n * Get a REST url for a file given a path.\n */\n _getUrl(...args) {\n const parts = args.map(path => coreutils_1.URLExt.encodeParts(path));\n const baseUrl = this.serverSettings.baseUrl;\n return coreutils_1.URLExt.join(baseUrl, this._apiEndpoint, ...parts);\n }\n}\nexports.Drive = Drive;\n/**\n * A namespace for module private data.\n */\nvar Private;\n(function (Private) {\n /**\n * Normalize a file extension to be of the type `'.foo'`.\n *\n * Adds a leading dot if not present and converts to lower case.\n */\n function normalizeExtension(extension) {\n if (extension.length > 0 && extension.indexOf('.') !== 0) {\n extension = `.${extension}`;\n }\n return extension;\n }\n Private.normalizeExtension = normalizeExtension;\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateCheckpointModel = exports.validateContentsModel = void 0;\nconst validate_1 = require(\"../validate\");\n/**\n * Validate an `Contents.IModel` object.\n */\nfunction validateContentsModel(model) {\n (0, validate_1.validateProperty)(model, 'name', 'string');\n (0, validate_1.validateProperty)(model, 'path', 'string');\n (0, validate_1.validateProperty)(model, 'type', 'string');\n (0, validate_1.validateProperty)(model, 'created', 'string');\n (0, validate_1.validateProperty)(model, 'last_modified', 'string');\n (0, validate_1.validateProperty)(model, 'mimetype', 'object');\n (0, validate_1.validateProperty)(model, 'content', 'object');\n (0, validate_1.validateProperty)(model, 'format', 'object');\n}\nexports.validateContentsModel = validateContentsModel;\n/**\n * Validate an `Contents.ICheckpointModel` object.\n */\nfunction validateCheckpointModel(model) {\n (0, validate_1.validateProperty)(model, 'id', 'string');\n (0, validate_1.validateProperty)(model, 'last_modified', 'string');\n}\nexports.validateCheckpointModel = validateCheckpointModel;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EventManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the jupyter-server events service.\n */\nconst SERVICE_EVENTS_URL = 'api/events';\n/**\n * The events API service manager.\n */\nclass EventManager {\n /**\n * Create a new event manager.\n */\n constructor(options = {}) {\n var _a;\n this._socket = null;\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n // If subscription fails, the poll attempts to reconnect and backs off.\n this._poll = new polling_1.Poll({ factory: () => this._subscribe() });\n this._stream = new signaling_1.Stream(this);\n // Subscribe to the events socket.\n void this._poll.start();\n }\n /**\n * Whether the event manager is disposed.\n */\n get isDisposed() {\n return this._poll.isDisposed;\n }\n /**\n * An event stream that emits and yields each new event.\n */\n get stream() {\n return this._stream;\n }\n /**\n * Dispose the event manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n // Clean up poll.\n this._poll.dispose();\n // Clean up socket.\n const socket = this._socket;\n if (socket) {\n this._socket = null;\n socket.onopen = () => undefined;\n socket.onerror = () => undefined;\n socket.onmessage = () => undefined;\n socket.onclose = () => undefined;\n socket.close();\n }\n // Clean up stream.\n signaling_1.Signal.clearData(this);\n this._stream.stop();\n }\n /**\n * Post an event request to be emitted by the event bus.\n */\n async emit(event) {\n const { serverSettings } = this;\n const { baseUrl, token } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const url = coreutils_1.URLExt.join(baseUrl, SERVICE_EVENTS_URL) +\n (token ? `?token=${token}` : '');\n const init = { body: JSON.stringify(event), method: 'POST' };\n const response = await makeRequest(url, init, serverSettings);\n if (response.status !== 204) {\n throw new ResponseError(response);\n }\n }\n /**\n * Subscribe to event bus emissions.\n */\n _subscribe() {\n return new Promise((_, reject) => {\n if (this.isDisposed) {\n return;\n }\n const { token, WebSocket, wsUrl } = this.serverSettings;\n const url = coreutils_1.URLExt.join(wsUrl, SERVICE_EVENTS_URL, 'subscribe') +\n (token ? `?token=${encodeURIComponent(token)}` : '');\n const socket = (this._socket = new WebSocket(url));\n const stream = this._stream;\n socket.onclose = () => reject(new Error('EventManager socket closed'));\n socket.onmessage = msg => msg.data && stream.emit(JSON.parse(msg.data));\n });\n }\n}\nexports.EventManager = EventManager;\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/**\n * @packageDocumentation\n * @module services\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./basemanager\"), exports);\n__exportStar(require(\"./config\"), exports);\n__exportStar(require(\"./contents\"), exports);\n__exportStar(require(\"./event\"), exports);\n__exportStar(require(\"./kernel\"), exports);\n__exportStar(require(\"./kernelspec\"), exports);\n__exportStar(require(\"./manager\"), exports);\n__exportStar(require(\"./serverconnection\"), exports);\n__exportStar(require(\"./session\"), exports);\n__exportStar(require(\"./setting\"), exports);\n__exportStar(require(\"./terminal\"), exports);\n__exportStar(require(\"./user\"), exports);\n__exportStar(require(\"./workspace\"), exports);\n__exportStar(require(\"./nbconvert\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CommHandler = void 0;\nconst disposable_1 = require(\"@lumino/disposable\");\nconst KernelMessage = __importStar(require(\"./messages\"));\n/**\n * Comm channel handler.\n */\nclass CommHandler extends disposable_1.DisposableDelegate {\n /**\n * Construct a new comm channel.\n */\n constructor(target, id, kernel, disposeCb) {\n super(disposeCb);\n this._target = '';\n this._id = '';\n this._id = id;\n this._target = target;\n this._kernel = kernel;\n }\n /**\n * The unique id for the comm channel.\n */\n get commId() {\n return this._id;\n }\n /**\n * The target name for the comm channel.\n */\n get targetName() {\n return this._target;\n }\n /**\n * Get the callback for a comm close event.\n *\n * #### Notes\n * This is called when the comm is closed from either the server or client.\n *\n * **See also:** [[ICommClose]], [[close]]\n */\n get onClose() {\n return this._onClose;\n }\n /**\n * Set the callback for a comm close event.\n *\n * #### Notes\n * This is called when the comm is closed from either the server or client. If\n * the function returns a promise, and the kernel was closed from the server,\n * kernel message processing will pause until the returned promise is\n * fulfilled.\n *\n * **See also:** [[close]]\n */\n set onClose(cb) {\n this._onClose = cb;\n }\n /**\n * Get the callback for a comm message received event.\n */\n get onMsg() {\n return this._onMsg;\n }\n /**\n * Set the callback for a comm message received event.\n *\n * #### Notes\n * This is called when a comm message is received. If the function returns a\n * promise, kernel message processing will pause until it is fulfilled.\n */\n set onMsg(cb) {\n this._onMsg = cb;\n }\n /**\n * Open a comm with optional data and metadata.\n *\n * #### Notes\n * This sends a `comm_open` message to the server.\n *\n * **See also:** [[ICommOpen]]\n */\n open(data, metadata, buffers = []) {\n if (this.isDisposed || this._kernel.isDisposed) {\n throw new Error('Cannot open');\n }\n const msg = KernelMessage.createMessage({\n msgType: 'comm_open',\n channel: 'shell',\n username: this._kernel.username,\n session: this._kernel.clientId,\n content: {\n comm_id: this._id,\n target_name: this._target,\n data: data !== null && data !== void 0 ? data : {}\n },\n metadata,\n buffers\n });\n return this._kernel.sendShellMessage(msg, false, true);\n }\n /**\n * Send a `comm_msg` message to the kernel.\n *\n * #### Notes\n * This is a no-op if the comm has been closed.\n *\n * **See also:** [[ICommMsg]]\n */\n send(data, metadata, buffers = [], disposeOnDone = true) {\n if (this.isDisposed || this._kernel.isDisposed) {\n throw new Error('Cannot send');\n }\n const msg = KernelMessage.createMessage({\n msgType: 'comm_msg',\n channel: 'shell',\n username: this._kernel.username,\n session: this._kernel.clientId,\n content: {\n comm_id: this._id,\n data: data\n },\n metadata,\n buffers\n });\n return this._kernel.sendShellMessage(msg, false, disposeOnDone);\n }\n /**\n * Close the comm.\n *\n * #### Notes\n * This will send a `comm_close` message to the kernel, and call the\n * `onClose` callback if set.\n *\n * This is a no-op if the comm is already closed.\n *\n * **See also:** [[ICommClose]], [[onClose]]\n */\n close(data, metadata, buffers = []) {\n if (this.isDisposed || this._kernel.isDisposed) {\n throw new Error('Cannot close');\n }\n const msg = KernelMessage.createMessage({\n msgType: 'comm_close',\n channel: 'shell',\n username: this._kernel.username,\n session: this._kernel.clientId,\n content: {\n comm_id: this._id,\n data: data !== null && data !== void 0 ? data : {}\n },\n metadata,\n buffers\n });\n const future = this._kernel.sendShellMessage(msg, false, true);\n const onClose = this._onClose;\n if (onClose) {\n const ioMsg = KernelMessage.createMessage({\n msgType: 'comm_close',\n channel: 'iopub',\n username: this._kernel.username,\n session: this._kernel.clientId,\n content: {\n comm_id: this._id,\n data: data !== null && data !== void 0 ? data : {}\n },\n metadata,\n buffers\n });\n // In the future, we may want to communicate back to the user the possible\n // promise returned from onClose.\n void onClose(ioMsg);\n }\n this.dispose();\n return future;\n }\n}\nexports.CommHandler = CommHandler;\n//# sourceMappingURL=comm.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelConnection = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst coreutils_2 = require(\"@lumino/coreutils\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst comm_1 = require(\"./comm\");\nconst KernelMessage = __importStar(require(\"./messages\"));\nconst future_1 = require(\"./future\");\nconst serialize_1 = require(\"./serialize\");\nconst validate = __importStar(require(\"./validate\"));\nconst kernelspec_1 = require(\"../kernelspec\");\nconst restapi = __importStar(require(\"./restapi\"));\nconst KERNEL_INFO_TIMEOUT = 3000;\nconst RESTARTING_KERNEL_SESSION = '_RESTARTING_';\nconst STARTING_KERNEL_SESSION = '';\n/**\n * Implementation of the Kernel object.\n *\n * #### Notes\n * Messages from the server are handled in the order they were received and\n * asynchronously. Any message handler can return a promise, and message\n * handling will pause until the promise is fulfilled.\n */\nclass KernelConnection {\n /**\n * Construct a kernel object.\n */\n constructor(options) {\n var _a, _b, _c, _d;\n /**\n * Create the kernel websocket connection and add socket status handlers.\n */\n this._createSocket = (useProtocols = true) => {\n this._errorIfDisposed();\n // Make sure the socket is clear\n this._clearSocket();\n // Update the connection status to reflect opening a new connection.\n this._updateConnectionStatus('connecting');\n const settings = this.serverSettings;\n const partialUrl = coreutils_1.URLExt.join(settings.wsUrl, restapi.KERNEL_SERVICE_URL, encodeURIComponent(this._id));\n // Strip any authentication from the display string.\n const display = partialUrl.replace(/^((?:\\w+:)?\\/\\/)(?:[^@\\/]+@)/, '$1');\n console.debug(`Starting WebSocket: ${display}`);\n let url = coreutils_1.URLExt.join(partialUrl, 'channels?session_id=' + encodeURIComponent(this._clientId));\n // If token authentication is in use.\n const token = settings.token;\n if (settings.appendToken && token !== '') {\n url = url + `&token=${encodeURIComponent(token)}`;\n }\n // Try opening the websocket with our list of subprotocols.\n // If the server doesn't handle subprotocols,\n // the accepted protocol will be ''.\n // But we cannot send '' as a subprotocol, so if connection fails,\n // reconnect without subprotocols.\n const supportedProtocols = useProtocols ? this._supportedProtocols : [];\n this._ws = new settings.WebSocket(url, supportedProtocols);\n // Ensure incoming binary messages are not Blobs\n this._ws.binaryType = 'arraybuffer';\n let alreadyCalledOnclose = false;\n const getKernelModel = async (evt) => {\n var _a, _b;\n if (this._isDisposed) {\n return;\n }\n this._reason = '';\n this._model = undefined;\n try {\n const model = await restapi.getKernelModel(this._id, settings);\n this._model = model;\n if ((model === null || model === void 0 ? void 0 : model.execution_state) === 'dead') {\n this._updateStatus('dead');\n }\n else {\n this._onWSClose(evt);\n }\n }\n catch (err) {\n // Try again, if there is a network failure\n // Handle network errors, as well as cases where we are on a\n // JupyterHub and the server is not running. JupyterHub returns a\n // 503 (<2.0) or 424 (>2.0) in that case.\n if (err instanceof __1.ServerConnection.NetworkError ||\n ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === 503 ||\n ((_b = err.response) === null || _b === void 0 ? void 0 : _b.status) === 424) {\n const timeout = Private.getRandomIntInclusive(10, 30) * 1e3;\n setTimeout(getKernelModel, timeout, evt);\n }\n else {\n this._reason = 'Kernel died unexpectedly';\n this._updateStatus('dead');\n }\n }\n return;\n };\n const earlyClose = async (evt) => {\n // If the websocket was closed early, that could mean\n // that the kernel is actually dead. Try getting\n // information about the kernel from the API call,\n // if that fails, then assume the kernel is dead,\n // otherwise just follow the typical websocket closed\n // protocol.\n if (alreadyCalledOnclose) {\n return;\n }\n alreadyCalledOnclose = true;\n await getKernelModel(evt);\n return;\n };\n this._ws.onmessage = this._onWSMessage;\n this._ws.onopen = this._onWSOpen;\n this._ws.onclose = earlyClose;\n this._ws.onerror = earlyClose;\n };\n // Make websocket callbacks arrow functions so they bind `this`.\n /**\n * Handle a websocket open event.\n */\n this._onWSOpen = (evt) => {\n if (this._ws.protocol !== '' &&\n !this._supportedProtocols.includes(this._ws.protocol)) {\n console.log('Server selected unknown kernel wire protocol:', this._ws.protocol);\n this._updateStatus('dead');\n throw new Error(`Unknown kernel wire protocol: ${this._ws.protocol}`);\n }\n // Remember the kernel wire protocol selected by the server.\n this._selectedProtocol = this._ws.protocol;\n this._ws.onclose = this._onWSClose;\n this._ws.onerror = this._onWSClose;\n this._updateConnectionStatus('connected');\n };\n /**\n * Handle a websocket message, validating and routing appropriately.\n */\n this._onWSMessage = (evt) => {\n // Notify immediately if there is an error with the message.\n let msg;\n try {\n msg = (0, serialize_1.deserialize)(evt.data, this._ws.protocol);\n validate.validateMessage(msg);\n }\n catch (error) {\n error.message = `Kernel message validation error: ${error.message}`;\n // We throw the error so that it bubbles up to the top, and displays the right stack.\n throw error;\n }\n // Update the current kernel session id\n this._kernelSession = msg.header.session;\n // Handle the message asynchronously, in the order received.\n this._msgChain = this._msgChain\n .then(() => {\n // Return so that any promises from handling a message are fulfilled\n // before proceeding to the next message.\n return this._handleMessage(msg);\n })\n .catch(error => {\n // Log any errors in handling the message, thus resetting the _msgChain\n // promise so we can process more messages.\n // Ignore the \"Canceled\" errors that are thrown during kernel dispose.\n if (error.message.startsWith('Canceled future for ')) {\n console.error(error);\n }\n });\n // Emit the message receive signal\n this._anyMessage.emit({ msg, direction: 'recv' });\n };\n /**\n * Handle a websocket close event.\n */\n this._onWSClose = (evt) => {\n if (!this.isDisposed) {\n this._reconnect();\n }\n };\n this._id = '';\n this._name = '';\n this._status = 'unknown';\n this._connectionStatus = 'connecting';\n this._kernelSession = '';\n this._isDisposed = false;\n /**\n * Websocket to communicate with kernel.\n */\n this._ws = null;\n this._username = '';\n this._reconnectLimit = 7;\n this._reconnectAttempt = 0;\n this._reconnectTimeout = null;\n this._supportedProtocols = Object.values(KernelMessage.supportedKernelWebSocketProtocols);\n this._selectedProtocol = '';\n this._futures = new Map();\n this._comms = new Map();\n this._targetRegistry = Object.create(null);\n this._info = new coreutils_2.PromiseDelegate();\n this._pendingMessages = [];\n this._statusChanged = new signaling_1.Signal(this);\n this._connectionStatusChanged = new signaling_1.Signal(this);\n this._disposed = new signaling_1.Signal(this);\n this._iopubMessage = new signaling_1.Signal(this);\n this._anyMessage = new signaling_1.Signal(this);\n this._pendingInput = new signaling_1.Signal(this);\n this._unhandledMessage = new signaling_1.Signal(this);\n this._displayIdToParentIds = new Map();\n this._msgIdToDisplayIds = new Map();\n this._msgChain = Promise.resolve();\n this._hasPendingInput = false;\n this._reason = '';\n this._noOp = () => {\n /* no-op */\n };\n this._name = options.model.name;\n this._id = options.model.id;\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : __1.ServerConnection.makeSettings();\n this._clientId = (_b = options.clientId) !== null && _b !== void 0 ? _b : coreutils_2.UUID.uuid4();\n this._username = (_c = options.username) !== null && _c !== void 0 ? _c : '';\n this.handleComms = (_d = options.handleComms) !== null && _d !== void 0 ? _d : true;\n this._createSocket();\n }\n get disposed() {\n return this._disposed;\n }\n /**\n * A signal emitted when the kernel status changes.\n */\n get statusChanged() {\n return this._statusChanged;\n }\n /**\n * A signal emitted when the kernel status changes.\n */\n get connectionStatusChanged() {\n return this._connectionStatusChanged;\n }\n /**\n * A signal emitted for iopub kernel messages.\n *\n * #### Notes\n * This signal is emitted after the iopub message is handled asynchronously.\n */\n get iopubMessage() {\n return this._iopubMessage;\n }\n /**\n * A signal emitted for unhandled kernel message.\n *\n * #### Notes\n * This signal is emitted for a message that was not handled. It is emitted\n * during the asynchronous message handling code.\n */\n get unhandledMessage() {\n return this._unhandledMessage;\n }\n /**\n * The kernel model\n */\n get model() {\n return (this._model || {\n id: this.id,\n name: this.name,\n reason: this._reason\n });\n }\n /**\n * A signal emitted for any kernel message.\n *\n * #### Notes\n * This signal is emitted when a message is received, before it is handled\n * asynchronously.\n *\n * This message is emitted when a message is queued for sending (either in\n * the websocket buffer, or our own pending message buffer). The message may\n * actually be sent across the wire at a later time.\n *\n * The message emitted in this signal should not be modified in any way.\n */\n get anyMessage() {\n return this._anyMessage;\n }\n /**\n * A signal emitted when a kernel has pending inputs from the user.\n */\n get pendingInput() {\n return this._pendingInput;\n }\n /**\n * The id of the server-side kernel.\n */\n get id() {\n return this._id;\n }\n /**\n * The name of the server-side kernel.\n */\n get name() {\n return this._name;\n }\n /**\n * The client username.\n */\n get username() {\n return this._username;\n }\n /**\n * The client unique id.\n */\n get clientId() {\n return this._clientId;\n }\n /**\n * The current status of the kernel.\n */\n get status() {\n return this._status;\n }\n /**\n * The current connection status of the kernel connection.\n */\n get connectionStatus() {\n return this._connectionStatus;\n }\n /**\n * Test whether the kernel has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * The cached kernel info.\n *\n * @returns A promise that resolves to the kernel info.\n */\n get info() {\n return this._info.promise;\n }\n /**\n * The kernel spec.\n *\n * @returns A promise that resolves to the kernel spec.\n */\n get spec() {\n if (this._specPromise) {\n return this._specPromise;\n }\n this._specPromise = kernelspec_1.KernelSpecAPI.getSpecs(this.serverSettings).then(specs => {\n return specs.kernelspecs[this._name];\n });\n return this._specPromise;\n }\n /**\n * Clone the current kernel with a new clientId.\n */\n clone(options = {}) {\n return new KernelConnection({\n model: this.model,\n username: this.username,\n serverSettings: this.serverSettings,\n // handleComms defaults to false since that is safer\n handleComms: false,\n ...options\n });\n }\n /**\n * Dispose of the resources held by the kernel.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._disposed.emit();\n this._updateConnectionStatus('disconnected');\n this._clearKernelState();\n this._pendingMessages = [];\n this._clearSocket();\n // Clear Lumino signals\n signaling_1.Signal.clearData(this);\n }\n /**\n * Send a shell message to the kernel.\n *\n * #### Notes\n * Send a message to the kernel's shell channel, yielding a future object\n * for accepting replies.\n *\n * If `expectReply` is given and `true`, the future is disposed when both a\n * shell reply and an idle status message are received. If `expectReply`\n * is not given or is `false`, the future is resolved when an idle status\n * message is received.\n * If `disposeOnDone` is not given or is `true`, the Future is disposed at this point.\n * If `disposeOnDone` is given and `false`, it is up to the caller to dispose of the Future.\n *\n * All replies are validated as valid kernel messages.\n *\n * If the kernel status is `dead`, this will throw an error.\n */\n sendShellMessage(msg, expectReply = false, disposeOnDone = true) {\n return this._sendKernelShellControl(future_1.KernelShellFutureHandler, msg, expectReply, disposeOnDone);\n }\n /**\n * Send a control message to the kernel.\n *\n * #### Notes\n * Send a message to the kernel's control channel, yielding a future object\n * for accepting replies.\n *\n * If `expectReply` is given and `true`, the future is disposed when both a\n * control reply and an idle status message are received. If `expectReply`\n * is not given or is `false`, the future is resolved when an idle status\n * message is received.\n * If `disposeOnDone` is not given or is `true`, the Future is disposed at this point.\n * If `disposeOnDone` is given and `false`, it is up to the caller to dispose of the Future.\n *\n * All replies are validated as valid kernel messages.\n *\n * If the kernel status is `dead`, this will throw an error.\n */\n sendControlMessage(msg, expectReply = false, disposeOnDone = true) {\n return this._sendKernelShellControl(future_1.KernelControlFutureHandler, msg, expectReply, disposeOnDone);\n }\n _sendKernelShellControl(ctor, msg, expectReply = false, disposeOnDone = true) {\n this._sendMessage(msg);\n this._anyMessage.emit({ msg, direction: 'send' });\n const future = new ctor(() => {\n const msgId = msg.header.msg_id;\n this._futures.delete(msgId);\n // Remove stored display id information.\n const displayIds = this._msgIdToDisplayIds.get(msgId);\n if (!displayIds) {\n return;\n }\n displayIds.forEach(displayId => {\n const msgIds = this._displayIdToParentIds.get(displayId);\n if (msgIds) {\n const idx = msgIds.indexOf(msgId);\n if (idx === -1) {\n return;\n }\n if (msgIds.length === 1) {\n this._displayIdToParentIds.delete(displayId);\n }\n else {\n msgIds.splice(idx, 1);\n this._displayIdToParentIds.set(displayId, msgIds);\n }\n }\n });\n this._msgIdToDisplayIds.delete(msgId);\n }, msg, expectReply, disposeOnDone, this);\n this._futures.set(msg.header.msg_id, future);\n return future;\n }\n /**\n * Send a message on the websocket.\n *\n * If queue is true, queue the message for later sending if we cannot send\n * now. Otherwise throw an error.\n *\n * #### Notes\n * As an exception to the queueing, if we are sending a kernel_info_request\n * message while we think the kernel is restarting, we send the message\n * immediately without queueing. This is so that we can trigger a message\n * back, which will then clear the kernel restarting state.\n */\n _sendMessage(msg, queue = true) {\n if (this.status === 'dead') {\n throw new Error('Kernel is dead');\n }\n // If we have a kernel_info_request and we are starting or restarting, send the\n // kernel_info_request immediately if we can, and if not throw an error so\n // we can retry later. On restarting we do this because we must get at least one message\n // from the kernel to reset the kernel session (thus clearing the restart\n // status sentinel).\n if ((this._kernelSession === STARTING_KERNEL_SESSION ||\n this._kernelSession === RESTARTING_KERNEL_SESSION) &&\n KernelMessage.isInfoRequestMsg(msg)) {\n if (this.connectionStatus === 'connected') {\n this._ws.send((0, serialize_1.serialize)(msg, this._ws.protocol));\n return;\n }\n else {\n throw new Error('Could not send message: status is not connected');\n }\n }\n // If there are pending messages, add to the queue so we keep messages in order\n if (queue && this._pendingMessages.length > 0) {\n this._pendingMessages.push(msg);\n return;\n }\n // Send if the ws allows it, otherwise queue the message.\n if (this.connectionStatus === 'connected' &&\n this._kernelSession !== RESTARTING_KERNEL_SESSION) {\n this._ws.send((0, serialize_1.serialize)(msg, this._ws.protocol));\n }\n else if (queue) {\n this._pendingMessages.push(msg);\n }\n else {\n throw new Error('Could not send message');\n }\n }\n /**\n * Interrupt a kernel.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n *\n * It is assumed that the API call does not mutate the kernel id or name.\n *\n * The promise will be rejected if the kernel status is `Dead` or if the\n * request fails or the response is invalid.\n */\n async interrupt() {\n this.hasPendingInput = false;\n if (this.status === 'dead') {\n throw new Error('Kernel is dead');\n }\n return restapi.interruptKernel(this.id, this.serverSettings);\n }\n /**\n * Request a kernel restart.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels)\n * and validates the response model.\n *\n * Any existing Future or Comm objects are cleared once the kernel has\n * actually be restarted.\n *\n * The promise is fulfilled on a valid server response (after the kernel restarts)\n * and rejected otherwise.\n *\n * It is assumed that the API call does not mutate the kernel id or name.\n *\n * The promise will be rejected if the request fails or the response is\n * invalid.\n */\n async restart() {\n if (this.status === 'dead') {\n throw new Error('Kernel is dead');\n }\n this._updateStatus('restarting');\n this._clearKernelState();\n this._kernelSession = RESTARTING_KERNEL_SESSION;\n await restapi.restartKernel(this.id, this.serverSettings);\n // Reconnect to the kernel to address cases where kernel ports\n // have changed during the restart.\n await this.reconnect();\n this.hasPendingInput = false;\n }\n /**\n * Reconnect to a kernel.\n *\n * #### Notes\n * This may try multiple times to reconnect to a kernel, and will sever any\n * existing connection.\n */\n reconnect() {\n this._errorIfDisposed();\n const result = new coreutils_2.PromiseDelegate();\n // Set up a listener for the connection status changing, which accepts or\n // rejects after the retries are done.\n const fulfill = (sender, status) => {\n if (status === 'connected') {\n result.resolve();\n this.connectionStatusChanged.disconnect(fulfill, this);\n }\n else if (status === 'disconnected') {\n result.reject(new Error('Kernel connection disconnected'));\n this.connectionStatusChanged.disconnect(fulfill, this);\n }\n };\n this.connectionStatusChanged.connect(fulfill, this);\n // Reset the reconnect limit so we start the connection attempts fresh\n this._reconnectAttempt = 0;\n // Start the reconnection process, which will also clear any existing\n // connection.\n this._reconnect();\n // Return the promise that should resolve on connection or reject if the\n // retries don't work.\n return result.promise;\n }\n /**\n * Shutdown a kernel.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n *\n * On a valid response, disposes this kernel connection.\n *\n * If the kernel is already `dead`, disposes this kernel connection without\n * a server request.\n */\n async shutdown() {\n if (this.status !== 'dead') {\n await restapi.shutdownKernel(this.id, this.serverSettings);\n }\n this.handleShutdown();\n }\n /**\n * Handles a kernel shutdown.\n *\n * #### Notes\n * This method should be called if we know from outside information that a\n * kernel is dead (for example, we cannot find the kernel model on the\n * server).\n */\n handleShutdown() {\n this._updateStatus('dead');\n this.dispose();\n }\n /**\n * Send a `kernel_info_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#kernel-info).\n *\n * Fulfills with the `kernel_info_response` content when the shell reply is\n * received and validated.\n */\n async requestKernelInfo() {\n const msg = KernelMessage.createMessage({\n msgType: 'kernel_info_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content: {}\n });\n let reply;\n try {\n reply = (await Private.handleShellMessage(this, msg));\n }\n catch (e) {\n // If we rejected because the future was disposed, ignore and return.\n if (this.isDisposed) {\n return;\n }\n else {\n throw e;\n }\n }\n this._errorIfDisposed();\n if (!reply) {\n return;\n }\n // Kernels sometimes do not include a status field on kernel_info_reply\n // messages, so set a default for now.\n // See https://github.com/jupyterlab/jupyterlab/issues/6760\n if (reply.content.status === undefined) {\n reply.content.status = 'ok';\n }\n if (reply.content.status !== 'ok') {\n this._info.reject('Kernel info reply errored');\n return reply;\n }\n this._info.resolve(reply.content);\n this._kernelSession = reply.header.session;\n return reply;\n }\n /**\n * Send a `complete_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#completion).\n *\n * Fulfills with the `complete_reply` content when the shell reply is\n * received and validated.\n */\n requestComplete(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'complete_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send an `inspect_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#introspection).\n *\n * Fulfills with the `inspect_reply` content when the shell reply is\n * received and validated.\n */\n requestInspect(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'inspect_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content: content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send a `history_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#history).\n *\n * Fulfills with the `history_reply` content when the shell reply is\n * received and validated.\n */\n requestHistory(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'history_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send an `execute_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#execute).\n *\n * Future `onReply` is called with the `execute_reply` content when the\n * shell reply is received and validated. The future will resolve when\n * this message is received and the `idle` iopub status is received.\n * The future will also be disposed at this point unless `disposeOnDone`\n * is specified and `false`, in which case it is up to the caller to dispose\n * of the future.\n *\n * **See also:** [[IExecuteReply]]\n */\n requestExecute(content, disposeOnDone = true, metadata) {\n const defaults = {\n silent: false,\n store_history: true,\n user_expressions: {},\n allow_stdin: true,\n stop_on_error: false\n };\n const msg = KernelMessage.createMessage({\n msgType: 'execute_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content: { ...defaults, ...content },\n metadata\n });\n return this.sendShellMessage(msg, true, disposeOnDone);\n }\n /**\n * Send an experimental `debug_request` message.\n *\n * @hidden\n *\n * #### Notes\n * Debug messages are experimental messages that are not in the official\n * kernel message specification. As such, this function is *NOT* considered\n * part of the public API, and may change without notice.\n */\n requestDebug(content, disposeOnDone = true) {\n const msg = KernelMessage.createMessage({\n msgType: 'debug_request',\n channel: 'control',\n username: this._username,\n session: this._clientId,\n content\n });\n return this.sendControlMessage(msg, true, disposeOnDone);\n }\n /**\n * Send an `is_complete_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#code-completeness).\n *\n * Fulfills with the `is_complete_response` content when the shell reply is\n * received and validated.\n */\n requestIsComplete(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'is_complete_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send a `comm_info_request` message.\n *\n * #### Notes\n * Fulfills with the `comm_info_reply` content when the shell reply is\n * received and validated.\n */\n requestCommInfo(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'comm_info_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send an `input_reply` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#messages-on-the-stdin-router-dealer-sockets).\n */\n sendInputReply(content, parent_header) {\n const msg = KernelMessage.createMessage({\n msgType: 'input_reply',\n channel: 'stdin',\n username: this._username,\n session: this._clientId,\n content\n });\n msg.parent_header = parent_header;\n this._sendMessage(msg);\n this._anyMessage.emit({ msg, direction: 'send' });\n this.hasPendingInput = false;\n }\n /**\n * Create a new comm.\n *\n * #### Notes\n * If a client-side comm already exists with the given commId, an error is thrown.\n * If the kernel does not handle comms, an error is thrown.\n */\n createComm(targetName, commId = coreutils_2.UUID.uuid4()) {\n if (!this.handleComms) {\n throw new Error('Comms are disabled on this kernel connection');\n }\n if (this._comms.has(commId)) {\n throw new Error('Comm is already created');\n }\n const comm = new comm_1.CommHandler(targetName, commId, this, () => {\n this._unregisterComm(commId);\n });\n this._comms.set(commId, comm);\n return comm;\n }\n /**\n * Check if a comm exists.\n */\n hasComm(commId) {\n return this._comms.has(commId);\n }\n /**\n * Register a comm target handler.\n *\n * @param targetName - The name of the comm target.\n *\n * @param callback - The callback invoked for a comm open message.\n *\n * @returns A disposable used to unregister the comm target.\n *\n * #### Notes\n * Only one comm target can be registered to a target name at a time, an\n * existing callback for the same target name will be overridden. A registered\n * comm target handler will take precedence over a comm which specifies a\n * `target_module`.\n *\n * If the callback returns a promise, kernel message processing will pause\n * until the returned promise is fulfilled.\n */\n registerCommTarget(targetName, callback) {\n if (!this.handleComms) {\n return;\n }\n this._targetRegistry[targetName] = callback;\n }\n /**\n * Remove a comm target handler.\n *\n * @param targetName - The name of the comm target to remove.\n *\n * @param callback - The callback to remove.\n *\n * #### Notes\n * The comm target is only removed if the callback argument matches.\n */\n removeCommTarget(targetName, callback) {\n if (!this.handleComms) {\n return;\n }\n if (!this.isDisposed && this._targetRegistry[targetName] === callback) {\n delete this._targetRegistry[targetName];\n }\n }\n /**\n * Register an IOPub message hook.\n *\n * @param msg_id - The parent_header message id the hook will intercept.\n *\n * @param hook - The callback invoked for the message.\n *\n * #### Notes\n * The IOPub hook system allows you to preempt the handlers for IOPub\n * messages that are responses to a given message id.\n *\n * The most recently registered hook is run first. A hook can return a\n * boolean or a promise to a boolean, in which case all kernel message\n * processing pauses until the promise is fulfilled. If a hook return value\n * resolves to false, any later hooks will not run and the function will\n * return a promise resolving to false. If a hook throws an error, the error\n * is logged to the console and the next hook is run. If a hook is\n * registered during the hook processing, it will not run until the next\n * message. If a hook is removed during the hook processing, it will be\n * deactivated immediately.\n *\n * See also [[IFuture.registerMessageHook]].\n */\n registerMessageHook(msgId, hook) {\n var _a;\n const future = (_a = this._futures) === null || _a === void 0 ? void 0 : _a.get(msgId);\n if (future) {\n future.registerMessageHook(hook);\n }\n }\n /**\n * Remove an IOPub message hook.\n *\n * @param msg_id - The parent_header message id the hook intercepted.\n *\n * @param hook - The callback invoked for the message.\n *\n */\n removeMessageHook(msgId, hook) {\n var _a;\n const future = (_a = this._futures) === null || _a === void 0 ? void 0 : _a.get(msgId);\n if (future) {\n future.removeMessageHook(hook);\n }\n }\n /**\n * Remove the input guard, if any.\n */\n removeInputGuard() {\n this.hasPendingInput = false;\n }\n /**\n * Handle a message with a display id.\n *\n * @returns Whether the message was handled.\n */\n async _handleDisplayId(displayId, msg) {\n var _a, _b;\n const msgId = msg.parent_header.msg_id;\n let parentIds = this._displayIdToParentIds.get(displayId);\n if (parentIds) {\n // We've seen it before, update existing outputs with same display_id\n // by handling display_data as update_display_data.\n const updateMsg = {\n header: coreutils_2.JSONExt.deepCopy(msg.header),\n parent_header: coreutils_2.JSONExt.deepCopy(msg.parent_header),\n metadata: coreutils_2.JSONExt.deepCopy(msg.metadata),\n content: coreutils_2.JSONExt.deepCopy(msg.content),\n channel: msg.channel,\n buffers: msg.buffers ? msg.buffers.slice() : []\n };\n updateMsg.header.msg_type = 'update_display_data';\n await Promise.all(parentIds.map(async (parentId) => {\n const future = this._futures && this._futures.get(parentId);\n if (future) {\n await future.handleMsg(updateMsg);\n }\n }));\n }\n // We're done here if it's update_display.\n if (msg.header.msg_type === 'update_display_data') {\n // It's an update, don't proceed to the normal display.\n return true;\n }\n // Regular display_data with id, record it for future updating\n // in _displayIdToParentIds for future lookup.\n parentIds = (_a = this._displayIdToParentIds.get(displayId)) !== null && _a !== void 0 ? _a : [];\n if (parentIds.indexOf(msgId) === -1) {\n parentIds.push(msgId);\n }\n this._displayIdToParentIds.set(displayId, parentIds);\n // Add to our map of display ids for this message.\n const displayIds = (_b = this._msgIdToDisplayIds.get(msgId)) !== null && _b !== void 0 ? _b : [];\n if (displayIds.indexOf(msgId) === -1) {\n displayIds.push(msgId);\n }\n this._msgIdToDisplayIds.set(msgId, displayIds);\n // Let the message propagate to the intended recipient.\n return false;\n }\n /**\n * Forcefully clear the socket state.\n *\n * #### Notes\n * This will clear all socket state without calling any handlers and will\n * not update the connection status. If you call this method, you are\n * responsible for updating the connection status as needed and recreating\n * the socket if you plan to reconnect.\n */\n _clearSocket() {\n if (this._ws !== null) {\n // Clear the websocket event handlers and the socket itself.\n this._ws.onopen = this._noOp;\n this._ws.onclose = this._noOp;\n this._ws.onerror = this._noOp;\n this._ws.onmessage = this._noOp;\n this._ws.close();\n this._ws = null;\n }\n }\n /**\n * Handle status iopub messages from the kernel.\n */\n _updateStatus(status) {\n if (this._status === status || this._status === 'dead') {\n return;\n }\n this._status = status;\n Private.logKernelStatus(this);\n this._statusChanged.emit(status);\n if (status === 'dead') {\n this.dispose();\n }\n }\n /**\n * Send pending messages to the kernel.\n */\n _sendPending() {\n // We check to make sure we are still connected each time. For\n // example, if a websocket buffer overflows, it may close, so we should\n // stop sending messages.\n while (this.connectionStatus === 'connected' &&\n this._kernelSession !== RESTARTING_KERNEL_SESSION &&\n this._pendingMessages.length > 0) {\n this._sendMessage(this._pendingMessages[0], false);\n // We shift the message off the queue after the message is sent so that\n // if there is an exception, the message is still pending.\n this._pendingMessages.shift();\n }\n }\n /**\n * Clear the internal state.\n */\n _clearKernelState() {\n this._kernelSession = '';\n this._pendingMessages = [];\n this._futures.forEach(future => {\n future.dispose();\n });\n this._comms.forEach(comm => {\n comm.dispose();\n });\n this._msgChain = Promise.resolve();\n this._futures = new Map();\n this._comms = new Map();\n this._displayIdToParentIds.clear();\n this._msgIdToDisplayIds.clear();\n }\n /**\n * Check to make sure it is okay to proceed to handle a message.\n *\n * #### Notes\n * Because we handle messages asynchronously, before a message is handled the\n * kernel might be disposed or restarted (and have a different session id).\n * This function throws an error in each of these cases. This is meant to be\n * called at the start of an asynchronous message handler to cancel message\n * processing if the message no longer is valid.\n */\n _assertCurrentMessage(msg) {\n this._errorIfDisposed();\n if (msg.header.session !== this._kernelSession) {\n throw new Error(`Canceling handling of old message: ${msg.header.msg_type}`);\n }\n }\n /**\n * Handle a `comm_open` kernel message.\n */\n async _handleCommOpen(msg) {\n this._assertCurrentMessage(msg);\n const content = msg.content;\n const comm = new comm_1.CommHandler(content.target_name, content.comm_id, this, () => {\n this._unregisterComm(content.comm_id);\n });\n this._comms.set(content.comm_id, comm);\n try {\n const target = await Private.loadObject(content.target_name, content.target_module, this._targetRegistry);\n await target(comm, msg);\n }\n catch (e) {\n // Close the comm asynchronously. We cannot block message processing on\n // kernel messages to wait for another kernel message.\n comm.close();\n console.error('Exception opening new comm');\n throw e;\n }\n }\n /**\n * Handle 'comm_close' kernel message.\n */\n async _handleCommClose(msg) {\n this._assertCurrentMessage(msg);\n const content = msg.content;\n const comm = this._comms.get(content.comm_id);\n if (!comm) {\n console.error('Comm not found for comm id ' + content.comm_id);\n return;\n }\n this._unregisterComm(comm.commId);\n const onClose = comm.onClose;\n if (onClose) {\n // tslint:disable-next-line:await-promise\n await onClose(msg);\n }\n comm.dispose();\n }\n /**\n * Handle a 'comm_msg' kernel message.\n */\n async _handleCommMsg(msg) {\n this._assertCurrentMessage(msg);\n const content = msg.content;\n const comm = this._comms.get(content.comm_id);\n if (!comm) {\n return;\n }\n const onMsg = comm.onMsg;\n if (onMsg) {\n // tslint:disable-next-line:await-promise\n await onMsg(msg);\n }\n }\n /**\n * Unregister a comm instance.\n */\n _unregisterComm(commId) {\n this._comms.delete(commId);\n }\n /**\n * Handle connection status changes.\n */\n _updateConnectionStatus(connectionStatus) {\n if (this._connectionStatus === connectionStatus) {\n return;\n }\n this._connectionStatus = connectionStatus;\n // If we are not 'connecting', reset any reconnection attempts.\n if (connectionStatus !== 'connecting') {\n this._reconnectAttempt = 0;\n clearTimeout(this._reconnectTimeout);\n }\n if (this.status !== 'dead') {\n if (connectionStatus === 'connected') {\n let restarting = this._kernelSession === RESTARTING_KERNEL_SESSION;\n // Send a kernel info request to make sure we send at least one\n // message to get kernel status back. Always request kernel info\n // first, to get kernel status back and ensure iopub is fully\n // established. If we are restarting, this message will skip the queue\n // and be sent immediately.\n let p = this.requestKernelInfo();\n // Send any pending messages after the kernelInfo resolves, or after a\n // timeout as a failsafe.\n let sendPendingCalled = false;\n let sendPendingOnce = () => {\n if (sendPendingCalled) {\n return;\n }\n sendPendingCalled = true;\n if (restarting && this._kernelSession === RESTARTING_KERNEL_SESSION) {\n // We were restarting and a message didn't arrive to set the\n // session, but we just assume the restart succeeded and send any\n // pending messages.\n // FIXME: it would be better to retry the kernel_info_request here\n this._kernelSession = '';\n }\n clearTimeout(timeoutHandle);\n if (this._pendingMessages.length > 0) {\n this._sendPending();\n }\n };\n void p.then(sendPendingOnce);\n // FIXME: if sent while zmq subscriptions are not established,\n // kernelInfo may not resolve, so use a timeout to ensure we don't hang forever.\n // It may be preferable to retry kernelInfo rather than give up after one timeout.\n let timeoutHandle = setTimeout(sendPendingOnce, KERNEL_INFO_TIMEOUT);\n }\n else {\n // If the connection is down, then we do not know what is happening\n // with the kernel, so set the status to unknown.\n this._updateStatus('unknown');\n }\n }\n // Notify others that the connection status changed.\n this._connectionStatusChanged.emit(connectionStatus);\n }\n async _handleMessage(msg) {\n var _a, _b;\n let handled = false;\n // Check to see if we have a display_id we need to reroute.\n if (msg.parent_header &&\n msg.channel === 'iopub' &&\n (KernelMessage.isDisplayDataMsg(msg) ||\n KernelMessage.isUpdateDisplayDataMsg(msg) ||\n KernelMessage.isExecuteResultMsg(msg))) {\n // display_data messages may re-route based on their display_id.\n const transient = ((_a = msg.content.transient) !== null && _a !== void 0 ? _a : {});\n const displayId = transient['display_id'];\n if (displayId) {\n handled = await this._handleDisplayId(displayId, msg);\n // The await above may make this message out of date, so check again.\n this._assertCurrentMessage(msg);\n }\n }\n if (!handled && msg.parent_header) {\n const parentHeader = msg.parent_header;\n const future = (_b = this._futures) === null || _b === void 0 ? void 0 : _b.get(parentHeader.msg_id);\n if (future) {\n await future.handleMsg(msg);\n this._assertCurrentMessage(msg);\n }\n else {\n // If the message was sent by us and was not iopub, it is orphaned.\n const owned = parentHeader.session === this.clientId;\n if (msg.channel !== 'iopub' && owned) {\n this._unhandledMessage.emit(msg);\n }\n }\n }\n if (msg.channel === 'iopub') {\n switch (msg.header.msg_type) {\n case 'status': {\n // Updating the status is synchronous, and we call no async user code\n const executionState = msg.content\n .execution_state;\n if (executionState === 'restarting') {\n // The kernel has been auto-restarted by the server. After\n // processing for this message is completely done, we want to\n // handle this restart, so we don't await, but instead schedule\n // the work as a microtask (i.e., in a promise resolution). We\n // schedule this here so that it comes before any microtasks that\n // might be scheduled in the status signal emission below.\n void Promise.resolve().then(async () => {\n this._updateStatus('autorestarting');\n this._clearKernelState();\n // We must reconnect since the kernel connection information may have\n // changed, and the server only refreshes its zmq connection when a new\n // websocket is opened.\n await this.reconnect();\n });\n }\n this._updateStatus(executionState);\n break;\n }\n case 'comm_open':\n if (this.handleComms) {\n await this._handleCommOpen(msg);\n }\n break;\n case 'comm_msg':\n if (this.handleComms) {\n await this._handleCommMsg(msg);\n }\n break;\n case 'comm_close':\n if (this.handleComms) {\n await this._handleCommClose(msg);\n }\n break;\n default:\n break;\n }\n // If the message was a status dead message, we might have disposed ourselves.\n if (!this.isDisposed) {\n this._assertCurrentMessage(msg);\n // the message wouldn't be emitted if we were disposed anyway.\n this._iopubMessage.emit(msg);\n }\n }\n }\n /**\n * Attempt a connection if we have not exhausted connection attempts.\n */\n _reconnect() {\n this._errorIfDisposed();\n // Clear any existing reconnection attempt\n clearTimeout(this._reconnectTimeout);\n // Update the connection status and schedule a possible reconnection.\n if (this._reconnectAttempt < this._reconnectLimit) {\n this._updateConnectionStatus('connecting');\n // The first reconnect attempt should happen immediately, and subsequent\n // attempts should pick a random number in a growing range so that we\n // don't overload the server with synchronized reconnection attempts\n // across multiple kernels.\n const timeout = Private.getRandomIntInclusive(0, 1e3 * (Math.pow(2, this._reconnectAttempt) - 1));\n console.warn(`Connection lost, reconnecting in ${Math.floor(timeout / 1000)} seconds.`);\n // Try reconnection with subprotocols if the server had supported them.\n // Otherwise, try reconnection without subprotocols.\n const useProtocols = this._selectedProtocol !== '' ? true : false;\n this._reconnectTimeout = setTimeout(this._createSocket, timeout, useProtocols);\n this._reconnectAttempt += 1;\n }\n else {\n this._updateConnectionStatus('disconnected');\n }\n // Clear the websocket event handlers and the socket itself.\n this._clearSocket();\n }\n /**\n * Utility function to throw an error if this instance is disposed.\n */\n _errorIfDisposed() {\n if (this.isDisposed) {\n throw new Error('Kernel connection is disposed');\n }\n }\n get hasPendingInput() {\n return this._hasPendingInput;\n }\n set hasPendingInput(value) {\n this._hasPendingInput = value;\n this._pendingInput.emit(value);\n }\n}\nexports.KernelConnection = KernelConnection;\n/**\n * A private namespace for the Kernel.\n */\nvar Private;\n(function (Private) {\n /**\n * Log the current kernel status.\n */\n function logKernelStatus(kernel) {\n switch (kernel.status) {\n case 'idle':\n case 'busy':\n case 'unknown':\n return;\n default:\n console.debug(`Kernel: ${kernel.status} (${kernel.id})`);\n break;\n }\n }\n Private.logKernelStatus = logKernelStatus;\n /**\n * Send a kernel message to the kernel and resolve the reply message.\n */\n async function handleShellMessage(kernel, msg) {\n const future = kernel.sendShellMessage(msg, true);\n return future.done;\n }\n Private.handleShellMessage = handleShellMessage;\n /**\n * Try to load an object from a module or a registry.\n *\n * Try to load an object from a module asynchronously if a module\n * is specified, otherwise tries to load an object from the global\n * registry, if the global registry is provided.\n *\n * #### Notes\n * Loading a module uses requirejs.\n */\n function loadObject(name, moduleName, registry) {\n return new Promise((resolve, reject) => {\n // Try loading the module using require.js\n if (moduleName) {\n if (typeof requirejs === 'undefined') {\n throw new Error('requirejs not found');\n }\n requirejs([moduleName], (mod) => {\n if (mod[name] === void 0) {\n const msg = `Object '${name}' not found in module '${moduleName}'`;\n reject(new Error(msg));\n }\n else {\n resolve(mod[name]);\n }\n }, reject);\n }\n else {\n if (registry === null || registry === void 0 ? void 0 : registry[name]) {\n resolve(registry[name]);\n }\n else {\n reject(new Error(`Object '${name}' not found in registry`));\n }\n }\n });\n }\n Private.loadObject = loadObject;\n /**\n * Get a random integer between min and max, inclusive of both.\n *\n * #### Notes\n * From\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#Getting_a_random_integer_between_two_values_inclusive\n *\n * From the MDN page: It might be tempting to use Math.round() to accomplish\n * that, but doing so would cause your random numbers to follow a non-uniform\n * distribution, which may not be acceptable for your needs.\n */\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n Private.getRandomIntInclusive = getRandomIntInclusive;\n})(Private || (Private = {}));\n//# sourceMappingURL=default.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelShellFutureHandler = exports.KernelControlFutureHandler = exports.KernelFutureHandler = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nconst disposable_1 = require(\"@lumino/disposable\");\nconst KernelMessage = __importStar(require(\"./messages\"));\n/**\n * Implementation of a kernel future.\n *\n * If a reply is expected, the Future is considered done when both a `reply`\n * message and an `idle` iopub status message have been received. Otherwise, it\n * is considered done when the `idle` status is received.\n *\n */\nclass KernelFutureHandler extends disposable_1.DisposableDelegate {\n /**\n * Construct a new KernelFutureHandler.\n */\n constructor(cb, msg, expectReply, disposeOnDone, kernel) {\n super(cb);\n this._status = 0;\n this._stdin = Private.noOp;\n this._iopub = Private.noOp;\n this._reply = Private.noOp;\n this._done = new coreutils_1.PromiseDelegate();\n this._hooks = new Private.HookList();\n this._disposeOnDone = true;\n this._msg = msg;\n if (!expectReply) {\n this._setFlag(Private.KernelFutureFlag.GotReply);\n }\n this._disposeOnDone = disposeOnDone;\n this._kernel = kernel;\n }\n /**\n * Get the original outgoing message.\n */\n get msg() {\n return this._msg;\n }\n /**\n * A promise that resolves when the future is done.\n */\n get done() {\n return this._done.promise;\n }\n /**\n * Get the reply handler.\n */\n get onReply() {\n return this._reply;\n }\n /**\n * Set the reply handler.\n */\n set onReply(cb) {\n this._reply = cb;\n }\n /**\n * Get the iopub handler.\n */\n get onIOPub() {\n return this._iopub;\n }\n /**\n * Set the iopub handler.\n */\n set onIOPub(cb) {\n this._iopub = cb;\n }\n /**\n * Get the stdin handler.\n */\n get onStdin() {\n return this._stdin;\n }\n /**\n * Set the stdin handler.\n */\n set onStdin(cb) {\n this._stdin = cb;\n }\n /**\n * Register hook for IOPub messages.\n *\n * @param hook - The callback invoked for an IOPub message.\n *\n * #### Notes\n * The IOPub hook system allows you to preempt the handlers for IOPub\n * messages handled by the future.\n *\n * The most recently registered hook is run first. A hook can return a\n * boolean or a promise to a boolean, in which case all kernel message\n * processing pauses until the promise is fulfilled. If a hook return value\n * resolves to false, any later hooks will not run and the function will\n * return a promise resolving to false. If a hook throws an error, the error\n * is logged to the console and the next hook is run. If a hook is\n * registered during the hook processing, it will not run until the next\n * message. If a hook is removed during the hook processing, it will be\n * deactivated immediately.\n */\n registerMessageHook(hook) {\n if (this.isDisposed) {\n throw new Error('Kernel future is disposed');\n }\n this._hooks.add(hook);\n }\n /**\n * Remove a hook for IOPub messages.\n *\n * @param hook - The hook to remove.\n *\n * #### Notes\n * If a hook is removed during the hook processing, it will be deactivated immediately.\n */\n removeMessageHook(hook) {\n if (this.isDisposed) {\n return;\n }\n this._hooks.remove(hook);\n }\n /**\n * Send an `input_reply` message.\n */\n sendInputReply(content, parent_header) {\n this._kernel.sendInputReply(content, parent_header);\n }\n /**\n * Dispose and unregister the future.\n */\n dispose() {\n this._stdin = Private.noOp;\n this._iopub = Private.noOp;\n this._reply = Private.noOp;\n this._hooks = null;\n if (!this._testFlag(Private.KernelFutureFlag.IsDone)) {\n // TODO: Uncomment the following logging code, and check for any tests that trigger it.\n // let status = [];\n // if (!this._testFlag(Private.KernelFutureFlag.GotIdle)) {\n // status.push('idle');\n // }\n // if (!this._testFlag(Private.KernelFutureFlag.GotReply)) {\n // status.push('reply');\n // }\n // console.warn(\n // `*************** DISPOSED BEFORE DONE: K${this._kernel.id.slice(\n // 0,\n // 6\n // )} M${this._msg.header.msg_id.slice(0, 6)} missing ${status.join(' ')}`\n // );\n // Reject the `done` promise, but catch its error here in case no one else\n // is waiting for the promise to resolve. This prevents the error from\n // being displayed in the console, but does not prevent it from being\n // caught by a client who is waiting for it.\n this._done.promise.catch(() => {\n /* no-op */\n });\n this._done.reject(new Error(`Canceled future for ${this.msg.header.msg_type} message before replies were done`));\n }\n super.dispose();\n }\n /**\n * Handle an incoming kernel message.\n */\n async handleMsg(msg) {\n switch (msg.channel) {\n case 'control':\n case 'shell':\n if (msg.channel === this.msg.channel &&\n msg.parent_header.msg_id === this.msg.header.msg_id) {\n await this._handleReply(msg);\n }\n break;\n case 'stdin':\n await this._handleStdin(msg);\n break;\n case 'iopub':\n await this._handleIOPub(msg);\n break;\n default:\n break;\n }\n }\n async _handleReply(msg) {\n const reply = this._reply;\n if (reply) {\n // tslint:disable-next-line:await-promise\n await reply(msg);\n }\n this._replyMsg = msg;\n this._setFlag(Private.KernelFutureFlag.GotReply);\n if (this._testFlag(Private.KernelFutureFlag.GotIdle)) {\n this._handleDone();\n }\n }\n async _handleStdin(msg) {\n this._kernel.hasPendingInput = true;\n const stdin = this._stdin;\n if (stdin) {\n // tslint:disable-next-line:await-promise\n await stdin(msg);\n }\n }\n async _handleIOPub(msg) {\n const process = await this._hooks.process(msg);\n const iopub = this._iopub;\n if (process && iopub) {\n // tslint:disable-next-line:await-promise\n await iopub(msg);\n }\n if (KernelMessage.isStatusMsg(msg) &&\n msg.content.execution_state === 'idle') {\n this._setFlag(Private.KernelFutureFlag.GotIdle);\n if (this._testFlag(Private.KernelFutureFlag.GotReply)) {\n this._handleDone();\n }\n }\n }\n _handleDone() {\n if (this._testFlag(Private.KernelFutureFlag.IsDone)) {\n return;\n }\n this._setFlag(Private.KernelFutureFlag.IsDone);\n this._done.resolve(this._replyMsg);\n if (this._disposeOnDone) {\n this.dispose();\n }\n }\n /**\n * Test whether the given future flag is set.\n */\n _testFlag(flag) {\n // tslint:disable-next-line\n return (this._status & flag) !== 0;\n }\n /**\n * Set the given future flag.\n */\n _setFlag(flag) {\n // tslint:disable-next-line\n this._status |= flag;\n }\n}\nexports.KernelFutureHandler = KernelFutureHandler;\nclass KernelControlFutureHandler extends KernelFutureHandler {\n}\nexports.KernelControlFutureHandler = KernelControlFutureHandler;\nclass KernelShellFutureHandler extends KernelFutureHandler {\n}\nexports.KernelShellFutureHandler = KernelShellFutureHandler;\nvar Private;\n(function (Private) {\n /**\n * A no-op function.\n */\n Private.noOp = () => {\n /* no-op */\n };\n /**\n * Defer a computation.\n *\n * #### NOTES\n * We can't just use requestAnimationFrame since it is not available in node.\n * This implementation is from Phosphor:\n * https://github.com/phosphorjs/phosphor/blob/e88e4321289bb1198f3098e7bda40736501f2ed8/tests/test-messaging/src/index.spec.ts#L63\n */\n const defer = (() => {\n const ok = typeof requestAnimationFrame === 'function';\n return ok ? requestAnimationFrame : setImmediate;\n })();\n class HookList {\n constructor() {\n this._hooks = [];\n }\n /**\n * Register a hook.\n *\n * @param hook - The callback to register.\n */\n add(hook) {\n this.remove(hook);\n this._hooks.push(hook);\n }\n /**\n * Remove a hook, if it exists in the hook list.\n *\n * @param hook - The callback to remove.\n */\n remove(hook) {\n const index = this._hooks.indexOf(hook);\n if (index >= 0) {\n this._hooks[index] = null;\n this._scheduleCompact();\n }\n }\n /**\n * Process a message through the hooks.\n *\n * @returns a promise resolving to false if any hook resolved as false,\n * otherwise true\n *\n * #### Notes\n * The most recently registered hook is run first. A hook can return a\n * boolean or a promise to a boolean, in which case processing pauses until\n * the promise is fulfilled. If a hook return value resolves to false, any\n * later hooks will not run and the function will return a promise resolving\n * to false. If a hook throws an error, the error is logged to the console\n * and the next hook is run. If a hook is registered during the hook\n * processing, it will not run until the next message. If a hook is removed\n * during the hook processing, it will be deactivated immediately.\n */\n async process(msg) {\n // Wait until we can start a new process run.\n await this._processing;\n // Start the next process run.\n const processing = new coreutils_1.PromiseDelegate();\n this._processing = processing.promise;\n let continueHandling;\n // Call the end hook (most recently-added) first. Starting at the end also\n // guarantees that hooks added during the processing will not be run in\n // this process run.\n for (let i = this._hooks.length - 1; i >= 0; i--) {\n const hook = this._hooks[i];\n // If the hook has been removed, continue to the next one.\n if (hook === null) {\n continue;\n }\n // Execute the hook and log any errors.\n try {\n // tslint:disable-next-line:await-promise\n continueHandling = await hook(msg);\n }\n catch (err) {\n continueHandling = true;\n console.error(err);\n }\n // If the hook resolved to false, stop processing and return.\n if (continueHandling === false) {\n processing.resolve(undefined);\n return false;\n }\n }\n // All hooks returned true (or errored out), so return true.\n processing.resolve(undefined);\n return true;\n }\n /**\n * Schedule a cleanup of the list, removing any hooks that have been nulled out.\n */\n _scheduleCompact() {\n if (!this._compactScheduled) {\n this._compactScheduled = true;\n // Schedule a compaction in between processing runs. We do the\n // scheduling in an animation frame to rate-limit our compactions. If we\n // need to compact more frequently, we can change this to directly\n // schedule the compaction.\n defer(() => {\n this._processing = this._processing.then(() => {\n this._compactScheduled = false;\n this._compact();\n });\n });\n }\n }\n /**\n * Compact the list, removing any nulls.\n */\n _compact() {\n let numNulls = 0;\n for (let i = 0, len = this._hooks.length; i < len; i++) {\n const hook = this._hooks[i];\n if (this._hooks[i] === null) {\n numNulls++;\n }\n else {\n this._hooks[i - numNulls] = hook;\n }\n }\n this._hooks.length -= numNulls;\n }\n }\n Private.HookList = HookList;\n /**\n * Bit flags for the kernel future state.\n */\n let KernelFutureFlag;\n (function (KernelFutureFlag) {\n KernelFutureFlag[KernelFutureFlag[\"GotReply\"] = 1] = \"GotReply\";\n KernelFutureFlag[KernelFutureFlag[\"GotIdle\"] = 2] = \"GotIdle\";\n KernelFutureFlag[KernelFutureFlag[\"IsDone\"] = 4] = \"IsDone\";\n KernelFutureFlag[KernelFutureFlag[\"DisposeOnDone\"] = 8] = \"DisposeOnDone\";\n })(KernelFutureFlag = Private.KernelFutureFlag || (Private.KernelFutureFlag = {}));\n})(Private || (Private = {}));\n//# sourceMappingURL=future.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelConnection = exports.KernelAPI = exports.KernelMessage = exports.Kernel = void 0;\n// Namespace some of our modules for convenience and backwards compatibility.\nconst Kernel = __importStar(require(\"./kernel\"));\nexports.Kernel = Kernel;\nconst KernelMessage = __importStar(require(\"./messages\"));\nexports.KernelMessage = KernelMessage;\nconst KernelAPI = __importStar(require(\"./restapi\"));\nexports.KernelAPI = KernelAPI;\nconst default_1 = require(\"./default\");\nObject.defineProperty(exports, \"KernelConnection\", { enumerable: true, get: function () { return default_1.KernelConnection; } });\n__exportStar(require(\"./manager\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=kernel.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelManager = void 0;\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst basemanager_1 = require(\"../basemanager\");\nconst restapi_1 = require(\"./restapi\");\nconst default_1 = require(\"./default\");\n/**\n * An implementation of a kernel manager.\n */\nclass KernelManager extends basemanager_1.BaseManager {\n /**\n * Construct a new kernel manager.\n *\n * @param options - The default options for kernel.\n */\n constructor(options = {}) {\n var _a;\n super(options);\n this._isReady = false;\n this._kernelConnections = new Set();\n this._models = new Map();\n this._runningChanged = new signaling_1.Signal(this);\n this._connectionFailure = new signaling_1.Signal(this);\n // Start model and specs polling with exponential backoff.\n this._pollModels = new polling_1.Poll({\n auto: false,\n factory: () => this.requestRunning(),\n frequency: {\n interval: 10 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: `@jupyterlab/services:KernelManager#models`,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n // Initialize internal data.\n this._ready = (async () => {\n await this._pollModels.start();\n await this._pollModels.tick;\n this._isReady = true;\n })();\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * A signal emitted when the running kernels change.\n */\n get runningChanged() {\n return this._runningChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._models.clear();\n this._kernelConnections.forEach(x => x.dispose());\n this._pollModels.dispose();\n super.dispose();\n }\n /**\n * Connect to an existing kernel.\n *\n * @returns The new kernel connection.\n *\n * #### Notes\n * This will use the manager's server settings and ignore any server\n * settings passed in the options.\n */\n connectTo(options) {\n var _a;\n const { id } = options.model;\n let handleComms = (_a = options.handleComms) !== null && _a !== void 0 ? _a : true;\n // By default, handle comms only if no other kernel connection is.\n if (options.handleComms === undefined) {\n for (const kc of this._kernelConnections) {\n if (kc.id === id && kc.handleComms) {\n handleComms = false;\n break;\n }\n }\n }\n const kernelConnection = new default_1.KernelConnection({\n handleComms,\n ...options,\n serverSettings: this.serverSettings\n });\n this._onStarted(kernelConnection);\n if (!this._models.has(id)) {\n // We trust the user to connect to an existing kernel, but we verify\n // asynchronously.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n return kernelConnection;\n }\n /**\n * Create an iterator over the most recent running kernels.\n *\n * @returns A new iterator over the running kernels.\n */\n running() {\n return this._models.values();\n }\n /**\n * Force a refresh of the running kernels.\n *\n * @returns A promise that resolves when the running list has been refreshed.\n *\n * #### Notes\n * This is not typically meant to be called by the user, since the\n * manager maintains its own internal state.\n */\n async refreshRunning() {\n await this._pollModels.refresh();\n await this._pollModels.tick;\n }\n /**\n * Start a new kernel.\n *\n * @param createOptions - The kernel creation options\n *\n * @param connectOptions - The kernel connection options\n *\n * @returns A promise that resolves with the kernel connection.\n *\n * #### Notes\n * The manager `serverSettings` will be always be used.\n */\n async startNew(createOptions = {}, connectOptions = {}) {\n const model = await (0, restapi_1.startNew)(createOptions, this.serverSettings);\n return this.connectTo({\n ...connectOptions,\n model\n });\n }\n /**\n * Shut down a kernel by id.\n *\n * @param id - The id of the target kernel.\n *\n * @returns A promise that resolves when the operation is complete.\n */\n async shutdown(id) {\n await (0, restapi_1.shutdownKernel)(id, this.serverSettings);\n await this.refreshRunning();\n }\n /**\n * Shut down all kernels.\n *\n * @returns A promise that resolves when all of the kernels are shut down.\n */\n async shutdownAll() {\n // Update the list of models to make sure our list is current.\n await this.refreshRunning();\n // Shut down all models.\n await Promise.all([...this._models.keys()].map(id => (0, restapi_1.shutdownKernel)(id, this.serverSettings)));\n // Update the list of models to clear out our state.\n await this.refreshRunning();\n }\n /**\n * Find a kernel by id.\n *\n * @param id - The id of the target kernel.\n *\n * @returns A promise that resolves with the kernel's model.\n */\n async findById(id) {\n if (this._models.has(id)) {\n return this._models.get(id);\n }\n await this.refreshRunning();\n return this._models.get(id);\n }\n /**\n * Execute a request to the server to poll running kernels and update state.\n */\n async requestRunning() {\n var _a, _b;\n let models;\n try {\n models = await (0, restapi_1.listRunning)(this.serverSettings);\n }\n catch (err) {\n // Handle network errors, as well as cases where we are on a\n // JupyterHub and the server is not running. JupyterHub returns a\n // 503 (<2.0) or 424 (>2.0) in that case.\n if (err instanceof __1.ServerConnection.NetworkError ||\n ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === 503 ||\n ((_b = err.response) === null || _b === void 0 ? void 0 : _b.status) === 424) {\n this._connectionFailure.emit(err);\n }\n throw err;\n }\n if (this.isDisposed) {\n return;\n }\n if (this._models.size === models.length &&\n models.every(model => {\n const existing = this._models.get(model.id);\n if (!existing) {\n return false;\n }\n return (existing.connections === model.connections &&\n existing.execution_state === model.execution_state &&\n existing.last_activity === model.last_activity &&\n existing.name === model.name &&\n existing.reason === model.reason &&\n existing.traceback === model.traceback);\n })) {\n // Identical models list (presuming models does not contain duplicate\n // ids), so just return\n return;\n }\n this._models = new Map(models.map(x => [x.id, x]));\n // For any kernel connection to a kernel that doesn't exist, notify it of\n // the shutdown.\n this._kernelConnections.forEach(kc => {\n if (!this._models.has(kc.id)) {\n kc.handleShutdown();\n }\n });\n this._runningChanged.emit(models);\n }\n /**\n * Handle a kernel starting.\n */\n _onStarted(kernelConnection) {\n this._kernelConnections.add(kernelConnection);\n kernelConnection.statusChanged.connect(this._onStatusChanged, this);\n kernelConnection.disposed.connect(this._onDisposed, this);\n }\n _onDisposed(kernelConnection) {\n this._kernelConnections.delete(kernelConnection);\n // A dispose emission could mean the server session is deleted, or that\n // the kernel JS object is disposed and the kernel still exists on the\n // server, so we refresh from the server to make sure we reflect the\n // server state.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n _onStatusChanged(kernelConnection, status) {\n if (status === 'dead') {\n // We asynchronously update our list of kernels, which asynchronously\n // will dispose them. We do not want to immediately dispose them because\n // there may be other signal handlers that want to be called.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n }\n}\nexports.KernelManager = KernelManager;\n/**\n * The namespace for `KernelManager` class statics.\n */\n(function (KernelManager) {\n /**\n * A no-op kernel manager to be used when starting kernels.\n */\n class NoopManager extends KernelManager {\n constructor() {\n super(...arguments);\n this._readyPromise = new Promise(() => {\n /* no-op */\n });\n }\n /**\n * Whether the manager is active.\n */\n get isActive() {\n return false;\n }\n /**\n * Used for testing.\n */\n get parentReady() {\n return super.ready;\n }\n /**\n * Start a new kernel - throws an error since it is not supported.\n */\n async startNew(createOptions = {}, connectOptions = {}) {\n return Promise.reject(new Error('Not implemented in no-op Kernel Manager'));\n }\n /**\n * Connect to an existing kernel - throws an error since it is not supported.\n */\n connectTo(options) {\n throw new Error('Not implemented in no-op Kernel Manager');\n }\n /**\n * Shut down a kernel by id - throws an error since it is not supported.\n */\n async shutdown(id) {\n return Promise.reject(new Error('Not implemented in no-op Kernel Manager'));\n }\n /**\n * A promise that fulfills when the manager is ready (never).\n */\n get ready() {\n return this.parentReady.then(() => this._readyPromise);\n }\n /**\n * Execute a request to the server to poll running kernels and update state.\n */\n async requestRunning() {\n return Promise.resolve();\n }\n }\n KernelManager.NoopManager = NoopManager;\n})(KernelManager = exports.KernelManager || (exports.KernelManager = {}));\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.supportedKernelWebSocketProtocols = exports.isInputReplyMsg = exports.isInputRequestMsg = exports.isDebugReplyMsg = exports.isDebugRequestMsg = exports.isExecuteReplyMsg = exports.isInfoRequestMsg = exports.isCommMsgMsg = exports.isCommCloseMsg = exports.isCommOpenMsg = exports.isDebugEventMsg = exports.isClearOutputMsg = exports.isStatusMsg = exports.isErrorMsg = exports.isExecuteResultMsg = exports.isExecuteInputMsg = exports.isUpdateDisplayDataMsg = exports.isDisplayDataMsg = exports.isStreamMsg = exports.createMessage = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nfunction createMessage(options) {\n var _a, _b, _c, _d, _e;\n return {\n buffers: (_a = options.buffers) !== null && _a !== void 0 ? _a : [],\n channel: options.channel,\n content: options.content,\n header: {\n date: new Date().toISOString(),\n msg_id: (_b = options.msgId) !== null && _b !== void 0 ? _b : coreutils_1.UUID.uuid4(),\n msg_type: options.msgType,\n session: options.session,\n username: (_c = options.username) !== null && _c !== void 0 ? _c : '',\n version: '5.2'\n },\n metadata: (_d = options.metadata) !== null && _d !== void 0 ? _d : {},\n parent_header: (_e = options.parentHeader) !== null && _e !== void 0 ? _e : {}\n };\n}\nexports.createMessage = createMessage;\n/**\n * Test whether a kernel message is a `'stream'` message.\n */\nfunction isStreamMsg(msg) {\n return msg.header.msg_type === 'stream';\n}\nexports.isStreamMsg = isStreamMsg;\n/**\n * Test whether a kernel message is an `'display_data'` message.\n */\nfunction isDisplayDataMsg(msg) {\n return msg.header.msg_type === 'display_data';\n}\nexports.isDisplayDataMsg = isDisplayDataMsg;\n/**\n * Test whether a kernel message is an `'update_display_data'` message.\n */\nfunction isUpdateDisplayDataMsg(msg) {\n return msg.header.msg_type === 'update_display_data';\n}\nexports.isUpdateDisplayDataMsg = isUpdateDisplayDataMsg;\n/**\n * Test whether a kernel message is an `'execute_input'` message.\n */\nfunction isExecuteInputMsg(msg) {\n return msg.header.msg_type === 'execute_input';\n}\nexports.isExecuteInputMsg = isExecuteInputMsg;\n/**\n * Test whether a kernel message is an `'execute_result'` message.\n */\nfunction isExecuteResultMsg(msg) {\n return msg.header.msg_type === 'execute_result';\n}\nexports.isExecuteResultMsg = isExecuteResultMsg;\n/**\n * Test whether a kernel message is an `'error'` message.\n */\nfunction isErrorMsg(msg) {\n return msg.header.msg_type === 'error';\n}\nexports.isErrorMsg = isErrorMsg;\n/**\n * Test whether a kernel message is a `'status'` message.\n */\nfunction isStatusMsg(msg) {\n return msg.header.msg_type === 'status';\n}\nexports.isStatusMsg = isStatusMsg;\n/**\n * Test whether a kernel message is a `'clear_output'` message.\n */\nfunction isClearOutputMsg(msg) {\n return msg.header.msg_type === 'clear_output';\n}\nexports.isClearOutputMsg = isClearOutputMsg;\n/**\n * Test whether a kernel message is an experimental `'debug_event'` message.\n *\n * @hidden\n *\n * #### Notes\n * Debug messages are experimental messages that are not in the official\n * kernel message specification. As such, this is *NOT* considered\n * part of the public API, and may change without notice.\n */\nfunction isDebugEventMsg(msg) {\n return msg.header.msg_type === 'debug_event';\n}\nexports.isDebugEventMsg = isDebugEventMsg;\n/**\n * Test whether a kernel message is a `'comm_open'` message.\n */\nfunction isCommOpenMsg(msg) {\n return msg.header.msg_type === 'comm_open';\n}\nexports.isCommOpenMsg = isCommOpenMsg;\n/**\n * Test whether a kernel message is a `'comm_close'` message.\n */\nfunction isCommCloseMsg(msg) {\n return msg.header.msg_type === 'comm_close';\n}\nexports.isCommCloseMsg = isCommCloseMsg;\n/**\n * Test whether a kernel message is a `'comm_msg'` message.\n */\nfunction isCommMsgMsg(msg) {\n return msg.header.msg_type === 'comm_msg';\n}\nexports.isCommMsgMsg = isCommMsgMsg;\n/**\n * Test whether a kernel message is a `'kernel_info_request'` message.\n */\nfunction isInfoRequestMsg(msg) {\n return msg.header.msg_type === 'kernel_info_request';\n}\nexports.isInfoRequestMsg = isInfoRequestMsg;\n/**\n * Test whether a kernel message is an `'execute_reply'` message.\n */\nfunction isExecuteReplyMsg(msg) {\n return msg.header.msg_type === 'execute_reply';\n}\nexports.isExecuteReplyMsg = isExecuteReplyMsg;\n/**\n * Test whether a kernel message is an experimental `'debug_request'` message.\n *\n * @hidden\n *\n * #### Notes\n * Debug messages are experimental messages that are not in the official\n * kernel message specification. As such, this is *NOT* considered\n * part of the public API, and may change without notice.\n */\nfunction isDebugRequestMsg(msg) {\n return msg.header.msg_type === 'debug_request';\n}\nexports.isDebugRequestMsg = isDebugRequestMsg;\n/**\n * Test whether a kernel message is an experimental `'debug_reply'` message.\n *\n * @hidden\n *\n * #### Notes\n * Debug messages are experimental messages that are not in the official\n * kernel message specification. As such, this is *NOT* considered\n * part of the public API, and may change without notice.\n */\nfunction isDebugReplyMsg(msg) {\n return msg.header.msg_type === 'debug_reply';\n}\nexports.isDebugReplyMsg = isDebugReplyMsg;\n/**\n * Test whether a kernel message is an `'input_request'` message.\n */\nfunction isInputRequestMsg(msg) {\n return msg.header.msg_type === 'input_request';\n}\nexports.isInputRequestMsg = isInputRequestMsg;\n/**\n * Test whether a kernel message is an `'input_reply'` message.\n */\nfunction isInputReplyMsg(msg) {\n return msg.header.msg_type === 'input_reply';\n}\nexports.isInputReplyMsg = isInputReplyMsg;\n// ///////////////////////////////////////////////\n// Message (de)serialization\n// ///////////////////////////////////////////////\n/**\n * The list of supported kernel wire protocols over websocket.\n */\nvar supportedKernelWebSocketProtocols;\n(function (supportedKernelWebSocketProtocols) {\n supportedKernelWebSocketProtocols[\"v1KernelWebsocketJupyterOrg\"] = \"v1.kernel.websocket.jupyter.org\";\n})(supportedKernelWebSocketProtocols = exports.supportedKernelWebSocketProtocols || (exports.supportedKernelWebSocketProtocols = {}));\n//# sourceMappingURL=messages.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getKernelModel = exports.shutdownKernel = exports.interruptKernel = exports.restartKernel = exports.startNew = exports.listRunning = exports.KERNEL_SERVICE_URL = void 0;\nconst serverconnection_1 = require(\"../serverconnection\");\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst validate_1 = require(\"./validate\");\n/**\n * The url for the kernel service.\n */\nexports.KERNEL_SERVICE_URL = 'api/kernels';\n/**\n * Fetch the running kernels.\n *\n * @param settings - The optional server settings.\n *\n * @returns A promise that resolves with the list of running kernels.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function listRunning(settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.validateModels)(data);\n return data;\n}\nexports.listRunning = listRunning;\n/**\n * Start a new kernel.\n *\n * @param options - The options used to create the kernel.\n *\n * @returns A promise that resolves with a kernel connection object.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function startNew(options = {}, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL);\n const init = {\n method: 'POST',\n body: JSON.stringify(options)\n };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 201) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.startNew = startNew;\n/**\n * Restart a kernel.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response (and thus after a restart) and rejected otherwise.\n */\nasync function restartKernel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL, encodeURIComponent(id), 'restart');\n const init = { method: 'POST' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.validateModel)(data);\n}\nexports.restartKernel = restartKernel;\n/**\n * Interrupt a kernel.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function interruptKernel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL, encodeURIComponent(id), 'interrupt');\n const init = { method: 'POST' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 204) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n}\nexports.interruptKernel = interruptKernel;\n/**\n * Shut down a kernel.\n *\n * @param id - The id of the running kernel.\n *\n * @param settings - The server settings for the request.\n *\n * @returns A promise that resolves when the kernel is shut down.\n *\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function shutdownKernel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL, encodeURIComponent(id));\n const init = { method: 'DELETE' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status === 404) {\n const msg = `The kernel \"${id}\" does not exist on the server`;\n console.warn(msg);\n }\n else if (response.status !== 204) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n}\nexports.shutdownKernel = shutdownKernel;\n/**\n * Get a full kernel model from the server by kernel id string.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function getKernelModel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL, encodeURIComponent(id));\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status === 404) {\n return undefined;\n }\n else if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.getKernelModel = getKernelModel;\n//# sourceMappingURL=restapi.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.deserialize = exports.serialize = void 0;\nconst KernelMessage = __importStar(require(\"./messages\"));\n/**\n * Serialize a kernel message for transport.\n */\nfunction serialize(msg, protocol = '') {\n switch (protocol) {\n case KernelMessage.supportedKernelWebSocketProtocols\n .v1KernelWebsocketJupyterOrg:\n return Private.serializeV1KernelWebsocketJupyterOrg(msg);\n default:\n return Private.serializeDefault(msg);\n }\n}\nexports.serialize = serialize;\n/**\n * Deserialize and return the unpacked message.\n */\nfunction deserialize(data, protocol = '') {\n switch (protocol) {\n case KernelMessage.supportedKernelWebSocketProtocols\n .v1KernelWebsocketJupyterOrg:\n return Private.deserializeV1KernelWebsocketJupyterOrg(data);\n default:\n return Private.deserializeDefault(data);\n }\n}\nexports.deserialize = deserialize;\nvar Private;\n(function (Private) {\n /**\n * Deserialize and return the unpacked message.\n * Protocol `v1.kernel.websocket.jupyter.org`\n */\n function deserializeV1KernelWebsocketJupyterOrg(binMsg) {\n let msg;\n const data = new DataView(binMsg);\n const offsetNumber = Number(data.getBigUint64(0, true /* littleEndian */));\n let offsets = [];\n for (let i = 0; i < offsetNumber; i++) {\n // WARNING: we cast our 64-bit unsigned int to a number!\n // so offsets cannot index up to 2**64 bytes\n offsets.push(Number(data.getBigUint64(8 * (i + 1), true /* littleEndian */)));\n }\n const decoder = new TextDecoder('utf8');\n const channel = decoder.decode(binMsg.slice(offsets[0], offsets[1]));\n const header = JSON.parse(decoder.decode(binMsg.slice(offsets[1], offsets[2])));\n const parent_header = JSON.parse(decoder.decode(binMsg.slice(offsets[2], offsets[3])));\n const metadata = JSON.parse(decoder.decode(binMsg.slice(offsets[3], offsets[4])));\n const content = JSON.parse(decoder.decode(binMsg.slice(offsets[4], offsets[5])));\n let buffers = [];\n for (let i = 5; i < offsets.length - 1; i++) {\n buffers.push(new DataView(binMsg.slice(offsets[i], offsets[i + 1])));\n }\n msg = {\n channel,\n header,\n parent_header,\n metadata,\n content,\n buffers\n };\n return msg;\n }\n Private.deserializeV1KernelWebsocketJupyterOrg = deserializeV1KernelWebsocketJupyterOrg;\n /**\n * Serialize a kernel message for transport.\n * Protocol `v1.kernel.websocket.jupyter.org`\n */\n function serializeV1KernelWebsocketJupyterOrg(msg) {\n const header = JSON.stringify(msg.header);\n const parentHeader = msg.parent_header == null ? '{}' : JSON.stringify(msg.parent_header);\n const metadata = JSON.stringify(msg.metadata);\n const content = JSON.stringify(msg.content);\n const buffers = msg.buffers !== undefined ? msg.buffers : [];\n const offsetNumber = 1 + 4 + buffers.length + 1;\n let offsets = [];\n offsets.push(8 * (1 + offsetNumber));\n offsets.push(msg.channel.length + offsets[offsets.length - 1]);\n const encoder = new TextEncoder();\n const channelEncoded = encoder.encode(msg.channel);\n const headerEncoded = encoder.encode(header);\n const parentHeaderEncoded = encoder.encode(parentHeader);\n const metadataEncoded = encoder.encode(metadata);\n const contentEncoded = encoder.encode(content);\n const binMsgNoBuff = new Uint8Array(channelEncoded.length +\n headerEncoded.length +\n parentHeaderEncoded.length +\n metadataEncoded.length +\n contentEncoded.length);\n binMsgNoBuff.set(channelEncoded);\n binMsgNoBuff.set(headerEncoded, channelEncoded.length);\n binMsgNoBuff.set(parentHeaderEncoded, channelEncoded.length + headerEncoded.length);\n binMsgNoBuff.set(metadataEncoded, channelEncoded.length + headerEncoded.length + parentHeaderEncoded.length);\n binMsgNoBuff.set(contentEncoded, channelEncoded.length +\n headerEncoded.length +\n parentHeaderEncoded.length +\n metadataEncoded.length);\n for (let length of [\n headerEncoded.length,\n parentHeaderEncoded.length,\n metadataEncoded.length,\n contentEncoded.length\n ]) {\n offsets.push(length + offsets[offsets.length - 1]);\n }\n let buffersByteLength = 0;\n for (let buffer of buffers) {\n let length = buffer.byteLength;\n offsets.push(length + offsets[offsets.length - 1]);\n buffersByteLength += length;\n }\n const binMsg = new Uint8Array(8 * (1 + offsetNumber) + binMsgNoBuff.byteLength + buffersByteLength);\n const word = new ArrayBuffer(8);\n const data = new DataView(word);\n data.setBigUint64(0, BigInt(offsetNumber), true /* littleEndian */);\n binMsg.set(new Uint8Array(word), 0);\n for (let i = 0; i < offsets.length; i++) {\n data.setBigUint64(0, BigInt(offsets[i]), true /* littleEndian */);\n binMsg.set(new Uint8Array(word), 8 * (i + 1));\n }\n binMsg.set(binMsgNoBuff, offsets[0]);\n for (let i = 0; i < buffers.length; i++) {\n const buffer = buffers[i];\n binMsg.set(new Uint8Array(ArrayBuffer.isView(buffer) ? buffer.buffer : buffer), offsets[5 + i]);\n }\n return binMsg.buffer;\n }\n Private.serializeV1KernelWebsocketJupyterOrg = serializeV1KernelWebsocketJupyterOrg;\n /**\n * Deserialize and return the unpacked message.\n * Default protocol\n *\n * #### Notes\n * Handles JSON blob strings and binary messages.\n */\n function deserializeDefault(data) {\n let value;\n if (typeof data === 'string') {\n value = JSON.parse(data);\n }\n else {\n value = deserializeBinary(data);\n }\n return value;\n }\n Private.deserializeDefault = deserializeDefault;\n /**\n * Serialize a kernel message for transport.\n * Default protocol\n *\n * #### Notes\n * If there is binary content, an `ArrayBuffer` is returned,\n * otherwise the message is converted to a JSON string.\n */\n function serializeDefault(msg) {\n var _a;\n let value;\n if ((_a = msg.buffers) === null || _a === void 0 ? void 0 : _a.length) {\n value = serializeBinary(msg);\n }\n else {\n value = JSON.stringify(msg);\n }\n return value;\n }\n Private.serializeDefault = serializeDefault;\n /**\n * Deserialize a binary message to a Kernel Message.\n */\n function deserializeBinary(buf) {\n const data = new DataView(buf);\n // read the header: 1 + nbufs 32b integers\n const nbufs = data.getUint32(0);\n const offsets = [];\n if (nbufs < 2) {\n throw new Error('Invalid incoming Kernel Message');\n }\n for (let i = 1; i <= nbufs; i++) {\n offsets.push(data.getUint32(i * 4));\n }\n const jsonBytes = new Uint8Array(buf.slice(offsets[0], offsets[1]));\n const msg = JSON.parse(new TextDecoder('utf8').decode(jsonBytes));\n // the remaining chunks are stored as DataViews in msg.buffers\n msg.buffers = [];\n for (let i = 1; i < nbufs; i++) {\n const start = offsets[i];\n const stop = offsets[i + 1] || buf.byteLength;\n msg.buffers.push(new DataView(buf.slice(start, stop)));\n }\n return msg;\n }\n /**\n * Implement the binary serialization protocol.\n *\n * Serialize Kernel message to ArrayBuffer.\n */\n function serializeBinary(msg) {\n const offsets = [];\n const buffers = [];\n const encoder = new TextEncoder();\n let origBuffers = [];\n if (msg.buffers !== undefined) {\n origBuffers = msg.buffers;\n delete msg['buffers'];\n }\n const jsonUtf8 = encoder.encode(JSON.stringify(msg));\n buffers.push(jsonUtf8.buffer);\n for (let i = 0; i < origBuffers.length; i++) {\n // msg.buffers elements could be either views or ArrayBuffers\n // buffers elements are ArrayBuffers\n const b = origBuffers[i];\n buffers.push(ArrayBuffer.isView(b) ? b.buffer : b);\n }\n const nbufs = buffers.length;\n offsets.push(4 * (nbufs + 1));\n for (let i = 0; i + 1 < buffers.length; i++) {\n offsets.push(offsets[offsets.length - 1] + buffers[i].byteLength);\n }\n const msgBuf = new Uint8Array(offsets[offsets.length - 1] + buffers[buffers.length - 1].byteLength);\n // use DataView.setUint32 for network byte-order\n const view = new DataView(msgBuf.buffer);\n // write nbufs to first 4 bytes\n view.setUint32(0, nbufs);\n // write offsets to next 4 * nbufs bytes\n for (let i = 0; i < offsets.length; i++) {\n view.setUint32(4 * (i + 1), offsets[i]);\n }\n // write all the buffers at their respective offsets\n for (let i = 0; i < buffers.length; i++) {\n msgBuf.set(new Uint8Array(buffers[i]), offsets[i]);\n }\n return msgBuf.buffer;\n }\n})(Private || (Private = {}));\n//# sourceMappingURL=serialize.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateModels = exports.validateModel = exports.validateMessage = void 0;\nconst validate_1 = require(\"../validate\");\n/**\n * Required fields for `IKernelHeader`.\n */\nconst HEADER_FIELDS = ['username', 'version', 'session', 'msg_id', 'msg_type'];\n/**\n * Required fields and types for contents of various types of `kernel.IMessage`\n * messages on the iopub channel.\n */\nconst IOPUB_CONTENT_FIELDS = {\n stream: { name: 'string', text: 'string' },\n display_data: { data: 'object', metadata: 'object' },\n execute_input: { code: 'string', execution_count: 'number' },\n execute_result: {\n execution_count: 'number',\n data: 'object',\n metadata: 'object'\n },\n error: { ename: 'string', evalue: 'string', traceback: 'object' },\n status: {\n execution_state: [\n 'string',\n ['starting', 'idle', 'busy', 'restarting', 'dead']\n ]\n },\n clear_output: { wait: 'boolean' },\n comm_open: { comm_id: 'string', target_name: 'string', data: 'object' },\n comm_msg: { comm_id: 'string', data: 'object' },\n comm_close: { comm_id: 'string' },\n shutdown_reply: { restart: 'boolean' } // Emitted by the IPython kernel.\n};\n/**\n * Validate the header of a kernel message.\n */\nfunction validateHeader(header) {\n for (let i = 0; i < HEADER_FIELDS.length; i++) {\n (0, validate_1.validateProperty)(header, HEADER_FIELDS[i], 'string');\n }\n}\n/**\n * Validate a kernel message object.\n */\nfunction validateMessage(msg) {\n (0, validate_1.validateProperty)(msg, 'metadata', 'object');\n (0, validate_1.validateProperty)(msg, 'content', 'object');\n (0, validate_1.validateProperty)(msg, 'channel', 'string');\n validateHeader(msg.header);\n if (msg.channel === 'iopub') {\n validateIOPubContent(msg);\n }\n}\nexports.validateMessage = validateMessage;\n/**\n * Validate content an kernel message on the iopub channel.\n */\nfunction validateIOPubContent(msg) {\n if (msg.channel === 'iopub') {\n const fields = IOPUB_CONTENT_FIELDS[msg.header.msg_type];\n // Check for unknown message type.\n if (fields === undefined) {\n return;\n }\n const names = Object.keys(fields);\n const content = msg.content;\n for (let i = 0; i < names.length; i++) {\n let args = fields[names[i]];\n if (!Array.isArray(args)) {\n args = [args];\n }\n (0, validate_1.validateProperty)(content, names[i], ...args);\n }\n }\n}\n/**\n * Validate a `Kernel.IModel` object.\n */\nfunction validateModel(model) {\n (0, validate_1.validateProperty)(model, 'name', 'string');\n (0, validate_1.validateProperty)(model, 'id', 'string');\n}\nexports.validateModel = validateModel;\n/**\n * Validate an array of `IModel` objects.\n */\nfunction validateModels(models) {\n if (!Array.isArray(models)) {\n throw new Error('Invalid kernel list');\n }\n models.forEach(d => validateModel(d));\n}\nexports.validateModels = validateModels;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelSpecAPI = exports.KernelSpec = void 0;\nconst KernelSpec = __importStar(require(\"./kernelspec\"));\nexports.KernelSpec = KernelSpec;\nconst KernelSpecAPI = __importStar(require(\"./restapi\"));\nexports.KernelSpecAPI = KernelSpecAPI;\n__exportStar(require(\"./manager\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=kernelspec.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelSpecManager = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst restapi = __importStar(require(\"./restapi\"));\nconst basemanager_1 = require(\"../basemanager\");\n/**\n * An implementation of a kernel spec manager.\n */\nclass KernelSpecManager extends basemanager_1.BaseManager {\n /**\n * Construct a new kernel spec manager.\n *\n * @param options - The default options for kernel.\n */\n constructor(options = {}) {\n var _a;\n super(options);\n this._isReady = false;\n this._connectionFailure = new signaling_1.Signal(this);\n this._specs = null;\n this._specsChanged = new signaling_1.Signal(this);\n // Initialize internal data.\n this._ready = Promise.all([this.requestSpecs()])\n .then(_ => undefined)\n .catch(_ => undefined)\n .then(() => {\n if (this.isDisposed) {\n return;\n }\n this._isReady = true;\n });\n this._pollSpecs = new polling_1.Poll({\n auto: false,\n factory: () => this.requestSpecs(),\n frequency: {\n interval: 61 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: `@jupyterlab/services:KernelSpecManager#specs`,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n void this.ready.then(() => {\n void this._pollSpecs.start();\n });\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * Get the most recently fetched kernel specs.\n */\n get specs() {\n return this._specs;\n }\n /**\n * A signal emitted when the specs change.\n */\n get specsChanged() {\n return this._specsChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n this._pollSpecs.dispose();\n super.dispose();\n }\n /**\n * Force a refresh of the specs from the server.\n *\n * @returns A promise that resolves when the specs are fetched.\n *\n * #### Notes\n * This is intended to be called only in response to a user action,\n * since the manager maintains its internal state.\n */\n async refreshSpecs() {\n await this._pollSpecs.refresh();\n await this._pollSpecs.tick;\n }\n /**\n * Execute a request to the server to poll specs and update state.\n */\n async requestSpecs() {\n const specs = await restapi.getSpecs(this.serverSettings);\n if (this.isDisposed) {\n return;\n }\n if (!coreutils_1.JSONExt.deepEqual(specs, this._specs)) {\n this._specs = specs;\n this._specsChanged.emit(specs);\n }\n }\n}\nexports.KernelSpecManager = KernelSpecManager;\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSpecs = void 0;\nconst serverconnection_1 = require(\"../serverconnection\");\nconst validate_1 = require(\"./validate\");\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\n/**\n * The url for the kernelspec service.\n */\nconst KERNELSPEC_SERVICE_URL = 'api/kernelspecs';\n/**\n * Fetch all of the kernel specs.\n *\n * @param settings - The optional server settings.\n * @param useCache - Whether to use the cache. If false, always request.\n *\n * @returns A promise that resolves with the kernel specs.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernelspecs).\n */\nasync function getSpecs(settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, KERNELSPEC_SERVICE_URL);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n return (0, validate_1.validateSpecModels)(data);\n}\nexports.getSpecs = getSpecs;\n//# sourceMappingURL=restapi.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateSpecModels = exports.validateSpecModel = void 0;\nconst validate_1 = require(\"../validate\");\n/**\n * Validate a server kernelspec model to a client side model.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction validateSpecModel(data) {\n const spec = data.spec;\n if (!spec) {\n throw new Error('Invalid kernel spec');\n }\n (0, validate_1.validateProperty)(data, 'name', 'string');\n (0, validate_1.validateProperty)(data, 'resources', 'object');\n (0, validate_1.validateProperty)(spec, 'language', 'string');\n (0, validate_1.validateProperty)(spec, 'display_name', 'string');\n (0, validate_1.validateProperty)(spec, 'argv', 'array');\n let metadata = null;\n if (spec.hasOwnProperty('metadata')) {\n (0, validate_1.validateProperty)(spec, 'metadata', 'object');\n metadata = spec.metadata;\n }\n let env = null;\n if (spec.hasOwnProperty('env')) {\n (0, validate_1.validateProperty)(spec, 'env', 'object');\n env = spec.env;\n }\n return {\n name: data.name,\n resources: data.resources,\n language: spec.language,\n display_name: spec.display_name,\n argv: spec.argv,\n metadata,\n env\n };\n}\nexports.validateSpecModel = validateSpecModel;\n/**\n * Validate a `Kernel.ISpecModels` object.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction validateSpecModels(data) {\n if (!data.hasOwnProperty('kernelspecs')) {\n throw new Error('No kernelspecs found');\n }\n let keys = Object.keys(data.kernelspecs);\n const kernelspecs = Object.create(null);\n let defaultSpec = data.default;\n for (let i = 0; i < keys.length; i++) {\n const ks = data.kernelspecs[keys[i]];\n try {\n kernelspecs[keys[i]] = validateSpecModel(ks);\n }\n catch (err) {\n // Remove the errant kernel spec.\n console.warn(`Removing errant kernel spec: ${keys[i]}`);\n }\n }\n keys = Object.keys(kernelspecs);\n if (!keys.length) {\n throw new Error('No valid kernelspecs found');\n }\n if (!defaultSpec ||\n typeof defaultSpec !== 'string' ||\n !(defaultSpec in kernelspecs)) {\n defaultSpec = keys[0];\n console.warn(`Default kernel not found, using '${keys[0]}'`);\n }\n return {\n default: defaultSpec,\n kernelspecs\n };\n}\nexports.validateSpecModels = validateSpecModels;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ServiceManager = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\nconst builder_1 = require(\"./builder\");\nconst contents_1 = require(\"./contents\");\nconst event_1 = require(\"./event\");\nconst kernel_1 = require(\"./kernel\");\nconst kernelspec_1 = require(\"./kernelspec\");\nconst nbconvert_1 = require(\"./nbconvert\");\nconst serverconnection_1 = require(\"./serverconnection\");\nconst session_1 = require(\"./session\");\nconst setting_1 = require(\"./setting\");\nconst terminal_1 = require(\"./terminal\");\nconst user_1 = require(\"./user\");\nconst workspace_1 = require(\"./workspace\");\n/**\n * A Jupyter services manager.\n */\nclass ServiceManager {\n /**\n * Construct a new services provider.\n */\n constructor(options = {}) {\n var _a, _b;\n this._isDisposed = false;\n this._connectionFailure = new signaling_1.Signal(this);\n this._isReady = false;\n const defaultDrive = options.defaultDrive;\n const serverSettings = (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n const standby = (_b = options.standby) !== null && _b !== void 0 ? _b : 'when-hidden';\n const normalized = { defaultDrive, serverSettings, standby };\n this.serverSettings = serverSettings;\n this.contents = options.contents || new contents_1.ContentsManager(normalized);\n this.events = options.events || new event_1.EventManager(normalized);\n this.kernels = options.kernels || new kernel_1.KernelManager(normalized);\n this.sessions =\n options.sessions ||\n new session_1.SessionManager({\n ...normalized,\n kernelManager: this.kernels\n });\n this.settings = options.settings || new setting_1.SettingManager(normalized);\n this.terminals = options.terminals || new terminal_1.TerminalManager(normalized);\n this.builder = options.builder || new builder_1.BuildManager(normalized);\n this.workspaces = options.workspaces || new workspace_1.WorkspaceManager(normalized);\n this.nbconvert = options.nbconvert || new nbconvert_1.NbConvertManager(normalized);\n this.kernelspecs = options.kernelspecs || new kernelspec_1.KernelSpecManager(normalized);\n this.user = options.user || new user_1.UserManager(normalized);\n // Proxy all connection failures from the individual service managers.\n this.kernelspecs.connectionFailure.connect(this._onConnectionFailure, this);\n this.sessions.connectionFailure.connect(this._onConnectionFailure, this);\n this.terminals.connectionFailure.connect(this._onConnectionFailure, this);\n // Define promises that need to be resolved before service manager is ready.\n const readyList = [this.sessions.ready, this.kernelspecs.ready];\n if (this.terminals.isAvailable()) {\n readyList.push(this.terminals.ready);\n }\n this._readyPromise = Promise.all(readyList).then(() => {\n this._isReady = true;\n });\n }\n /**\n * A signal emitted when there is a connection failure with the kernel.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Test whether the service manager is disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n signaling_1.Signal.clearData(this);\n this.contents.dispose();\n this.events.dispose();\n this.sessions.dispose();\n this.terminals.dispose();\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._readyPromise;\n }\n _onConnectionFailure(sender, err) {\n this._connectionFailure.emit(err);\n }\n}\nexports.ServiceManager = ServiceManager;\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NbConvertManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst serverconnection_1 = require(\"../serverconnection\");\nconst coreutils_2 = require(\"@lumino/coreutils\");\n/**\n * The url for the lab nbconvert service.\n */\nconst NBCONVERT_SETTINGS_URL = 'api/nbconvert';\n/**\n * The nbconvert API service manager.\n */\nclass NbConvertManager {\n /**\n * Create a new nbconvert manager.\n */\n constructor(options = {}) {\n var _a;\n this._exportFormats = null;\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n }\n /**\n * Fetch and cache the export formats from the expensive nbconvert handler.\n */\n async fetchExportFormats() {\n this._requestingFormats = new coreutils_2.PromiseDelegate();\n this._exportFormats = null;\n const base = this.serverSettings.baseUrl;\n const url = coreutils_1.URLExt.join(base, NBCONVERT_SETTINGS_URL);\n const { serverSettings } = this;\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n const exportList = {};\n const keys = Object.keys(data);\n keys.forEach(function (key) {\n const mimeType = data[key].output_mimetype;\n exportList[key] = { output_mimetype: mimeType };\n });\n this._exportFormats = exportList;\n this._requestingFormats.resolve(exportList);\n return exportList;\n }\n /**\n * Get the list of export formats, preferring pre-cached ones.\n */\n async getExportFormats(force = true) {\n if (this._requestingFormats) {\n return this._requestingFormats.promise;\n }\n if (force || !this._exportFormats) {\n return await this.fetchExportFormats();\n }\n return this._exportFormats;\n }\n}\nexports.NbConvertManager = NbConvertManager;\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ServerConnection = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nlet WEBSOCKET;\nif (typeof window === 'undefined') {\n // Mangle the require statements so it does not get picked up in the\n // browser assets.\n WEBSOCKET = require('ws');\n}\nelse {\n WEBSOCKET = WebSocket;\n}\n/**\n * The namespace for ServerConnection functions.\n *\n * #### Notes\n * This is only intended to manage communication with the Jupyter server.\n *\n * The default values can be used in a JupyterLab or Jupyter Notebook context.\n *\n * We use `token` authentication if available, falling back on an XSRF\n * cookie if one has been provided on the `document`.\n *\n * A content type of `'application/json'` is added when using authentication\n * and there is no body data to allow the server to prevent malicious forms.\n */\nvar ServerConnection;\n(function (ServerConnection) {\n /**\n * Create a settings object given a subset of options.\n *\n * @param options - An optional partial set of options.\n *\n * @returns The full settings object.\n */\n function makeSettings(options) {\n return Private.makeSettings(options);\n }\n ServerConnection.makeSettings = makeSettings;\n /**\n * Make an request to the notebook server.\n *\n * @param url - The url for the request.\n *\n * @param init - The initialization options for the request.\n *\n * @param settings - The server settings to apply to the request.\n *\n * @returns a Promise that resolves with the response.\n *\n * @throws If the url of the request is not a notebook server url.\n *\n * #### Notes\n * The `url` must start with `settings.baseUrl`. The `init` settings are\n * merged with `settings.init`, with `init` taking precedence.\n * The headers in the two objects are not merged.\n * If there is no body data, we set the content type to `application/json`\n * because it is required by the Notebook server.\n */\n function makeRequest(url, init, settings) {\n return Private.handleRequest(url, init, settings);\n }\n ServerConnection.makeRequest = makeRequest;\n /**\n * A wrapped error for a fetch response.\n */\n class ResponseError extends Error {\n /**\n * Create a ResponseError from a response, handling the traceback and message\n * as appropriate.\n *\n * @param response The response object.\n *\n * @returns A promise that resolves with a `ResponseError` object.\n */\n static async create(response) {\n try {\n const data = await response.json();\n const { message, traceback } = data;\n if (traceback) {\n console.error(traceback);\n }\n return new ResponseError(response, message !== null && message !== void 0 ? message : ResponseError._defaultMessage(response), traceback !== null && traceback !== void 0 ? traceback : '');\n }\n catch (e) {\n console.debug(e);\n return new ResponseError(response);\n }\n }\n /**\n * Create a new response error.\n */\n constructor(response, message = ResponseError._defaultMessage(response), traceback = '') {\n super(message);\n this.response = response;\n this.traceback = traceback;\n }\n static _defaultMessage(response) {\n return `Invalid response: ${response.status} ${response.statusText}`;\n }\n }\n ServerConnection.ResponseError = ResponseError;\n /**\n * A wrapped error for a network error.\n */\n class NetworkError extends TypeError {\n /**\n * Create a new network error.\n */\n constructor(original) {\n super(original.message);\n this.stack = original.stack;\n }\n }\n ServerConnection.NetworkError = NetworkError;\n})(ServerConnection = exports.ServerConnection || (exports.ServerConnection = {}));\n/**\n * The namespace for module private data.\n */\nvar Private;\n(function (Private) {\n /**\n * Handle the server connection settings, returning a new value.\n */\n function makeSettings(options = {}) {\n var _a;\n const pageBaseUrl = coreutils_1.PageConfig.getBaseUrl();\n const pageWsUrl = coreutils_1.PageConfig.getWsUrl();\n const baseUrl = coreutils_1.URLExt.normalize(options.baseUrl) || pageBaseUrl;\n let wsUrl = options.wsUrl;\n // Prefer the default wsUrl if we are using the default baseUrl.\n if (!wsUrl && baseUrl === pageBaseUrl) {\n wsUrl = pageWsUrl;\n }\n // Otherwise convert the baseUrl to a wsUrl if possible.\n if (!wsUrl && baseUrl.indexOf('http') === 0) {\n wsUrl = 'ws' + baseUrl.slice(4);\n }\n // Otherwise fall back on the default wsUrl.\n wsUrl = wsUrl !== null && wsUrl !== void 0 ? wsUrl : pageWsUrl;\n return {\n init: { cache: 'no-store', credentials: 'same-origin' },\n fetch,\n Headers,\n Request,\n WebSocket: WEBSOCKET,\n token: coreutils_1.PageConfig.getToken(),\n appUrl: coreutils_1.PageConfig.getOption('appUrl'),\n appendToken: typeof window === 'undefined' ||\n (typeof process !== 'undefined' &&\n ((_a = process === null || process === void 0 ? void 0 : process.env) === null || _a === void 0 ? void 0 : _a.JEST_WORKER_ID) !== undefined) ||\n coreutils_1.URLExt.getHostName(pageBaseUrl) !== coreutils_1.URLExt.getHostName(wsUrl),\n ...options,\n baseUrl,\n wsUrl\n };\n }\n Private.makeSettings = makeSettings;\n /**\n * Handle a request.\n *\n * @param url - The url for the request.\n *\n * @param init - The overrides for the request init.\n *\n * @param settings - The settings object for the request.\n *\n * #### Notes\n * The `url` must start with `settings.baseUrl`. The `init` settings\n * take precedence over `settings.init`.\n */\n function handleRequest(url, init, settings) {\n var _a;\n // Handle notebook server requests.\n if (url.indexOf(settings.baseUrl) !== 0) {\n throw new Error('Can only be used for notebook server requests');\n }\n // Use explicit cache buster when `no-store` is set since\n // not all browsers use it properly.\n const cache = (_a = init.cache) !== null && _a !== void 0 ? _a : settings.init.cache;\n if (cache === 'no-store') {\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n url += (/\\?/.test(url) ? '&' : '?') + new Date().getTime();\n }\n const request = new settings.Request(url, { ...settings.init, ...init });\n // Handle authentication. Authentication can be overdetermined by\n // settings token and XSRF token.\n let authenticated = false;\n if (settings.token) {\n authenticated = true;\n request.headers.append('Authorization', `token ${settings.token}`);\n }\n if (typeof document !== 'undefined' && (document === null || document === void 0 ? void 0 : document.cookie)) {\n const xsrfToken = getCookie('_xsrf');\n if (xsrfToken !== undefined) {\n authenticated = true;\n request.headers.append('X-XSRFToken', xsrfToken);\n }\n }\n // Set the content type if there is no given data and we are\n // using an authenticated connection.\n if (!request.headers.has('Content-Type') && authenticated) {\n request.headers.set('Content-Type', 'application/json');\n }\n // Use `call` to avoid a `TypeError` in the browser.\n return settings.fetch.call(null, request).catch((e) => {\n // Convert the TypeError into a more specific error.\n throw new ServerConnection.NetworkError(e);\n });\n // TODO: *this* is probably where we need a system-wide connectionFailure\n // signal we can hook into.\n }\n Private.handleRequest = handleRequest;\n /**\n * Get a cookie from the document.\n */\n function getCookie(name) {\n // From http://www.tornadoweb.org/en/stable/guide/security.html\n const matches = document.cookie.match('\\\\b' + name + '=([^;]*)\\\\b');\n return matches === null || matches === void 0 ? void 0 : matches[1];\n }\n})(Private || (Private = {}));\n//# sourceMappingURL=serverconnection.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SessionConnection = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst restapi_1 = require(\"./restapi\");\nconst coreutils_1 = require(\"@lumino/coreutils\");\n/**\n * Session object for accessing the session REST api. The session\n * should be used to start kernels and then shut them down -- for\n * all other kernel operations, the kernel object should be used.\n */\nclass SessionConnection {\n /**\n * Construct a new session.\n */\n constructor(options) {\n var _a, _b, _c, _d;\n this._id = '';\n this._path = '';\n this._name = '';\n this._type = '';\n this._kernel = null;\n this._isDisposed = false;\n this._disposed = new signaling_1.Signal(this);\n this._kernelChanged = new signaling_1.Signal(this);\n this._statusChanged = new signaling_1.Signal(this);\n this._connectionStatusChanged = new signaling_1.Signal(this);\n this._pendingInput = new signaling_1.Signal(this);\n this._iopubMessage = new signaling_1.Signal(this);\n this._unhandledMessage = new signaling_1.Signal(this);\n this._anyMessage = new signaling_1.Signal(this);\n this._propertyChanged = new signaling_1.Signal(this);\n this._id = options.model.id;\n this._name = options.model.name;\n this._path = options.model.path;\n this._type = options.model.type;\n this._username = (_a = options.username) !== null && _a !== void 0 ? _a : '';\n this._clientId = (_b = options.clientId) !== null && _b !== void 0 ? _b : coreutils_1.UUID.uuid4();\n this._connectToKernel = options.connectToKernel;\n this._kernelConnectionOptions = (_c = options.kernelConnectionOptions) !== null && _c !== void 0 ? _c : {};\n this.serverSettings =\n (_d = options.serverSettings) !== null && _d !== void 0 ? _d : __1.ServerConnection.makeSettings();\n this.setupKernel(options.model.kernel);\n }\n /**\n * A signal emitted when the session is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * A signal emitted when the kernel changes.\n */\n get kernelChanged() {\n return this._kernelChanged;\n }\n /**\n * A signal proxied from the connection about the kernel status.\n */\n get statusChanged() {\n return this._statusChanged;\n }\n /**\n * A signal proxied from the kernel about the connection status.\n */\n get connectionStatusChanged() {\n return this._connectionStatusChanged;\n }\n /**\n * A signal proxied from the kernel pending input.\n */\n get pendingInput() {\n return this._pendingInput;\n }\n /**\n * A signal proxied from the kernel about iopub kernel messages.\n */\n get iopubMessage() {\n return this._iopubMessage;\n }\n /**\n * A signal proxied from the kernel for an unhandled kernel message.\n */\n get unhandledMessage() {\n return this._unhandledMessage;\n }\n /**\n * A signal proxied from the kernel emitted for any kernel message.\n *\n * #### Notes\n * The behavior is undefined if the message is modified during message\n * handling. As such, it should be treated as read-only.\n */\n get anyMessage() {\n return this._anyMessage;\n }\n /**\n * A signal emitted when a session property changes.\n */\n get propertyChanged() {\n return this._propertyChanged;\n }\n /**\n * Get the session id.\n */\n get id() {\n return this._id;\n }\n /**\n * Get the session kernel connection object.\n *\n * #### Notes\n * This is a read-only property, and can be altered by [changeKernel].\n */\n get kernel() {\n return this._kernel;\n }\n /**\n * Get the session path.\n */\n get path() {\n return this._path;\n }\n /**\n * Get the session type.\n */\n get type() {\n return this._type;\n }\n /**\n * Get the session name.\n */\n get name() {\n return this._name;\n }\n /**\n * Get the model associated with the session.\n */\n get model() {\n return {\n id: this.id,\n kernel: this.kernel && { id: this.kernel.id, name: this.kernel.name },\n path: this._path,\n type: this._type,\n name: this._name\n };\n }\n /**\n * Test whether the session has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Update the session based on a session model from the server.\n *\n * #### Notes\n * This only updates this session connection instance. Use `setPath`,\n * `setName`, `setType`, and `changeKernel` to change the session values on\n * the server.\n */\n update(model) {\n const oldModel = this.model;\n this._path = model.path;\n this._name = model.name;\n this._type = model.type;\n if ((this._kernel === null && model.kernel !== null) ||\n (this._kernel !== null && model.kernel === null) ||\n (this._kernel !== null &&\n model.kernel !== null &&\n this._kernel.id !== model.kernel.id)) {\n if (this._kernel !== null) {\n this._kernel.dispose();\n }\n const oldValue = this._kernel || null;\n this.setupKernel(model.kernel);\n const newValue = this._kernel || null;\n this._kernelChanged.emit({ name: 'kernel', oldValue, newValue });\n }\n this._handleModelChange(oldModel);\n }\n /**\n * Dispose of the resources held by the session.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._disposed.emit();\n if (this._kernel) {\n this._kernel.dispose();\n const oldValue = this._kernel;\n this._kernel = null;\n const newValue = this._kernel;\n this._kernelChanged.emit({ name: 'kernel', oldValue, newValue });\n }\n signaling_1.Signal.clearData(this);\n }\n /**\n * Change the session path.\n *\n * @param path - The new session path.\n *\n * @returns A promise that resolves when the session has renamed.\n *\n * #### Notes\n * This uses the Jupyter REST API, and the response is validated.\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\n async setPath(path) {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await this._patch({ path });\n }\n /**\n * Change the session name.\n */\n async setName(name) {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await this._patch({ name });\n }\n /**\n * Change the session type.\n */\n async setType(type) {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await this._patch({ type });\n }\n /**\n * Change the kernel.\n *\n * @param options - The name or id of the new kernel.\n *\n * #### Notes\n * This shuts down the existing kernel and creates a new kernel,\n * keeping the existing session ID and session path.\n */\n async changeKernel(options) {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await this._patch({ kernel: options });\n return this.kernel;\n }\n /**\n * Kill the kernel and shutdown the session.\n *\n * @returns - The promise fulfilled on a valid response from the server.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/sessions), and validates the response.\n * Disposes of the session and emits a [sessionDied] signal on success.\n */\n async shutdown() {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await (0, restapi_1.shutdownSession)(this.id, this.serverSettings);\n this.dispose();\n }\n /**\n * Create a new kernel connection and connect to its signals.\n *\n * #### Notes\n * This method is not meant to be subclassed.\n */\n setupKernel(model) {\n if (model === null) {\n this._kernel = null;\n return;\n }\n const kc = this._connectToKernel({\n ...this._kernelConnectionOptions,\n model,\n username: this._username,\n clientId: this._clientId,\n serverSettings: this.serverSettings\n });\n this._kernel = kc;\n kc.statusChanged.connect(this.onKernelStatus, this);\n kc.connectionStatusChanged.connect(this.onKernelConnectionStatus, this);\n kc.pendingInput.connect(this.onPendingInput, this);\n kc.unhandledMessage.connect(this.onUnhandledMessage, this);\n kc.iopubMessage.connect(this.onIOPubMessage, this);\n kc.anyMessage.connect(this.onAnyMessage, this);\n }\n /**\n * Handle to changes in the Kernel status.\n */\n onKernelStatus(sender, state) {\n this._statusChanged.emit(state);\n }\n /**\n * Handle to changes in the Kernel status.\n */\n onKernelConnectionStatus(sender, state) {\n this._connectionStatusChanged.emit(state);\n }\n /**\n * Handle a change in the pendingInput.\n */\n onPendingInput(sender, state) {\n this._pendingInput.emit(state);\n }\n /**\n * Handle iopub kernel messages.\n */\n onIOPubMessage(sender, msg) {\n this._iopubMessage.emit(msg);\n }\n /**\n * Handle unhandled kernel messages.\n */\n onUnhandledMessage(sender, msg) {\n this._unhandledMessage.emit(msg);\n }\n /**\n * Handle any kernel messages.\n */\n onAnyMessage(sender, args) {\n this._anyMessage.emit(args);\n }\n /**\n * Send a PATCH to the server, updating the session path or the kernel.\n */\n async _patch(body) {\n const model = await (0, restapi_1.updateSession)({ ...body, id: this._id }, this.serverSettings);\n this.update(model);\n return model;\n }\n /**\n * Handle a change to the model.\n */\n _handleModelChange(oldModel) {\n if (oldModel.name !== this._name) {\n this._propertyChanged.emit('name');\n }\n if (oldModel.type !== this._type) {\n this._propertyChanged.emit('type');\n }\n if (oldModel.path !== this._path) {\n this._propertyChanged.emit('path');\n }\n }\n}\nexports.SessionConnection = SessionConnection;\n//# sourceMappingURL=default.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SessionAPI = exports.Session = void 0;\nconst Session = __importStar(require(\"./session\"));\nexports.Session = Session;\nconst SessionAPI = __importStar(require(\"./restapi\"));\nexports.SessionAPI = SessionAPI;\n__exportStar(require(\"./manager\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SessionManager = void 0;\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst serverconnection_1 = require(\"../serverconnection\");\nconst basemanager_1 = require(\"../basemanager\");\nconst default_1 = require(\"./default\");\nconst restapi_1 = require(\"./restapi\");\n/**\n * An implementation of a session manager.\n */\nclass SessionManager extends basemanager_1.BaseManager {\n /**\n * Construct a new session manager.\n *\n * @param options - The default options for each session.\n */\n constructor(options) {\n var _a;\n super(options);\n this._isReady = false;\n this._sessionConnections = new Set();\n this._models = new Map();\n this._runningChanged = new signaling_1.Signal(this);\n this._connectionFailure = new signaling_1.Signal(this);\n // We define these here so they bind `this` correctly\n this._connectToKernel = (options) => {\n return this._kernelManager.connectTo(options);\n };\n this._kernelManager = options.kernelManager;\n // Start model polling with exponential backoff.\n this._pollModels = new polling_1.Poll({\n auto: false,\n factory: () => this.requestRunning(),\n frequency: {\n interval: 10 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: `@jupyterlab/services:SessionManager#models`,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n // Initialize internal data.\n this._ready = (async () => {\n await this._pollModels.start();\n await this._pollModels.tick;\n if (this._kernelManager.isActive) {\n await this._kernelManager.ready;\n }\n this._isReady = true;\n })();\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * A signal emitted when the running sessions change.\n */\n get runningChanged() {\n return this._runningChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._models.clear();\n this._sessionConnections.forEach(x => x.dispose());\n this._pollModels.dispose();\n super.dispose();\n }\n /*\n * Connect to a running session. See also [[connectToSession]].\n */\n connectTo(options) {\n const sessionConnection = new default_1.SessionConnection({\n ...options,\n connectToKernel: this._connectToKernel,\n serverSettings: this.serverSettings\n });\n this._onStarted(sessionConnection);\n if (!this._models.has(options.model.id)) {\n // We trust the user to connect to an existing session, but we verify\n // asynchronously.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n return sessionConnection;\n }\n /**\n * Create an iterator over the most recent running sessions.\n *\n * @returns A new iterator over the running sessions.\n */\n running() {\n return this._models.values();\n }\n /**\n * Force a refresh of the running sessions.\n *\n * @returns A promise that with the list of running sessions.\n *\n * #### Notes\n * This is not typically meant to be called by the user, since the\n * manager maintains its own internal state.\n */\n async refreshRunning() {\n await this._pollModels.refresh();\n await this._pollModels.tick;\n }\n /**\n * Start a new session. See also [[startNewSession]].\n *\n * @param createOptions - Options for creating the session\n *\n * @param connectOptions - Options for connecting to the session\n */\n async startNew(createOptions, connectOptions = {}) {\n const model = await (0, restapi_1.startSession)(createOptions, this.serverSettings);\n await this.refreshRunning();\n return this.connectTo({ ...connectOptions, model });\n }\n /**\n * Shut down a session by id.\n */\n async shutdown(id) {\n await (0, restapi_1.shutdownSession)(id, this.serverSettings);\n await this.refreshRunning();\n }\n /**\n * Shut down all sessions.\n *\n * @returns A promise that resolves when all of the kernels are shut down.\n */\n async shutdownAll() {\n // Update the list of models to make sure our list is current.\n await this.refreshRunning();\n // Shut down all models.\n await Promise.all([...this._models.keys()].map(id => (0, restapi_1.shutdownSession)(id, this.serverSettings)));\n // Update the list of models to clear out our state.\n await this.refreshRunning();\n }\n /**\n * Find a session associated with a path and stop it if it is the only session\n * using that kernel.\n *\n * @param path - The path in question.\n *\n * @returns A promise that resolves when the relevant sessions are stopped.\n */\n async stopIfNeeded(path) {\n try {\n const sessions = await (0, restapi_1.listRunning)(this.serverSettings);\n const matches = sessions.filter(value => value.path === path);\n if (matches.length === 1) {\n const id = matches[0].id;\n await this.shutdown(id);\n }\n }\n catch (error) {\n /* Always succeed. */\n }\n }\n /**\n * Find a session by id.\n */\n async findById(id) {\n if (this._models.has(id)) {\n return this._models.get(id);\n }\n await this.refreshRunning();\n return this._models.get(id);\n }\n /**\n * Find a session by path.\n */\n async findByPath(path) {\n for (const m of this._models.values()) {\n if (m.path === path) {\n return m;\n }\n }\n await this.refreshRunning();\n for (const m of this._models.values()) {\n if (m.path === path) {\n return m;\n }\n }\n return undefined;\n }\n /**\n * Execute a request to the server to poll running kernels and update state.\n */\n async requestRunning() {\n var _a, _b;\n let models;\n try {\n models = await (0, restapi_1.listRunning)(this.serverSettings);\n }\n catch (err) {\n // Handle network errors, as well as cases where we are on a\n // JupyterHub and the server is not running. JupyterHub returns a\n // 503 (<2.0) or 424 (>2.0) in that case.\n if (err instanceof serverconnection_1.ServerConnection.NetworkError ||\n ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === 503 ||\n ((_b = err.response) === null || _b === void 0 ? void 0 : _b.status) === 424) {\n this._connectionFailure.emit(err);\n }\n throw err;\n }\n if (this.isDisposed) {\n return;\n }\n if (this._models.size === models.length &&\n models.every(model => {\n var _a, _b, _c, _d;\n const existing = this._models.get(model.id);\n if (!existing) {\n return false;\n }\n return (((_a = existing.kernel) === null || _a === void 0 ? void 0 : _a.id) === ((_b = model.kernel) === null || _b === void 0 ? void 0 : _b.id) &&\n ((_c = existing.kernel) === null || _c === void 0 ? void 0 : _c.name) === ((_d = model.kernel) === null || _d === void 0 ? void 0 : _d.name) &&\n existing.name === model.name &&\n existing.path === model.path &&\n existing.type === model.type);\n })) {\n // Identical models list (presuming models does not contain duplicate\n // ids), so just return\n return;\n }\n this._models = new Map(models.map(x => [x.id, x]));\n this._sessionConnections.forEach(sc => {\n if (this._models.has(sc.id)) {\n sc.update(this._models.get(sc.id));\n }\n else {\n sc.dispose();\n }\n });\n this._runningChanged.emit(models);\n }\n /**\n * Handle a session starting.\n */\n _onStarted(sessionConnection) {\n this._sessionConnections.add(sessionConnection);\n sessionConnection.disposed.connect(this._onDisposed, this);\n sessionConnection.propertyChanged.connect(this._onChanged, this);\n sessionConnection.kernelChanged.connect(this._onChanged, this);\n }\n _onDisposed(sessionConnection) {\n this._sessionConnections.delete(sessionConnection);\n // A session termination emission could mean the server session is deleted,\n // or that the session JS object is disposed and the session still exists on\n // the server, so we refresh from the server to make sure we reflect the\n // server state.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n _onChanged() {\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n}\nexports.SessionManager = SessionManager;\n/**\n * The namespace for `SessionManager` class statics.\n */\n(function (SessionManager) {\n /**\n * A no-op session manager to be used when starting sessions is not supported.\n */\n class NoopManager extends SessionManager {\n constructor() {\n super(...arguments);\n this._readyPromise = new Promise(() => {\n /* no-op */\n });\n }\n /**\n * Whether the manager is active.\n */\n get isActive() {\n return false;\n }\n /**\n * Used for testing.\n */\n get parentReady() {\n return super.ready;\n }\n /**\n * Start a new session - throw an error since it is not supported.\n */\n async startNew(createOptions, connectOptions = {}) {\n return Promise.reject(new Error('Not implemented in no-op Session Manager'));\n }\n /*\n * Connect to a running session - throw an error since it is not supported.\n */\n connectTo(options) {\n throw Error('Not implemented in no-op Session Manager');\n }\n /**\n * A promise that fulfills when the manager is ready (never).\n */\n get ready() {\n return this.parentReady.then(() => this._readyPromise);\n }\n /**\n * Shut down a session by id - throw an error since it is not supported.\n */\n async shutdown(id) {\n return Promise.reject(new Error('Not implemented in no-op Session Manager'));\n }\n /**\n * Execute a request to the server to poll running sessions and update state.\n */\n async requestRunning() {\n return Promise.resolve();\n }\n }\n SessionManager.NoopManager = NoopManager;\n})(SessionManager = exports.SessionManager || (exports.SessionManager = {}));\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateSession = exports.startSession = exports.getSessionModel = exports.shutdownSession = exports.getSessionUrl = exports.listRunning = exports.SESSION_SERVICE_URL = void 0;\nconst serverconnection_1 = require(\"../serverconnection\");\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst validate_1 = require(\"./validate\");\n/**\n * The url for the session service.\n */\nexports.SESSION_SERVICE_URL = 'api/sessions';\n/**\n * List the running sessions.\n */\nasync function listRunning(settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.SESSION_SERVICE_URL);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n if (!Array.isArray(data)) {\n throw new Error('Invalid Session list');\n }\n data.forEach(m => {\n (0, validate_1.updateLegacySessionModel)(m);\n (0, validate_1.validateModel)(m);\n });\n return data;\n}\nexports.listRunning = listRunning;\n/**\n * Get a session url.\n */\nfunction getSessionUrl(baseUrl, id) {\n return coreutils_1.URLExt.join(baseUrl, exports.SESSION_SERVICE_URL, id);\n}\nexports.getSessionUrl = getSessionUrl;\n/**\n * Shut down a session by id.\n */\nasync function shutdownSession(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n var _a;\n const url = getSessionUrl(settings.baseUrl, id);\n const init = { method: 'DELETE' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status === 404) {\n const data = await response.json();\n const msg = (_a = data.message) !== null && _a !== void 0 ? _a : `The session \"${id}\"\" does not exist on the server`;\n console.warn(msg);\n }\n else if (response.status === 410) {\n throw new serverconnection_1.ServerConnection.ResponseError(response, 'The kernel was deleted but the session was not');\n }\n else if (response.status !== 204) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n}\nexports.shutdownSession = shutdownSession;\n/**\n * Get a full session model from the server by session id string.\n */\nasync function getSessionModel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = getSessionUrl(settings.baseUrl, id);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.updateLegacySessionModel)(data);\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.getSessionModel = getSessionModel;\n/**\n * Create a new session, or return an existing session if the session path\n * already exists.\n */\nasync function startSession(options, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.SESSION_SERVICE_URL);\n const init = {\n method: 'POST',\n body: JSON.stringify(options)\n };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 201) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.updateLegacySessionModel)(data);\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.startSession = startSession;\n/**\n * Send a PATCH to the server, updating the session path or the kernel.\n */\nasync function updateSession(model, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = getSessionUrl(settings.baseUrl, model.id);\n const init = {\n method: 'PATCH',\n body: JSON.stringify(model)\n };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.updateLegacySessionModel)(data);\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.updateSession = updateSession;\n//# sourceMappingURL=restapi.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=session.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateModels = exports.updateLegacySessionModel = exports.validateModel = void 0;\nconst validate_1 = require(\"../kernel/validate\");\nconst validate_2 = require(\"../validate\");\n/**\n * Validate an `Session.IModel` object.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction validateModel(data) {\n (0, validate_2.validateProperty)(data, 'id', 'string');\n (0, validate_2.validateProperty)(data, 'type', 'string');\n (0, validate_2.validateProperty)(data, 'name', 'string');\n (0, validate_2.validateProperty)(data, 'path', 'string');\n (0, validate_2.validateProperty)(data, 'kernel', 'object');\n (0, validate_1.validateModel)(data.kernel);\n}\nexports.validateModel = validateModel;\n/**\n * Update model from legacy session data.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction updateLegacySessionModel(data) {\n if (data.path === undefined && data.notebook !== undefined) {\n data.path = data.notebook.path;\n data.type = 'notebook';\n data.name = '';\n }\n}\nexports.updateLegacySessionModel = updateLegacySessionModel;\n/**\n * Validate an array of `Session.IModel` objects.\n */\nfunction validateModels(models) {\n if (!Array.isArray(models)) {\n throw new Error('Invalid session list');\n }\n models.forEach(d => validateModel(d));\n}\nexports.validateModels = validateModels;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SettingManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst statedb_1 = require(\"@jupyterlab/statedb\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the lab settings service.\n */\nconst SERVICE_SETTINGS_URL = 'api/settings';\n/**\n * The settings API service manager.\n */\nclass SettingManager extends statedb_1.DataConnector {\n /**\n * Create a new setting manager.\n */\n constructor(options = {}) {\n var _a;\n super();\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n }\n /**\n * Fetch a plugin's settings.\n *\n * @param id - The plugin's ID.\n *\n * @returns A promise that resolves if successful.\n */\n async fetch(id) {\n if (!id) {\n throw new Error('Plugin `id` parameter is required for settings fetch.');\n }\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n const response = await makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n const err = await ResponseError.create(response);\n throw err;\n }\n // Assert what type the server response is returning.\n return response.json();\n }\n /**\n * Fetch the list of all plugin setting bundles.\n *\n * @returns A promise that resolves if successful.\n */\n async list(query) {\n var _a, _b, _c, _d;\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, '', query === 'ids');\n const response = await makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n throw new ResponseError(response);\n }\n const json = await response.json();\n const ids = (_b = (_a = json === null || json === void 0 ? void 0 : json['settings']) === null || _a === void 0 ? void 0 : _a.map((plugin) => plugin.id)) !== null && _b !== void 0 ? _b : [];\n let values = [];\n if (!query) {\n values =\n (_d = (_c = json === null || json === void 0 ? void 0 : json['settings']) === null || _c === void 0 ? void 0 : _c.map((plugin) => {\n plugin.data = { composite: {}, user: {} };\n return plugin;\n })) !== null && _d !== void 0 ? _d : [];\n }\n return { ids, values };\n }\n /**\n * Save a plugin's settings.\n *\n * @param id - The plugin's ID.\n *\n * @param raw - The user setting values as a raw string of JSON with comments.\n *\n * @returns A promise that resolves if successful.\n */\n async save(id, raw) {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n // NOTE: 'raw' is JSON5 (not valid JSON), so we encode it as a string in a valid JSON body\n const init = { body: JSON.stringify({ raw }), method: 'PUT' };\n const response = await makeRequest(url, init, serverSettings);\n if (response.status !== 204) {\n throw new ResponseError(response);\n }\n }\n}\nexports.SettingManager = SettingManager;\n/**\n * A namespace for private data.\n */\nvar Private;\n(function (Private) {\n /**\n * Get the url for a plugin's settings.\n */\n function url(base, id, idsOnly) {\n const idsOnlyParam = idsOnly\n ? coreutils_1.URLExt.objectToQueryString({ ids_only: true })\n : '';\n return `${coreutils_1.URLExt.join(base, SERVICE_SETTINGS_URL, id)}${idsOnlyParam}`;\n }\n Private.url = url;\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","\"use strict\";\n/*\n * Copyright (c) Jupyter Development Team.\n * Distributed under the terms of the Modified BSD License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = WebSocket;\n//# sourceMappingURL=ws.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TerminalConnection = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst coreutils_2 = require(\"@lumino/coreutils\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst restapi_1 = require(\"./restapi\");\n/**\n * An implementation of a terminal interface.\n */\nclass TerminalConnection {\n /**\n * Construct a new terminal session.\n */\n constructor(options) {\n var _a;\n /**\n * Create the terminal websocket connection and add socket status handlers.\n *\n * #### Notes\n * You are responsible for updating the connection status as appropriate.\n */\n this._createSocket = () => {\n this._errorIfDisposed();\n // Make sure the socket is clear\n this._clearSocket();\n // Update the connection status to reflect opening a new connection.\n this._updateConnectionStatus('connecting');\n const name = this._name;\n const settings = this.serverSettings;\n let url = coreutils_1.URLExt.join(settings.wsUrl, 'terminals', 'websocket', encodeURIComponent(name));\n // If token authentication is in use.\n const token = settings.token;\n if (settings.appendToken && token !== '') {\n url = url + `?token=${encodeURIComponent(token)}`;\n }\n this._ws = new settings.WebSocket(url);\n this._ws.onmessage = this._onWSMessage;\n this._ws.onclose = this._onWSClose;\n this._ws.onerror = this._onWSClose;\n };\n // Websocket messages events are defined as variables to bind `this`\n this._onWSMessage = (event) => {\n if (this._isDisposed) {\n return;\n }\n const data = JSON.parse(event.data);\n // Handle a disconnect message.\n if (data[0] === 'disconnect') {\n this.dispose();\n }\n if (this._connectionStatus === 'connecting') {\n // After reconnection, ignore all messages until a 'setup' message\n // before we are truly connected. Setting the connection status to\n // connected only then means that if we do not get a setup message\n // before our retry timeout, we will delete the websocket and try again.\n if (data[0] === 'setup') {\n this._updateConnectionStatus('connected');\n }\n return;\n }\n this._messageReceived.emit({\n type: data[0],\n content: data.slice(1)\n });\n };\n this._onWSClose = (event) => {\n console.warn(`Terminal websocket closed: ${event.code}`);\n if (!this.isDisposed) {\n this._reconnect();\n }\n };\n this._connectionStatus = 'connecting';\n this._connectionStatusChanged = new signaling_1.Signal(this);\n this._isDisposed = false;\n this._disposed = new signaling_1.Signal(this);\n this._messageReceived = new signaling_1.Signal(this);\n this._reconnectTimeout = null;\n this._ws = null;\n this._noOp = () => {\n /* no-op */\n };\n this._reconnectLimit = 7;\n this._reconnectAttempt = 0;\n this._pendingMessages = [];\n this._name = options.model.name;\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : __1.ServerConnection.makeSettings();\n this._createSocket();\n }\n /**\n * A signal emitted when the session is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * A signal emitted when a message is received from the server.\n */\n get messageReceived() {\n return this._messageReceived;\n }\n /**\n * Get the name of the terminal session.\n */\n get name() {\n return this._name;\n }\n /**\n * Get the model for the terminal session.\n */\n get model() {\n return { name: this._name };\n }\n /**\n * Test whether the session is disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources held by the session.\n */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._disposed.emit();\n this._updateConnectionStatus('disconnected');\n this._clearSocket();\n signaling_1.Signal.clearData(this);\n }\n /**\n * Send a message to the terminal session.\n *\n * #### Notes\n * If the connection is down, the message will be queued for sending when\n * the connection comes back up.\n */\n send(message) {\n this._sendMessage(message);\n }\n /**\n * Send a message on the websocket, or possibly queue for later sending.\n *\n * @param queue - whether to queue the message if it cannot be sent\n */\n _sendMessage(message, queue = true) {\n if (this._isDisposed || !message.content) {\n return;\n }\n if (this.connectionStatus === 'connected' && this._ws) {\n const msg = [message.type, ...message.content];\n this._ws.send(JSON.stringify(msg));\n }\n else if (queue) {\n this._pendingMessages.push(message);\n }\n else {\n throw new Error(`Could not send message: ${JSON.stringify(message)}`);\n }\n }\n /**\n * Send pending messages to the kernel.\n */\n _sendPending() {\n // We check to make sure we are still connected each time. For\n // example, if a websocket buffer overflows, it may close, so we should\n // stop sending messages.\n while (this.connectionStatus === 'connected' &&\n this._pendingMessages.length > 0) {\n this._sendMessage(this._pendingMessages[0], false);\n // We shift the message off the queue after the message is sent so that\n // if there is an exception, the message is still pending.\n this._pendingMessages.shift();\n }\n }\n /**\n * Reconnect to a terminal.\n *\n * #### Notes\n * This may try multiple times to reconnect to a terminal, and will sever\n * any existing connection.\n */\n reconnect() {\n this._errorIfDisposed();\n const result = new coreutils_2.PromiseDelegate();\n // Set up a listener for the connection status changing, which accepts or\n // rejects after the retries are done.\n const fulfill = (sender, status) => {\n if (status === 'connected') {\n result.resolve();\n this.connectionStatusChanged.disconnect(fulfill, this);\n }\n else if (status === 'disconnected') {\n result.reject(new Error('Terminal connection disconnected'));\n this.connectionStatusChanged.disconnect(fulfill, this);\n }\n };\n this.connectionStatusChanged.connect(fulfill, this);\n // Reset the reconnect limit so we start the connection attempts fresh\n this._reconnectAttempt = 0;\n // Start the reconnection process, which will also clear any existing\n // connection.\n this._reconnect();\n // Return the promise that should resolve on connection or reject if the\n // retries don't work.\n return result.promise;\n }\n /**\n * Attempt a connection if we have not exhausted connection attempts.\n */\n _reconnect() {\n this._errorIfDisposed();\n // Clear any existing reconnection attempt\n clearTimeout(this._reconnectTimeout);\n // Update the connection status and schedule a possible reconnection.\n if (this._reconnectAttempt < this._reconnectLimit) {\n this._updateConnectionStatus('connecting');\n // The first reconnect attempt should happen immediately, and subsequent\n // attempts should pick a random number in a growing range so that we\n // don't overload the server with synchronized reconnection attempts\n // across multiple kernels.\n const timeout = Private.getRandomIntInclusive(0, 1e3 * (Math.pow(2, this._reconnectAttempt) - 1));\n console.error(`Connection lost, reconnecting in ${Math.floor(timeout / 1000)} seconds.`);\n this._reconnectTimeout = setTimeout(this._createSocket, timeout);\n this._reconnectAttempt += 1;\n }\n else {\n this._updateConnectionStatus('disconnected');\n }\n // Clear the websocket event handlers and the socket itself.\n this._clearSocket();\n }\n /**\n * Forcefully clear the socket state.\n *\n * #### Notes\n * This will clear all socket state without calling any handlers and will\n * not update the connection status. If you call this method, you are\n * responsible for updating the connection status as needed and recreating\n * the socket if you plan to reconnect.\n */\n _clearSocket() {\n if (this._ws !== null) {\n // Clear the websocket event handlers and the socket itself.\n this._ws.onopen = this._noOp;\n this._ws.onclose = this._noOp;\n this._ws.onerror = this._noOp;\n this._ws.onmessage = this._noOp;\n this._ws.close();\n this._ws = null;\n }\n }\n /**\n * Shut down the terminal session.\n */\n async shutdown() {\n await (0, restapi_1.shutdownTerminal)(this.name, this.serverSettings);\n this.dispose();\n }\n /**\n * Clone the current terminal connection.\n */\n clone() {\n return new TerminalConnection(this);\n }\n /**\n * Handle connection status changes.\n */\n _updateConnectionStatus(connectionStatus) {\n if (this._connectionStatus === connectionStatus) {\n return;\n }\n this._connectionStatus = connectionStatus;\n // If we are not 'connecting', stop any reconnection attempts.\n if (connectionStatus !== 'connecting') {\n this._reconnectAttempt = 0;\n clearTimeout(this._reconnectTimeout);\n }\n // Send the pending messages if we just connected.\n if (connectionStatus === 'connected') {\n this._sendPending();\n }\n // Notify others that the connection status changed.\n this._connectionStatusChanged.emit(connectionStatus);\n }\n /**\n * Utility function to throw an error if this instance is disposed.\n */\n _errorIfDisposed() {\n if (this.isDisposed) {\n throw new Error('Terminal connection is disposed');\n }\n }\n /**\n * A signal emitted when the terminal connection status changes.\n */\n get connectionStatusChanged() {\n return this._connectionStatusChanged;\n }\n /**\n * The current connection status of the terminal connection.\n */\n get connectionStatus() {\n return this._connectionStatus;\n }\n}\nexports.TerminalConnection = TerminalConnection;\nvar Private;\n(function (Private) {\n /**\n * Get the url for a terminal.\n */\n function getTermUrl(baseUrl, name) {\n return coreutils_1.URLExt.join(baseUrl, restapi_1.TERMINAL_SERVICE_URL, encodeURIComponent(name));\n }\n Private.getTermUrl = getTermUrl;\n /**\n * Get a random integer between min and max, inclusive of both.\n *\n * #### Notes\n * From\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#Getting_a_random_integer_between_two_values_inclusive\n *\n * From the MDN page: It might be tempting to use Math.round() to accomplish\n * that, but doing so would cause your random numbers to follow a non-uniform\n * distribution, which may not be acceptable for your needs.\n */\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n Private.getRandomIntInclusive = getRandomIntInclusive;\n})(Private || (Private = {}));\n//# sourceMappingURL=default.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TerminalAPI = exports.Terminal = void 0;\nconst Terminal = __importStar(require(\"./terminal\"));\nexports.Terminal = Terminal;\nconst TerminalAPI = __importStar(require(\"./restapi\"));\nexports.TerminalAPI = TerminalAPI;\n__exportStar(require(\"./manager\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TerminalManager = void 0;\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst basemanager_1 = require(\"../basemanager\");\nconst restapi_1 = require(\"./restapi\");\nconst default_1 = require(\"./default\");\n/**\n * A terminal session manager.\n */\nclass TerminalManager extends basemanager_1.BaseManager {\n /**\n * Construct a new terminal manager.\n */\n constructor(options = {}) {\n var _a;\n super(options);\n this._isReady = false;\n // As an optimization, we unwrap the models to just store the names.\n this._names = [];\n this._terminalConnections = new Set();\n this._runningChanged = new signaling_1.Signal(this);\n this._connectionFailure = new signaling_1.Signal(this);\n // Check if terminals are available\n if (!this.isAvailable()) {\n this._ready = Promise.reject('Terminals unavailable');\n this._ready.catch(_ => undefined);\n return;\n }\n // Start polling with exponential backoff.\n this._pollModels = new polling_1.Poll({\n auto: false,\n factory: () => this.requestRunning(),\n frequency: {\n interval: 10 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: `@jupyterlab/services:TerminalManager#models`,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n // Initialize internal data.\n this._ready = (async () => {\n await this._pollModels.start();\n await this._pollModels.tick;\n this._isReady = true;\n })();\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * A signal emitted when the running terminals change.\n */\n get runningChanged() {\n return this._runningChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._names.length = 0;\n this._terminalConnections.forEach(x => x.dispose());\n this._pollModels.dispose();\n super.dispose();\n }\n /**\n * Whether the terminal service is available.\n */\n isAvailable() {\n return (0, restapi_1.isAvailable)();\n }\n /*\n * Connect to a running terminal.\n *\n * @param options - The options used to connect to the terminal.\n *\n * @returns The new terminal connection instance.\n *\n * #### Notes\n * The manager `serverSettings` will be used.\n */\n connectTo(options) {\n const terminalConnection = new default_1.TerminalConnection({\n ...options,\n serverSettings: this.serverSettings\n });\n this._onStarted(terminalConnection);\n if (!this._names.includes(options.model.name)) {\n // We trust the user to connect to an existing session, but we verify\n // asynchronously.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n return terminalConnection;\n }\n /**\n * Create an iterator over the most recent running terminals.\n *\n * @returns A new iterator over the running terminals.\n */\n running() {\n return this._models[Symbol.iterator]();\n }\n /**\n * Force a refresh of the running terminals.\n *\n * @returns A promise that with the list of running terminals.\n *\n * #### Notes\n * This is intended to be called only in response to a user action,\n * since the manager maintains its internal state.\n */\n async refreshRunning() {\n await this._pollModels.refresh();\n await this._pollModels.tick;\n }\n /**\n * Create a new terminal session.\n *\n * @param options - The options used to create the terminal.\n *\n * @returns A promise that resolves with the terminal connection instance.\n *\n * #### Notes\n * The manager `serverSettings` will be used unless overridden in the\n * options.\n */\n async startNew(options) {\n const model = await (0, restapi_1.startNew)(this.serverSettings, options === null || options === void 0 ? void 0 : options.name, options === null || options === void 0 ? void 0 : options.cwd);\n await this.refreshRunning();\n return this.connectTo({ model });\n }\n /**\n * Shut down a terminal session by name.\n */\n async shutdown(name) {\n await (0, restapi_1.shutdownTerminal)(name, this.serverSettings);\n await this.refreshRunning();\n }\n /**\n * Shut down all terminal sessions.\n *\n * @returns A promise that resolves when all of the sessions are shut down.\n */\n async shutdownAll() {\n // Update the list of models to make sure our list is current.\n await this.refreshRunning();\n // Shut down all models.\n await Promise.all(this._names.map(name => (0, restapi_1.shutdownTerminal)(name, this.serverSettings)));\n // Update the list of models to clear out our state.\n await this.refreshRunning();\n }\n /**\n * Execute a request to the server to poll running terminals and update state.\n */\n async requestRunning() {\n var _a, _b;\n let models;\n try {\n models = await (0, restapi_1.listRunning)(this.serverSettings);\n }\n catch (err) {\n // Handle network errors, as well as cases where we are on a\n // JupyterHub and the server is not running. JupyterHub returns a\n // 503 (<2.0) or 424 (>2.0) in that case.\n if (err instanceof __1.ServerConnection.NetworkError ||\n ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === 503 ||\n ((_b = err.response) === null || _b === void 0 ? void 0 : _b.status) === 424) {\n this._connectionFailure.emit(err);\n }\n throw err;\n }\n if (this.isDisposed) {\n return;\n }\n const names = models.map(({ name }) => name).sort();\n if (names === this._names) {\n // Identical models list, so just return\n return;\n }\n this._names = names;\n this._terminalConnections.forEach(tc => {\n if (!names.includes(tc.name)) {\n tc.dispose();\n }\n });\n this._runningChanged.emit(this._models);\n }\n /**\n * Handle a session starting.\n */\n _onStarted(terminalConnection) {\n this._terminalConnections.add(terminalConnection);\n terminalConnection.disposed.connect(this._onDisposed, this);\n }\n /**\n * Handle a session terminating.\n */\n _onDisposed(terminalConnection) {\n this._terminalConnections.delete(terminalConnection);\n // Update the running models to make sure we reflect the server state\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n get _models() {\n return this._names.map(name => {\n return { name };\n });\n }\n}\nexports.TerminalManager = TerminalManager;\n/**\n * The namespace for TerminalManager statics.\n */\n(function (TerminalManager) {\n /**\n * A no-op terminal manager to be used when starting terminals is not supported.\n */\n class NoopManager extends TerminalManager {\n constructor() {\n super(...arguments);\n this._readyPromise = new Promise(() => {\n /* no-op */\n });\n }\n /**\n * Whether the manager is active.\n */\n get isActive() {\n return false;\n }\n /**\n * Used for testing.\n */\n get parentReady() {\n return super.ready;\n }\n /**\n * A promise that fulfills when the manager is ready (never).\n */\n get ready() {\n return this.parentReady.then(() => this._readyPromise);\n }\n /**\n * Create a new terminal session - throw an error since it is not supported.\n *\n */\n async startNew(options) {\n return Promise.reject(new Error('Not implemented in no-op Terminal Manager'));\n }\n /*\n * Connect to a running terminal - throw an error since it is not supported.\n */\n connectTo(options) {\n throw Error('Not implemented in no-op Terminal Manager');\n }\n /**\n * Shut down a session by id - throw an error since it is not supported.\n */\n async shutdown(id) {\n return Promise.reject(new Error('Not implemented in no-op Terminal Manager'));\n }\n /**\n * Execute a request to the server to poll running sessions and update state.\n */\n async requestRunning() {\n return Promise.resolve();\n }\n }\n TerminalManager.NoopManager = NoopManager;\n})(TerminalManager = exports.TerminalManager || (exports.TerminalManager = {}));\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.shutdownTerminal = exports.listRunning = exports.startNew = exports.isAvailable = exports.TERMINAL_SERVICE_URL = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the terminal service.\n */\nexports.TERMINAL_SERVICE_URL = 'api/terminals';\n/**\n * Whether the terminal service is available.\n */\nfunction isAvailable() {\n const available = String(coreutils_1.PageConfig.getOption('terminalsAvailable'));\n return available.toLowerCase() === 'true';\n}\nexports.isAvailable = isAvailable;\n/**\n * Start a new terminal session.\n *\n * @param settings - The server settings to use.\n *\n * @param name - The name of the target terminal.\n *\n * @param cwd - The path in which the terminal will start.\n *\n * @returns A promise that resolves with the session model.\n */\nasync function startNew(settings = serverconnection_1.ServerConnection.makeSettings(), name, cwd) {\n Private.errorIfNotAvailable();\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.TERMINAL_SERVICE_URL);\n const init = {\n method: 'POST',\n body: JSON.stringify({ name, cwd })\n };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n // TODO: Validate model\n return data;\n}\nexports.startNew = startNew;\n/**\n * List the running terminal sessions.\n *\n * @param settings - The server settings to use.\n *\n * @returns A promise that resolves with the list of running session models.\n */\nasync function listRunning(settings = serverconnection_1.ServerConnection.makeSettings()) {\n Private.errorIfNotAvailable();\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.TERMINAL_SERVICE_URL);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n if (!Array.isArray(data)) {\n throw new Error('Invalid terminal list');\n }\n // TODO: validate each model\n return data;\n}\nexports.listRunning = listRunning;\n/**\n * Shut down a terminal session by name.\n *\n * @param name - The name of the target session.\n *\n * @param settings - The server settings to use.\n *\n * @returns A promise that resolves when the session is shut down.\n */\nasync function shutdownTerminal(name, settings = serverconnection_1.ServerConnection.makeSettings()) {\n var _a;\n Private.errorIfNotAvailable();\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.TERMINAL_SERVICE_URL, name);\n const init = { method: 'DELETE' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status === 404) {\n const data = await response.json();\n const msg = (_a = data.message) !== null && _a !== void 0 ? _a : `The terminal session \"${name}\"\" does not exist on the server`;\n console.warn(msg);\n }\n else if (response.status !== 204) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n}\nexports.shutdownTerminal = shutdownTerminal;\nvar Private;\n(function (Private) {\n /**\n * Throw an error if terminals are not available.\n */\n function errorIfNotAvailable() {\n if (!isAvailable()) {\n throw new Error('Terminals Unavailable');\n }\n }\n Private.errorIfNotAvailable = errorIfNotAvailable;\n})(Private || (Private = {}));\n//# sourceMappingURL=restapi.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isAvailable = void 0;\nconst restapi_1 = require(\"./restapi\");\nObject.defineProperty(exports, \"isAvailable\", { enumerable: true, get: function () { return restapi_1.isAvailable; } });\n//# sourceMappingURL=terminal.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UserManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst coreutils_2 = require(\"@lumino/coreutils\");\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst serverconnection_1 = require(\"../serverconnection\");\nconst basemanager_1 = require(\"../basemanager\");\n/**\n * The url for the lab workspaces service.\n */\nconst SERVICE_USER_URL = 'api/me';\n/**\n * The service's ID.\n * Used to uniquely identify the poll, and\n * the item in local storage.\n */\nconst SERVICE_ID = '@jupyterlab/services:UserManager#user';\n/**\n * The user API service manager.\n */\nclass UserManager extends basemanager_1.BaseManager {\n /**\n * Create a new user manager.\n */\n constructor(options = {}) {\n var _a;\n super(options);\n this._isReady = false;\n this._userChanged = new signaling_1.Signal(this);\n this._connectionFailure = new signaling_1.Signal(this);\n // Initialize internal data.\n this._ready = this.requestUser()\n .then(() => {\n if (this.isDisposed) {\n return;\n }\n this._isReady = true;\n })\n .catch(_ => \n // Return a promise that will never resolve, so user service is never ready\n // This typically occurs when the backend has no user service\n new Promise(() => {\n // no-op\n }));\n this._pollSpecs = new polling_1.Poll({\n auto: false,\n factory: () => this.requestUser(),\n frequency: {\n interval: 61 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: SERVICE_ID,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n void this.ready.then(() => {\n void this._pollSpecs.start();\n });\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * Get the most recently fetched identity.\n */\n get identity() {\n return this._identity;\n }\n /**\n * Get the most recently fetched permissions.\n */\n get permissions() {\n return this._permissions;\n }\n /**\n * A signal emitted when the user changes.\n */\n get userChanged() {\n return this._userChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n this._pollSpecs.dispose();\n super.dispose();\n }\n /**\n * Force a refresh of the specs from the server.\n *\n * @returns A promise that resolves when the specs are fetched.\n *\n * #### Notes\n * This is intended to be called only in response to a user action,\n * since the manager maintains its internal state.\n */\n async refreshUser() {\n await this._pollSpecs.refresh();\n await this._pollSpecs.tick;\n }\n /**\n * Execute a request to the server to poll the user and update state.\n */\n async requestUser() {\n if (this.isDisposed) {\n return;\n }\n const { baseUrl } = this.serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const url = coreutils_1.URLExt.join(baseUrl, SERVICE_USER_URL);\n const response = await makeRequest(url, {}, this.serverSettings);\n if (response.status !== 200) {\n const err = await ResponseError.create(response);\n throw err;\n }\n const oldUser = {\n identity: this._identity,\n permissions: this._permissions\n };\n const newUser = await response.json();\n const identity = newUser.identity;\n // store the color and initials for the user\n // this info is not provided by the server\n const { localStorage } = window;\n const data = localStorage.getItem(SERVICE_ID);\n if (data && (!identity.initials || !identity.color)) {\n const localUser = JSON.parse(data);\n identity.initials =\n identity.initials ||\n localUser.initials ||\n identity.name.substring(0, 1);\n identity.color =\n identity.color || localUser.color || Private.getRandomColor();\n }\n if (!coreutils_2.JSONExt.deepEqual(newUser, oldUser)) {\n this._identity = identity;\n this._permissions = newUser.permissions;\n localStorage.setItem(SERVICE_ID, JSON.stringify(identity));\n this._userChanged.emit(newUser);\n }\n }\n}\nexports.UserManager = UserManager;\n/**\n * A namespace for module-private functionality.\n *\n * Note: We do not want to export this function\n * to move it to css variables in the Theme.\n */\nvar Private;\n(function (Private) {\n /**\n * Predefined colors for users\n */\n const userColors = [\n 'var(--jp-collaborator-color1)',\n 'var(--jp-collaborator-color2)',\n 'var(--jp-collaborator-color3)',\n 'var(--jp-collaborator-color4)',\n 'var(--jp-collaborator-color5)',\n 'var(--jp-collaborator-color6)',\n 'var(--jp-collaborator-color7)'\n ];\n /**\n * Get a random color from the list of colors.\n */\n Private.getRandomColor = () => userColors[Math.floor(Math.random() * userColors.length)];\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateProperty = void 0;\n/**\n * Validate a property as being on an object, and optionally\n * of a given type and among a given set of values.\n */\nfunction validateProperty(\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nobject, name, typeName, values = []) {\n if (!object.hasOwnProperty(name)) {\n throw Error(`Missing property '${name}'`);\n }\n const value = object[name];\n if (typeName !== void 0) {\n let valid = true;\n switch (typeName) {\n case 'array':\n valid = Array.isArray(value);\n break;\n case 'object':\n valid = typeof value !== 'undefined';\n break;\n default:\n valid = typeof value === typeName;\n }\n if (!valid) {\n throw new Error(`Property '${name}' is not of type '${typeName}'`);\n }\n if (values.length > 0) {\n let valid = true;\n switch (typeName) {\n case 'string':\n case 'number':\n case 'boolean':\n valid = values.includes(value);\n break;\n default:\n valid = values.findIndex(v => v === value) >= 0;\n break;\n }\n if (!valid) {\n throw new Error(`Property '${name}' is not one of the valid values ${JSON.stringify(values)}`);\n }\n }\n }\n}\nexports.validateProperty = validateProperty;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorkspaceManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst statedb_1 = require(\"@jupyterlab/statedb\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the lab workspaces service.\n */\nconst SERVICE_WORKSPACES_URL = 'api/workspaces';\n/**\n * The workspaces API service manager.\n */\nclass WorkspaceManager extends statedb_1.DataConnector {\n /**\n * Create a new workspace manager.\n */\n constructor(options = {}) {\n var _a;\n super();\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n }\n /**\n * Fetch a workspace.\n *\n * @param id - The workspace's ID.\n *\n * @returns A promise that resolves if successful.\n */\n async fetch(id) {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n const response = await makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n const err = await ResponseError.create(response);\n throw err;\n }\n return response.json();\n }\n /**\n * Fetch the list of workspace IDs that exist on the server.\n *\n * @returns A promise that resolves if successful.\n */\n async list() {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, '');\n const response = await makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n const err = await ResponseError.create(response);\n throw err;\n }\n const result = await response.json();\n return result.workspaces;\n }\n /**\n * Remove a workspace from the server.\n *\n * @param id - The workspaces's ID.\n *\n * @returns A promise that resolves if successful.\n */\n async remove(id) {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n const init = { method: 'DELETE' };\n const response = await makeRequest(url, init, serverSettings);\n if (response.status !== 204) {\n const err = await ResponseError.create(response);\n throw err;\n }\n }\n /**\n * Save a workspace.\n *\n * @param id - The workspace's ID.\n *\n * @param workspace - The workspace being saved.\n *\n * @returns A promise that resolves if successful.\n */\n async save(id, workspace) {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n const init = { body: JSON.stringify(workspace), method: 'PUT' };\n const response = await makeRequest(url, init, serverSettings);\n if (response.status !== 204) {\n const err = await ResponseError.create(response);\n throw err;\n }\n }\n}\nexports.WorkspaceManager = WorkspaceManager;\n/**\n * A namespace for private data.\n */\nvar Private;\n(function (Private) {\n /**\n * Get the url for a workspace.\n */\n function url(base, id) {\n return coreutils_1.URLExt.join(base, SERVICE_WORKSPACES_URL, id);\n }\n Private.url = url;\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DataConnector = void 0;\n/**\n * An abstract class that adheres to the data connector interface.\n *\n * @typeparam T - The basic entity response type a service's connector.\n *\n * @typeparam U - The basic entity request type, which is conventionally the\n * same as the response type but may be different if a service's implementation\n * requires input data to be different from output responses. Defaults to `T`.\n *\n * @typeparam V - The basic token applied to a request, conventionally a string\n * ID or filter, but may be set to a different type when an implementation\n * requires it. Defaults to `string`.\n *\n * @typeparam W - The type of the optional `query` parameter of the `list`\n * method. Defaults to `string`.\n *\n * #### Notes\n * The only abstract method in this class is the `fetch` method, which must be\n * reimplemented by all subclasses. The `remove` and `save` methods have a\n * default implementation that returns a promise that will always reject. This\n * class is a convenience superclass for connectors that only need to `fetch`.\n */\nclass DataConnector {\n /**\n * Retrieve the list of items available from the data connector.\n *\n * @param query - The optional query filter to apply to the connector request.\n *\n * @returns A promise that always rejects with an error.\n *\n * #### Notes\n * Subclasses should reimplement if they support a back-end that can list.\n */\n async list(query) {\n throw new Error('DataConnector#list method has not been implemented.');\n }\n /**\n * Remove a value using the data connector.\n *\n * @param id - The identifier for the data being removed.\n *\n * @returns A promise that always rejects with an error.\n *\n * #### Notes\n * Subclasses should reimplement if they support a back-end that can remove.\n */\n async remove(id) {\n throw new Error('DataConnector#remove method has not been implemented.');\n }\n /**\n * Save a value using the data connector.\n *\n * @param id - The identifier for the data being saved.\n *\n * @param value - The data being saved.\n *\n * @returns A promise that always rejects with an error.\n *\n * #### Notes\n * Subclasses should reimplement if they support a back-end that can save.\n */\n async save(id, value) {\n throw new Error('DataConnector#save method has not been implemented.');\n }\n}\nexports.DataConnector = DataConnector;\n//# sourceMappingURL=dataconnector.js.map","\"use strict\";\n/* -----------------------------------------------------------------------------\n| Copyright (c) Jupyter Development Team.\n| Distributed under the terms of the Modified BSD License.\n|----------------------------------------------------------------------------*/\n/**\n * @packageDocumentation\n * @module statedb\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./dataconnector\"), exports);\n__exportStar(require(\"./interfaces\"), exports);\n__exportStar(require(\"./restorablepool\"), exports);\n__exportStar(require(\"./statedb\"), exports);\n__exportStar(require(\"./tokens\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=interfaces.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RestorablePool = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nconst properties_1 = require(\"@lumino/properties\");\nconst signaling_1 = require(\"@lumino/signaling\");\n/**\n * An object pool that supports restoration.\n *\n * @typeparam T - The type of object being tracked.\n */\nclass RestorablePool {\n /**\n * Create a new restorable pool.\n *\n * @param options - The instantiation options for a restorable pool.\n */\n constructor(options) {\n this._added = new signaling_1.Signal(this);\n this._current = null;\n this._currentChanged = new signaling_1.Signal(this);\n this._hasRestored = false;\n this._isDisposed = false;\n this._objects = new Set();\n this._restore = null;\n this._restored = new coreutils_1.PromiseDelegate();\n this._updated = new signaling_1.Signal(this);\n this.namespace = options.namespace;\n }\n /**\n * A signal emitted when an object object is added.\n *\n * #### Notes\n * This signal will only fire when an object is added to the pool.\n * It will not fire if an object injected into the pool.\n */\n get added() {\n return this._added;\n }\n /**\n * The current object.\n *\n * #### Notes\n * The restorable pool does not set `current`. It is intended for client use.\n *\n * If `current` is set to an object that does not exist in the pool, it is a\n * no-op.\n */\n get current() {\n return this._current;\n }\n set current(obj) {\n if (this._current === obj) {\n return;\n }\n if (obj !== null && this._objects.has(obj)) {\n this._current = obj;\n this._currentChanged.emit(this._current);\n }\n }\n /**\n * A signal emitted when the current widget changes.\n */\n get currentChanged() {\n return this._currentChanged;\n }\n /**\n * Test whether the pool is disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * A promise resolved when the restorable pool has been restored.\n */\n get restored() {\n return this._restored.promise;\n }\n /**\n * The number of objects held by the pool.\n */\n get size() {\n return this._objects.size;\n }\n /**\n * A signal emitted when an object is updated.\n */\n get updated() {\n return this._updated;\n }\n /**\n * Add a new object to the pool.\n *\n * @param obj - The object object being added.\n *\n * #### Notes\n * The object passed into the pool is added synchronously; its existence in\n * the pool can be checked with the `has()` method. The promise this method\n * returns resolves after the object has been added and saved to an underlying\n * restoration connector, if one is available.\n */\n async add(obj) {\n var _a, _b;\n if (obj.isDisposed) {\n const warning = 'A disposed object cannot be added.';\n console.warn(warning, obj);\n throw new Error(warning);\n }\n if (this._objects.has(obj)) {\n const warning = 'This object already exists in the pool.';\n console.warn(warning, obj);\n throw new Error(warning);\n }\n this._objects.add(obj);\n obj.disposed.connect(this._onInstanceDisposed, this);\n if (Private.injectedProperty.get(obj)) {\n return;\n }\n if (this._restore) {\n const { connector } = this._restore;\n const objName = this._restore.name(obj);\n if (objName) {\n const name = `${this.namespace}:${objName}`;\n const data = (_b = (_a = this._restore).args) === null || _b === void 0 ? void 0 : _b.call(_a, obj);\n Private.nameProperty.set(obj, name);\n await connector.save(name, { data });\n }\n }\n // Emit the added signal.\n this._added.emit(obj);\n }\n /**\n * Dispose of the resources held by the pool.\n *\n * #### Notes\n * Disposing a pool does not affect the underlying data in the data connector,\n * it simply disposes the client-side pool without making any connector calls.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._current = null;\n this._isDisposed = true;\n this._objects.clear();\n signaling_1.Signal.clearData(this);\n }\n /**\n * Find the first object in the pool that satisfies a filter function.\n *\n * @param - fn The filter function to call on each object.\n */\n find(fn) {\n const values = this._objects.values();\n for (const value of values) {\n if (fn(value)) {\n return value;\n }\n }\n return undefined;\n }\n /**\n * Iterate through each object in the pool.\n *\n * @param fn - The function to call on each object.\n */\n forEach(fn) {\n this._objects.forEach(fn);\n }\n /**\n * Filter the objects in the pool based on a predicate.\n *\n * @param fn - The function by which to filter.\n */\n filter(fn) {\n const filtered = [];\n this.forEach(obj => {\n if (fn(obj)) {\n filtered.push(obj);\n }\n });\n return filtered;\n }\n /**\n * Inject an object into the restorable pool without the pool handling its\n * restoration lifecycle.\n *\n * @param obj - The object to inject into the pool.\n */\n inject(obj) {\n Private.injectedProperty.set(obj, true);\n return this.add(obj);\n }\n /**\n * Check if this pool has the specified object.\n *\n * @param obj - The object whose existence is being checked.\n */\n has(obj) {\n return this._objects.has(obj);\n }\n /**\n * Restore the objects in this pool's namespace.\n *\n * @param options - The configuration options that describe restoration.\n *\n * @returns A promise that resolves when restoration has completed.\n *\n * #### Notes\n * This function should almost never be invoked by client code. Its primary\n * use case is to be invoked by a layout restorer plugin that handles\n * multiple restorable pools and, when ready, asks them each to restore their\n * respective objects.\n */\n async restore(options) {\n if (this._hasRestored) {\n throw new Error('This pool has already been restored.');\n }\n this._hasRestored = true;\n const { command, connector, registry, when } = options;\n const namespace = this.namespace;\n const promises = when\n ? [connector.list(namespace)].concat(when)\n : [connector.list(namespace)];\n this._restore = options;\n const [saved] = await Promise.all(promises);\n const values = await Promise.all(saved.ids.map(async (id, index) => {\n const value = saved.values[index];\n const args = value && value.data;\n if (args === undefined) {\n return connector.remove(id);\n }\n // Execute the command and if it fails, delete the state restore data.\n return registry\n .execute(command, args)\n .catch(() => connector.remove(id));\n }));\n this._restored.resolve();\n return values;\n }\n /**\n * Save the restore data for a given object.\n *\n * @param obj - The object being saved.\n */\n async save(obj) {\n var _a, _b;\n const injected = Private.injectedProperty.get(obj);\n if (!this._restore || !this.has(obj) || injected) {\n return;\n }\n const { connector } = this._restore;\n const objName = this._restore.name(obj);\n const oldName = Private.nameProperty.get(obj);\n const newName = objName ? `${this.namespace}:${objName}` : '';\n if (oldName && oldName !== newName) {\n await connector.remove(oldName);\n }\n // Set the name property irrespective of whether the new name is null.\n Private.nameProperty.set(obj, newName);\n if (newName) {\n const data = (_b = (_a = this._restore).args) === null || _b === void 0 ? void 0 : _b.call(_a, obj);\n await connector.save(newName, { data });\n }\n if (oldName !== newName) {\n this._updated.emit(obj);\n }\n }\n /**\n * Clean up after disposed objects.\n */\n _onInstanceDisposed(obj) {\n this._objects.delete(obj);\n if (obj === this._current) {\n this._current = null;\n this._currentChanged.emit(this._current);\n }\n if (Private.injectedProperty.get(obj)) {\n return;\n }\n if (!this._restore) {\n return;\n }\n const { connector } = this._restore;\n const name = Private.nameProperty.get(obj);\n if (name) {\n void connector.remove(name);\n }\n }\n}\nexports.RestorablePool = RestorablePool;\n/*\n * A namespace for private data.\n */\nvar Private;\n(function (Private) {\n /**\n * An attached property to indicate whether an object has been injected.\n */\n Private.injectedProperty = new properties_1.AttachedProperty({\n name: 'injected',\n create: () => false\n });\n /**\n * An attached property for an object's ID.\n */\n Private.nameProperty = new properties_1.AttachedProperty({\n name: 'name',\n create: () => ''\n });\n})(Private || (Private = {}));\n//# sourceMappingURL=restorablepool.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StateDB = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\n/**\n * The default concrete implementation of a state database.\n */\nclass StateDB {\n /**\n * Create a new state database.\n *\n * @param options - The instantiation options for a state database.\n */\n constructor(options = {}) {\n this._changed = new signaling_1.Signal(this);\n const { connector, transform } = options;\n this._connector = connector || new StateDB.Connector();\n if (!transform) {\n this._ready = Promise.resolve(undefined);\n }\n else {\n this._ready = transform.then(transformation => {\n const { contents, type } = transformation;\n switch (type) {\n case 'cancel':\n return;\n case 'clear':\n return this._clear();\n case 'merge':\n return this._merge(contents || {});\n case 'overwrite':\n return this._overwrite(contents || {});\n default:\n return;\n }\n });\n }\n }\n /**\n * A signal that emits the change type any time a value changes.\n */\n get changed() {\n return this._changed;\n }\n /**\n * Clear the entire database.\n */\n async clear() {\n await this._ready;\n await this._clear();\n }\n /**\n * Retrieve a saved bundle from the database.\n *\n * @param id - The identifier used to retrieve a data bundle.\n *\n * @returns A promise that bears a data payload if available.\n *\n * #### Notes\n * The `id` values of stored items in the state database are formatted:\n * `'namespace:identifier'`, which is the same convention that command\n * identifiers in JupyterLab use as well. While this is not a technical\n * requirement for `fetch()`, `remove()`, and `save()`, it *is* necessary for\n * using the `list(namespace: string)` method.\n *\n * The promise returned by this method may be rejected if an error occurs in\n * retrieving the data. Non-existence of an `id` will succeed with the `value`\n * `undefined`.\n */\n async fetch(id) {\n await this._ready;\n return this._fetch(id);\n }\n /**\n * Retrieve all the saved bundles for a namespace.\n *\n * @param filter - The namespace prefix to retrieve.\n *\n * @returns A promise that bears a collection of payloads for a namespace.\n *\n * #### Notes\n * Namespaces are entirely conventional entities. The `id` values of stored\n * items in the state database are formatted: `'namespace:identifier'`, which\n * is the same convention that command identifiers in JupyterLab use as well.\n *\n * If there are any errors in retrieving the data, they will be logged to the\n * console in order to optimistically return any extant data without failing.\n * This promise will always succeed.\n */\n async list(namespace) {\n await this._ready;\n return this._list(namespace);\n }\n /**\n * Remove a value from the database.\n *\n * @param id - The identifier for the data being removed.\n *\n * @returns A promise that is rejected if remove fails and succeeds otherwise.\n */\n async remove(id) {\n await this._ready;\n await this._remove(id);\n this._changed.emit({ id, type: 'remove' });\n }\n /**\n * Save a value in the database.\n *\n * @param id - The identifier for the data being saved.\n *\n * @param value - The data being saved.\n *\n * @returns A promise that is rejected if saving fails and succeeds otherwise.\n *\n * #### Notes\n * The `id` values of stored items in the state database are formatted:\n * `'namespace:identifier'`, which is the same convention that command\n * identifiers in JupyterLab use as well. While this is not a technical\n * requirement for `fetch()`, `remove()`, and `save()`, it *is* necessary for\n * using the `list(namespace: string)` method.\n */\n async save(id, value) {\n await this._ready;\n await this._save(id, value);\n this._changed.emit({ id, type: 'save' });\n }\n /**\n * Return a serialized copy of the state database's entire contents.\n *\n * @returns A promise that resolves with the database contents as JSON.\n */\n async toJSON() {\n await this._ready;\n const { ids, values } = await this._list();\n return values.reduce((acc, val, idx) => {\n acc[ids[idx]] = val;\n return acc;\n }, {});\n }\n /**\n * Clear the entire database.\n */\n async _clear() {\n await Promise.all((await this._list()).ids.map(id => this._remove(id)));\n }\n /**\n * Fetch a value from the database.\n */\n async _fetch(id) {\n const value = await this._connector.fetch(id);\n if (value) {\n return JSON.parse(value).v;\n }\n }\n /**\n * Fetch a list from the database.\n */\n async _list(namespace = '') {\n const { ids, values } = await this._connector.list(namespace);\n return {\n ids,\n values: values.map(val => JSON.parse(val).v)\n };\n }\n /**\n * Merge data into the state database.\n */\n async _merge(contents) {\n await Promise.all(Object.keys(contents).map(key => contents[key] && this._save(key, contents[key])));\n }\n /**\n * Overwrite the entire database with new contents.\n */\n async _overwrite(contents) {\n await this._clear();\n await this._merge(contents);\n }\n /**\n * Remove a key in the database.\n */\n async _remove(id) {\n return this._connector.remove(id);\n }\n /**\n * Save a key and its value in the database.\n */\n async _save(id, value) {\n return this._connector.save(id, JSON.stringify({ v: value }));\n }\n}\nexports.StateDB = StateDB;\n/**\n * A namespace for StateDB statics.\n */\n(function (StateDB) {\n /**\n * An in-memory string key/value data connector.\n */\n class Connector {\n constructor() {\n this._storage = {};\n }\n /**\n * Retrieve an item from the data connector.\n */\n async fetch(id) {\n return this._storage[id];\n }\n /**\n * Retrieve the list of items available from the data connector.\n *\n * @param namespace - If not empty, only keys whose first token before `:`\n * exactly match `namespace` will be returned, e.g. `foo` in `foo:bar`.\n */\n async list(namespace = '') {\n return Object.keys(this._storage).reduce((acc, val) => {\n if (namespace === '' ? true : namespace === val.split(':')[0]) {\n acc.ids.push(val);\n acc.values.push(this._storage[val]);\n }\n return acc;\n }, { ids: [], values: [] });\n }\n /**\n * Remove a value using the data connector.\n */\n async remove(id) {\n delete this._storage[id];\n }\n /**\n * Save a value using the data connector.\n */\n async save(id, value) {\n this._storage[id] = value;\n }\n }\n StateDB.Connector = Connector;\n})(StateDB = exports.StateDB || (exports.StateDB = {}));\n//# sourceMappingURL=statedb.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IStateDB = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\n/**\n * The default state database token.\n */\nexports.IStateDB = new coreutils_1.Token('@jupyterlab/coreutils:IStateDB', `A service for the JupyterLab state database.\n Use this if you want to store data that will persist across page loads.\n See \"state database\" for more information.`);\n//# sourceMappingURL=tokens.js.map","// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * The namespace for array-specific algorithms.\n */\nvar ArrayExt;\n(function (ArrayExt) {\n /**\n * Find the index of the first occurrence of a value in an array.\n *\n * @param array - The array-like object to search.\n *\n * @param value - The value to locate in the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the first occurrence of the value, or `-1`\n * if the value is not found.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = ['one', 'two', 'three', 'four', 'one'];\n * ArrayExt.firstIndexOf(data, 'red'); // -1\n * ArrayExt.firstIndexOf(data, 'one'); // 0\n * ArrayExt.firstIndexOf(data, 'one', 1); // 4\n * ArrayExt.firstIndexOf(data, 'two', 2); // -1\n * ArrayExt.firstIndexOf(data, 'two', 2, 1); // 1\n * ```\n */\n function firstIndexOf(array, value, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return -1;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let span;\n if (stop < start) {\n span = stop + 1 + (n - start);\n }\n else {\n span = stop - start + 1;\n }\n for (let i = 0; i < span; ++i) {\n let j = (start + i) % n;\n if (array[j] === value) {\n return j;\n }\n }\n return -1;\n }\n ArrayExt.firstIndexOf = firstIndexOf;\n /**\n * Find the index of the last occurrence of a value in an array.\n *\n * @param array - The array-like object to search.\n *\n * @param value - The value to locate in the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the last occurrence of the value, or `-1`\n * if the value is not found.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the front of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = ['one', 'two', 'three', 'four', 'one'];\n * ArrayExt.lastIndexOf(data, 'red'); // -1\n * ArrayExt.lastIndexOf(data, 'one'); // 4\n * ArrayExt.lastIndexOf(data, 'one', 1); // 0\n * ArrayExt.lastIndexOf(data, 'two', 0); // -1\n * ArrayExt.lastIndexOf(data, 'two', 0, 1); // 1\n * ```\n */\n function lastIndexOf(array, value, start = -1, stop = 0) {\n let n = array.length;\n if (n === 0) {\n return -1;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let span;\n if (start < stop) {\n span = start + 1 + (n - stop);\n }\n else {\n span = start - stop + 1;\n }\n for (let i = 0; i < span; ++i) {\n let j = (start - i + n) % n;\n if (array[j] === value) {\n return j;\n }\n }\n return -1;\n }\n ArrayExt.lastIndexOf = lastIndexOf;\n /**\n * Find the index of the first value which matches a predicate.\n *\n * @param array - The array-like object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the first matching value, or `-1` if no\n * matching value is found.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [1, 2, 3, 4, 3, 2, 1];\n * ArrayExt.findFirstIndex(data, isEven); // 1\n * ArrayExt.findFirstIndex(data, isEven, 4); // 5\n * ArrayExt.findFirstIndex(data, isEven, 6); // -1\n * ArrayExt.findFirstIndex(data, isEven, 6, 5); // 1\n * ```\n */\n function findFirstIndex(array, fn, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return -1;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let span;\n if (stop < start) {\n span = stop + 1 + (n - start);\n }\n else {\n span = stop - start + 1;\n }\n for (let i = 0; i < span; ++i) {\n let j = (start + i) % n;\n if (fn(array[j], j)) {\n return j;\n }\n }\n return -1;\n }\n ArrayExt.findFirstIndex = findFirstIndex;\n /**\n * Find the index of the last value which matches a predicate.\n *\n * @param object - The array-like object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the last matching value, or `-1` if no\n * matching value is found.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the front of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [1, 2, 3, 4, 3, 2, 1];\n * ArrayExt.findLastIndex(data, isEven); // 5\n * ArrayExt.findLastIndex(data, isEven, 4); // 3\n * ArrayExt.findLastIndex(data, isEven, 0); // -1\n * ArrayExt.findLastIndex(data, isEven, 0, 1); // 5\n * ```\n */\n function findLastIndex(array, fn, start = -1, stop = 0) {\n let n = array.length;\n if (n === 0) {\n return -1;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let d;\n if (start < stop) {\n d = start + 1 + (n - stop);\n }\n else {\n d = start - stop + 1;\n }\n for (let i = 0; i < d; ++i) {\n let j = (start - i + n) % n;\n if (fn(array[j], j)) {\n return j;\n }\n }\n return -1;\n }\n ArrayExt.findLastIndex = findLastIndex;\n /**\n * Find the first value which matches a predicate.\n *\n * @param array - The array-like object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The first matching value, or `undefined` if no matching\n * value is found.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [1, 2, 3, 4, 3, 2, 1];\n * ArrayExt.findFirstValue(data, isEven); // 2\n * ArrayExt.findFirstValue(data, isEven, 2); // 4\n * ArrayExt.findFirstValue(data, isEven, 6); // undefined\n * ArrayExt.findFirstValue(data, isEven, 6, 5); // 2\n * ```\n */\n function findFirstValue(array, fn, start = 0, stop = -1) {\n let index = findFirstIndex(array, fn, start, stop);\n return index !== -1 ? array[index] : undefined;\n }\n ArrayExt.findFirstValue = findFirstValue;\n /**\n * Find the last value which matches a predicate.\n *\n * @param object - The array-like object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The last matching value, or `undefined` if no matching\n * value is found.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the front of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [1, 2, 3, 4, 3, 2, 1];\n * ArrayExt.findLastValue(data, isEven); // 2\n * ArrayExt.findLastValue(data, isEven, 4); // 4\n * ArrayExt.findLastValue(data, isEven, 0); // undefined\n * ArrayExt.findLastValue(data, isEven, 0, 1); // 2\n * ```\n */\n function findLastValue(array, fn, start = -1, stop = 0) {\n let index = findLastIndex(array, fn, start, stop);\n return index !== -1 ? array[index] : undefined;\n }\n ArrayExt.findLastValue = findLastValue;\n /**\n * Find the index of the first element which compares `>=` to a value.\n *\n * @param array - The sorted array-like object to search.\n *\n * @param value - The value to locate in the array.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if an element is less than a value, `0` if\n * an element is equal to a value, or `> 0` if an element is greater\n * than a value.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the first element which compares `>=` to the\n * value, or `length` if there is no such element. If the computed\n * index for `stop` is less than `start`, then the computed index\n * for `start` is returned.\n *\n * #### Notes\n * The array must already be sorted in ascending order according to\n * the comparison function.\n *\n * #### Complexity\n * Logarithmic.\n *\n * #### Undefined Behavior\n * Searching a range which is not sorted in ascending order.\n *\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * let data = [0, 3, 4, 7, 7, 9];\n * ArrayExt.lowerBound(data, 0, numberCmp); // 0\n * ArrayExt.lowerBound(data, 6, numberCmp); // 3\n * ArrayExt.lowerBound(data, 7, numberCmp); // 3\n * ArrayExt.lowerBound(data, -1, numberCmp); // 0\n * ArrayExt.lowerBound(data, 10, numberCmp); // 6\n * ```\n */\n function lowerBound(array, value, fn, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return 0;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let begin = start;\n let span = stop - start + 1;\n while (span > 0) {\n let half = span >> 1;\n let middle = begin + half;\n if (fn(array[middle], value) < 0) {\n begin = middle + 1;\n span -= half + 1;\n }\n else {\n span = half;\n }\n }\n return begin;\n }\n ArrayExt.lowerBound = lowerBound;\n /**\n * Find the index of the first element which compares `>` than a value.\n *\n * @param array - The sorted array-like object to search.\n *\n * @param value - The value to locate in the array.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if an element is less than a value, `0` if\n * an element is equal to a value, or `> 0` if an element is greater\n * than a value.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the first element which compares `>` than the\n * value, or `length` if there is no such element. If the computed\n * index for `stop` is less than `start`, then the computed index\n * for `start` is returned.\n *\n * #### Notes\n * The array must already be sorted in ascending order according to\n * the comparison function.\n *\n * #### Complexity\n * Logarithmic.\n *\n * #### Undefined Behavior\n * Searching a range which is not sorted in ascending order.\n *\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * let data = [0, 3, 4, 7, 7, 9];\n * ArrayExt.upperBound(data, 0, numberCmp); // 1\n * ArrayExt.upperBound(data, 6, numberCmp); // 3\n * ArrayExt.upperBound(data, 7, numberCmp); // 5\n * ArrayExt.upperBound(data, -1, numberCmp); // 0\n * ArrayExt.upperBound(data, 10, numberCmp); // 6\n * ```\n */\n function upperBound(array, value, fn, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return 0;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let begin = start;\n let span = stop - start + 1;\n while (span > 0) {\n let half = span >> 1;\n let middle = begin + half;\n if (fn(array[middle], value) > 0) {\n span = half;\n }\n else {\n begin = middle + 1;\n span -= half + 1;\n }\n }\n return begin;\n }\n ArrayExt.upperBound = upperBound;\n /**\n * Test whether two arrays are shallowly equal.\n *\n * @param a - The first array-like object to compare.\n *\n * @param b - The second array-like object to compare.\n *\n * @param fn - The comparison function to apply to the elements. It\n * should return `true` if the elements are \"equal\". The default\n * compares elements using strict `===` equality.\n *\n * @returns Whether the two arrays are shallowly equal.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * Modifying the length of the arrays while comparing.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let d1 = [0, 3, 4, 7, 7, 9];\n * let d2 = [0, 3, 4, 7, 7, 9];\n * let d3 = [42];\n * ArrayExt.shallowEqual(d1, d2); // true\n * ArrayExt.shallowEqual(d2, d3); // false\n * ```\n */\n function shallowEqual(a, b, fn) {\n // Check for object identity first.\n if (a === b) {\n return true;\n }\n // Bail early if the lengths are different.\n if (a.length !== b.length) {\n return false;\n }\n // Compare each element for equality.\n for (let i = 0, n = a.length; i < n; ++i) {\n if (fn ? !fn(a[i], b[i]) : a[i] !== b[i]) {\n return false;\n }\n }\n // The array are shallowly equal.\n return true;\n }\n ArrayExt.shallowEqual = shallowEqual;\n /**\n * Create a slice of an array subject to an optional step.\n *\n * @param array - The array-like object of interest.\n *\n * @param options - The options for configuring the slice.\n *\n * @returns A new array with the specified values.\n *\n * @throws An exception if the slice `step` is `0`.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start`, `stop`, or `step` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 3, 4, 7, 7, 9];\n * ArrayExt.slice(data); // [0, 3, 4, 7, 7, 9]\n * ArrayExt.slice(data, { start: 2 }); // [4, 7, 7, 9]\n * ArrayExt.slice(data, { start: 0, stop: 4 }); // [0, 3, 4, 7]\n * ArrayExt.slice(data, { step: 2 }); // [0, 4, 7]\n * ArrayExt.slice(data, { step: -1 }); // [9, 7, 7, 4, 3, 0]\n * ```\n */\n function slice(array, options = {}) {\n // Extract the options.\n let { start, stop, step } = options;\n // Set up the `step` value.\n if (step === undefined) {\n step = 1;\n }\n // Validate the step size.\n if (step === 0) {\n throw new Error('Slice `step` cannot be zero.');\n }\n // Look up the length of the array.\n let n = array.length;\n // Set up the `start` value.\n if (start === undefined) {\n start = step < 0 ? n - 1 : 0;\n }\n else if (start < 0) {\n start = Math.max(start + n, step < 0 ? -1 : 0);\n }\n else if (start >= n) {\n start = step < 0 ? n - 1 : n;\n }\n // Set up the `stop` value.\n if (stop === undefined) {\n stop = step < 0 ? -1 : n;\n }\n else if (stop < 0) {\n stop = Math.max(stop + n, step < 0 ? -1 : 0);\n }\n else if (stop >= n) {\n stop = step < 0 ? n - 1 : n;\n }\n // Compute the slice length.\n let length;\n if ((step < 0 && stop >= start) || (step > 0 && start >= stop)) {\n length = 0;\n }\n else if (step < 0) {\n length = Math.floor((stop - start + 1) / step + 1);\n }\n else {\n length = Math.floor((stop - start - 1) / step + 1);\n }\n // Compute the sliced result.\n let result = [];\n for (let i = 0; i < length; ++i) {\n result[i] = array[start + i * step];\n }\n // Return the result.\n return result;\n }\n ArrayExt.slice = slice;\n /**\n * Move an element in an array from one index to another.\n *\n * @param array - The mutable array-like object of interest.\n *\n * @param fromIndex - The index of the element to move. Negative\n * values are taken as an offset from the end of the array.\n *\n * @param toIndex - The target index of the element. Negative\n * values are taken as an offset from the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `fromIndex` or `toIndex` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from from '@lumino/algorithm';\n *\n * let data = [0, 1, 2, 3, 4];\n * ArrayExt.move(data, 1, 2); // [0, 2, 1, 3, 4]\n * ArrayExt.move(data, 4, 2); // [0, 2, 4, 1, 3]\n * ```\n */\n function move(array, fromIndex, toIndex) {\n let n = array.length;\n if (n <= 1) {\n return;\n }\n if (fromIndex < 0) {\n fromIndex = Math.max(0, fromIndex + n);\n }\n else {\n fromIndex = Math.min(fromIndex, n - 1);\n }\n if (toIndex < 0) {\n toIndex = Math.max(0, toIndex + n);\n }\n else {\n toIndex = Math.min(toIndex, n - 1);\n }\n if (fromIndex === toIndex) {\n return;\n }\n let value = array[fromIndex];\n let d = fromIndex < toIndex ? 1 : -1;\n for (let i = fromIndex; i !== toIndex; i += d) {\n array[i] = array[i + d];\n }\n array[toIndex] = value;\n }\n ArrayExt.move = move;\n /**\n * Reverse an array in-place.\n *\n * @param array - The mutable array-like object of interest.\n *\n * @param start - The index of the first element in the range to be\n * reversed, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * reversed, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` index which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 1, 2, 3, 4];\n * ArrayExt.reverse(data, 1, 3); // [0, 3, 2, 1, 4]\n * ArrayExt.reverse(data, 3); // [0, 3, 2, 4, 1]\n * ArrayExt.reverse(data); // [1, 4, 2, 3, 0]\n * ```\n */\n function reverse(array, start = 0, stop = -1) {\n let n = array.length;\n if (n <= 1) {\n return;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n while (start < stop) {\n let a = array[start];\n let b = array[stop];\n array[start++] = b;\n array[stop--] = a;\n }\n }\n ArrayExt.reverse = reverse;\n /**\n * Rotate the elements of an array in-place.\n *\n * @param array - The mutable array-like object of interest.\n *\n * @param delta - The amount of rotation to apply to the elements. A\n * positive value will rotate the elements to the left. A negative\n * value will rotate the elements to the right.\n *\n * @param start - The index of the first element in the range to be\n * rotated, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * rotated, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `delta`, `start`, or `stop` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 1, 2, 3, 4];\n * ArrayExt.rotate(data, 2); // [2, 3, 4, 0, 1]\n * ArrayExt.rotate(data, -2); // [0, 1, 2, 3, 4]\n * ArrayExt.rotate(data, 10); // [0, 1, 2, 3, 4]\n * ArrayExt.rotate(data, 9); // [4, 0, 1, 2, 3]\n * ArrayExt.rotate(data, 2, 1, 3); // [4, 2, 0, 1, 3]\n * ```\n */\n function rotate(array, delta, start = 0, stop = -1) {\n let n = array.length;\n if (n <= 1) {\n return;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n if (start >= stop) {\n return;\n }\n let length = stop - start + 1;\n if (delta > 0) {\n delta = delta % length;\n }\n else if (delta < 0) {\n delta = ((delta % length) + length) % length;\n }\n if (delta === 0) {\n return;\n }\n let pivot = start + delta;\n reverse(array, start, pivot - 1);\n reverse(array, pivot, stop);\n reverse(array, start, stop);\n }\n ArrayExt.rotate = rotate;\n /**\n * Fill an array with a static value.\n *\n * @param array - The mutable array-like object to fill.\n *\n * @param value - The static value to use to fill the array.\n *\n * @param start - The index of the first element in the range to be\n * filled, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * filled, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * #### Notes\n * If `stop < start` the fill will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = ['one', 'two', 'three', 'four'];\n * ArrayExt.fill(data, 'r'); // ['r', 'r', 'r', 'r']\n * ArrayExt.fill(data, 'g', 1); // ['r', 'g', 'g', 'g']\n * ArrayExt.fill(data, 'b', 2, 3); // ['r', 'g', 'b', 'b']\n * ArrayExt.fill(data, 'z', 3, 1); // ['z', 'z', 'b', 'z']\n * ```\n */\n function fill(array, value, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let span;\n if (stop < start) {\n span = stop + 1 + (n - start);\n }\n else {\n span = stop - start + 1;\n }\n for (let i = 0; i < span; ++i) {\n array[(start + i) % n] = value;\n }\n }\n ArrayExt.fill = fill;\n /**\n * Insert a value into an array at a specific index.\n *\n * @param array - The array of interest.\n *\n * @param index - The index at which to insert the value. Negative\n * values are taken as an offset from the end of the array.\n *\n * @param value - The value to set at the specified index.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * An `index` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 1, 2];\n * ArrayExt.insert(data, 0, -1); // [-1, 0, 1, 2]\n * ArrayExt.insert(data, 2, 12); // [-1, 0, 12, 1, 2]\n * ArrayExt.insert(data, -1, 7); // [-1, 0, 12, 1, 7, 2]\n * ArrayExt.insert(data, 6, 19); // [-1, 0, 12, 1, 7, 2, 19]\n * ```\n */\n function insert(array, index, value) {\n let n = array.length;\n if (index < 0) {\n index = Math.max(0, index + n);\n }\n else {\n index = Math.min(index, n);\n }\n for (let i = n; i > index; --i) {\n array[i] = array[i - 1];\n }\n array[index] = value;\n }\n ArrayExt.insert = insert;\n /**\n * Remove and return a value at a specific index in an array.\n *\n * @param array - The array of interest.\n *\n * @param index - The index of the value to remove. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The value at the specified index, or `undefined` if the\n * index is out of range.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * An `index` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeAt(data, 2); // 23\n * ArrayExt.removeAt(data, -2); // 12\n * ArrayExt.removeAt(data, 10); // undefined;\n * ```\n */\n function removeAt(array, index) {\n let n = array.length;\n if (index < 0) {\n index += n;\n }\n if (index < 0 || index >= n) {\n return undefined;\n }\n let value = array[index];\n for (let i = index + 1; i < n; ++i) {\n array[i - 1] = array[i];\n }\n array.length = n - 1;\n return value;\n }\n ArrayExt.removeAt = removeAt;\n /**\n * Remove the first occurrence of a value from an array.\n *\n * @param array - The array of interest.\n *\n * @param value - The value to remove from the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the removed value, or `-1` if the value\n * is not contained in the array.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeFirstOf(data, 12); // 1\n * ArrayExt.removeFirstOf(data, 17); // -1\n * ArrayExt.removeFirstOf(data, 39, 3); // -1\n * ArrayExt.removeFirstOf(data, 39, 3, 2); // 2\n * ```\n */\n function removeFirstOf(array, value, start = 0, stop = -1) {\n let index = firstIndexOf(array, value, start, stop);\n if (index !== -1) {\n removeAt(array, index);\n }\n return index;\n }\n ArrayExt.removeFirstOf = removeFirstOf;\n /**\n * Remove the last occurrence of a value from an array.\n *\n * @param array - The array of interest.\n *\n * @param value - The value to remove from the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the removed value, or `-1` if the value\n * is not contained in the array.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeLastOf(data, 12); // 5\n * ArrayExt.removeLastOf(data, 17); // -1\n * ArrayExt.removeLastOf(data, 39, 2); // -1\n * ArrayExt.removeLastOf(data, 39, 2, 3); // 3\n * ```\n */\n function removeLastOf(array, value, start = -1, stop = 0) {\n let index = lastIndexOf(array, value, start, stop);\n if (index !== -1) {\n removeAt(array, index);\n }\n return index;\n }\n ArrayExt.removeLastOf = removeLastOf;\n /**\n * Remove all occurrences of a value from an array.\n *\n * @param array - The array of interest.\n *\n * @param value - The value to remove from the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The number of elements removed from the array.\n *\n * #### Notes\n * If `stop < start` the search will conceptually wrap at the end of\n * the array, however the array will be traversed front-to-back.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [14, 12, 23, 39, 14, 12, 19, 14];\n * ArrayExt.removeAllOf(data, 12); // 2\n * ArrayExt.removeAllOf(data, 17); // 0\n * ArrayExt.removeAllOf(data, 14, 1, 4); // 1\n * ```\n */\n function removeAllOf(array, value, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return 0;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let count = 0;\n for (let i = 0; i < n; ++i) {\n if (start <= stop && i >= start && i <= stop && array[i] === value) {\n count++;\n }\n else if (stop < start &&\n (i <= stop || i >= start) &&\n array[i] === value) {\n count++;\n }\n else if (count > 0) {\n array[i - count] = array[i];\n }\n }\n if (count > 0) {\n array.length = n - count;\n }\n return count;\n }\n ArrayExt.removeAllOf = removeAllOf;\n /**\n * Remove the first occurrence of a value which matches a predicate.\n *\n * @param array - The array of interest.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The removed `{ index, value }`, which will be `-1` and\n * `undefined` if the value is not contained in the array.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeFirstWhere(data, isEven); // { index: 0, value: 0 }\n * ArrayExt.removeFirstWhere(data, isEven, 2); // { index: 3, value: 14 }\n * ArrayExt.removeFirstWhere(data, isEven, 4); // { index: -1, value: undefined }\n * ```\n */\n function removeFirstWhere(array, fn, start = 0, stop = -1) {\n let value;\n let index = findFirstIndex(array, fn, start, stop);\n if (index !== -1) {\n value = removeAt(array, index);\n }\n return { index, value };\n }\n ArrayExt.removeFirstWhere = removeFirstWhere;\n /**\n * Remove the last occurrence of a value which matches a predicate.\n *\n * @param array - The array of interest.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The removed `{ index, value }`, which will be `-1` and\n * `undefined` if the value is not contained in the array.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeLastWhere(data, isEven); // { index: 5, value: 12 }\n * ArrayExt.removeLastWhere(data, isEven, 2); // { index: 1, value: 12 }\n * ArrayExt.removeLastWhere(data, isEven, 2, 1); // { index: -1, value: undefined }\n * ```\n */\n function removeLastWhere(array, fn, start = -1, stop = 0) {\n let value;\n let index = findLastIndex(array, fn, start, stop);\n if (index !== -1) {\n value = removeAt(array, index);\n }\n return { index, value };\n }\n ArrayExt.removeLastWhere = removeLastWhere;\n /**\n * Remove all occurrences of values which match a predicate.\n *\n * @param array - The array of interest.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The number of elements removed from the array.\n *\n * #### Notes\n * If `stop < start` the search will conceptually wrap at the end of\n * the array, however the array will be traversed front-to-back.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * function isNegative(value: number): boolean {\n * return value < 0;\n * }\n *\n * let data = [0, 12, -13, -9, 23, 39, 14, -15, 12, 75];\n * ArrayExt.removeAllWhere(data, isEven); // 4\n * ArrayExt.removeAllWhere(data, isNegative, 0, 3); // 2\n * ```\n */\n function removeAllWhere(array, fn, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return 0;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let count = 0;\n for (let i = 0; i < n; ++i) {\n if (start <= stop && i >= start && i <= stop && fn(array[i], i)) {\n count++;\n }\n else if (stop < start && (i <= stop || i >= start) && fn(array[i], i)) {\n count++;\n }\n else if (count > 0) {\n array[i - count] = array[i];\n }\n }\n if (count > 0) {\n array.length = n - count;\n }\n return count;\n }\n ArrayExt.removeAllWhere = removeAllWhere;\n})(ArrayExt || (ArrayExt = {}));\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Chain together several iterables.\n *\n * @deprecated\n *\n * @param objects - The iterable objects of interest.\n *\n * @returns An iterator which yields the values of the iterables\n * in the order in which they are supplied.\n *\n * #### Example\n * ```typescript\n * import { chain } from '@lumino/algorithm';\n *\n * let data1 = [1, 2, 3];\n * let data2 = [4, 5, 6];\n *\n * let stream = chain(data1, data2);\n *\n * Array.from(stream); // [1, 2, 3, 4, 5, 6]\n * ```\n */\nfunction* chain(...objects) {\n for (const object of objects) {\n yield* object;\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an empty iterator.\n *\n * @returns A new iterator which yields nothing.\n *\n * #### Example\n * ```typescript\n * import { empty } from '@lumino/algorithm';\n *\n * let stream = empty();\n *\n * Array.from(stream); // []\n * ```\n */\n// eslint-disable-next-line require-yield\nfunction* empty() {\n return;\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Enumerate an iterable object.\n *\n * @param object - The iterable object of interest.\n *\n * @param start - The starting enum value. The default is `0`.\n *\n * @returns An iterator which yields the enumerated values.\n *\n * #### Example\n * ```typescript\n * import { enumerate } from '@lumino/algorithm';\n *\n * let data = ['foo', 'bar', 'baz'];\n *\n * let stream = enumerate(data, 1);\n *\n * Array.from(stream); // [[1, 'foo'], [2, 'bar'], [3, 'baz']]\n * ```\n */\nfunction* enumerate(object, start = 0) {\n for (const value of object) {\n yield [start++, value];\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Filter an iterable for values which pass a test.\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The predicate function to invoke for each value.\n *\n * @returns An iterator which yields the values which pass the test.\n *\n * #### Example\n * ```typescript\n * import { filter } from '@lumino/algorithm';\n *\n * let data = [1, 2, 3, 4, 5, 6];\n *\n * let stream = filter(data, value => value % 2 === 0);\n *\n * Array.from(stream); // [2, 4, 6]\n * ```\n */\nfunction* filter(object, fn) {\n let index = 0;\n for (const value of object) {\n if (fn(value, index++)) {\n yield value;\n }\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Find the first value in an iterable which matches a predicate.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @returns The first matching value, or `undefined` if no matching\n * value is found.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { find } from '@lumino/algorithm';\n *\n * interface IAnimal { species: string, name: string };\n *\n * function isCat(value: IAnimal): boolean {\n * return value.species === 'cat';\n * }\n *\n * let data: IAnimal[] = [\n * { species: 'dog', name: 'spot' },\n * { species: 'cat', name: 'fluffy' },\n * { species: 'alligator', name: 'pocho' }\n * ];\n *\n * find(data, isCat).name; // 'fluffy'\n * ```\n */\nfunction find(object, fn) {\n let index = 0;\n for (const value of object) {\n if (fn(value, index++)) {\n return value;\n }\n }\n return undefined;\n}\n/**\n * Find the index of the first value which matches a predicate.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @returns The index of the first matching value, or `-1` if no\n * matching value is found.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { findIndex } from '@lumino/algorithm';\n *\n * interface IAnimal { species: string, name: string };\n *\n * function isCat(value: IAnimal): boolean {\n * return value.species === 'cat';\n * }\n *\n * let data: IAnimal[] = [\n * { species: 'dog', name: 'spot' },\n * { species: 'cat', name: 'fluffy' },\n * { species: 'alligator', name: 'pocho' }\n * ];\n *\n * findIndex(data, isCat); // 1\n * ```\n */\nfunction findIndex(object, fn) {\n let index = 0;\n for (const value of object) {\n if (fn(value, index++)) {\n return index - 1;\n }\n }\n return -1;\n}\n/**\n * Find the minimum value in an iterable.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if the first value is less than the second.\n * `0` if the values are equivalent, or `> 0` if the first value is\n * greater than the second.\n *\n * @returns The minimum value in the iterable. If multiple values are\n * equivalent to the minimum, the left-most value is returned. If\n * the iterable is empty, this returns `undefined`.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { min } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * min([7, 4, 0, 3, 9, 4], numberCmp); // 0\n * ```\n */\nfunction min(object, fn) {\n let result = undefined;\n for (const value of object) {\n if (result === undefined) {\n result = value;\n continue;\n }\n if (fn(value, result) < 0) {\n result = value;\n }\n }\n return result;\n}\n/**\n * Find the maximum value in an iterable.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if the first value is less than the second.\n * `0` if the values are equivalent, or `> 0` if the first value is\n * greater than the second.\n *\n * @returns The maximum value in the iterable. If multiple values are\n * equivalent to the maximum, the left-most value is returned. If\n * the iterable is empty, this returns `undefined`.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { max } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * max([7, 4, 0, 3, 9, 4], numberCmp); // 9\n * ```\n */\nfunction max(object, fn) {\n let result = undefined;\n for (const value of object) {\n if (result === undefined) {\n result = value;\n continue;\n }\n if (fn(value, result) > 0) {\n result = value;\n }\n }\n return result;\n}\n/**\n * Find the minimum and maximum values in an iterable.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if the first value is less than the second.\n * `0` if the values are equivalent, or `> 0` if the first value is\n * greater than the second.\n *\n * @returns A 2-tuple of the `[min, max]` values in the iterable. If\n * multiple values are equivalent, the left-most values are returned.\n * If the iterable is empty, this returns `undefined`.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { minmax } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * minmax([7, 4, 0, 3, 9, 4], numberCmp); // [0, 9]\n * ```\n */\nfunction minmax(object, fn) {\n let empty = true;\n let vmin;\n let vmax;\n for (const value of object) {\n if (empty) {\n vmin = value;\n vmax = value;\n empty = false;\n }\n else if (fn(value, vmin) < 0) {\n vmin = value;\n }\n else if (fn(value, vmax) > 0) {\n vmax = value;\n }\n }\n return empty ? undefined : [vmin, vmax];\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an array from an iterable of values.\n *\n * @deprecated\n *\n * @param object - The iterable object of interest.\n *\n * @returns A new array of values from the given object.\n *\n * #### Example\n * ```typescript\n * import { toArray } from '@lumino/algorithm';\n *\n * let stream = [1, 2, 3, 4, 5, 6][Symbol.iterator]();\n *\n * toArray(stream); // [1, 2, 3, 4, 5, 6];\n * ```\n */\nfunction toArray(object) {\n return Array.from(object);\n}\n/**\n * Create an object from an iterable of key/value pairs.\n *\n * @param object - The iterable object of interest.\n *\n * @returns A new object mapping keys to values.\n *\n * #### Example\n * ```typescript\n * import { toObject } from '@lumino/algorithm';\n *\n * let data: [string, number][] = [['one', 1], ['two', 2], ['three', 3]];\n *\n * toObject(data); // { one: 1, two: 2, three: 3 }\n * ```\n */\nfunction toObject(object) {\n const result = {};\n for (const [key, value] of object) {\n result[key] = value;\n }\n return result;\n}\n/**\n * Invoke a function for each value in an iterable.\n *\n * @deprecated\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The callback function to invoke for each value.\n *\n * #### Notes\n * Iteration can be terminated early by returning `false` from the\n * callback function.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { each } from '@lumino/algorithm';\n *\n * let data = [5, 7, 0, -2, 9];\n *\n * each(data, value => { console.log(value); });\n * ```\n */\nfunction each(object, fn) {\n let index = 0;\n for (const value of object) {\n if (false === fn(value, index++)) {\n return;\n }\n }\n}\n/**\n * Test whether all values in an iterable satisfy a predicate.\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The predicate function to invoke for each value.\n *\n * @returns `true` if all values pass the test, `false` otherwise.\n *\n * #### Notes\n * Iteration terminates on the first `false` predicate result.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { every } from '@lumino/algorithm';\n *\n * let data = [5, 7, 1];\n *\n * every(data, value => value % 2 === 0); // false\n * every(data, value => value % 2 === 1); // true\n * ```\n */\nfunction every(object, fn) {\n let index = 0;\n for (const value of object) {\n if (false === fn(value, index++)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Test whether any value in an iterable satisfies a predicate.\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The predicate function to invoke for each value.\n *\n * @returns `true` if any value passes the test, `false` otherwise.\n *\n * #### Notes\n * Iteration terminates on the first `true` predicate result.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { some } from '@lumino/algorithm';\n *\n * let data = [5, 7, 1];\n *\n * some(data, value => value === 7); // true\n * some(data, value => value === 3); // false\n * ```\n */\nfunction some(object, fn) {\n let index = 0;\n for (const value of object) {\n if (fn(value, index++)) {\n return true;\n }\n }\n return false;\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Transform the values of an iterable with a mapping function.\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The mapping function to invoke for each value.\n *\n * @returns An iterator which yields the transformed values.\n *\n * #### Example\n * ```typescript\n * import { map } from '@lumino/algorithm';\n *\n * let data = [1, 2, 3];\n *\n * let stream = map(data, value => value * 2);\n *\n * Array.from(stream); // [2, 4, 6]\n * ```\n */\nfunction* map(object, fn) {\n let index = 0;\n for (const value of object) {\n yield fn(value, index++);\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an iterator of evenly spaced values.\n *\n * @param start - The starting value for the range, inclusive.\n *\n * @param stop - The stopping value for the range, exclusive.\n *\n * @param step - The distance between each value.\n *\n * @returns An iterator which produces evenly spaced values.\n *\n * #### Notes\n * In the single argument form of `range(stop)`, `start` defaults to\n * `0` and `step` defaults to `1`.\n *\n * In the two argument form of `range(start, stop)`, `step` defaults\n * to `1`.\n *\n * #### Example\n * ```typescript\n * import { range } from '@lumino/algorithm';\n *\n * let stream = range(2, 4);\n *\n * Array.from(stream); // [2, 3]\n * ```\n */\nfunction* range(start, stop, step) {\n if (stop === undefined) {\n stop = start;\n start = 0;\n step = 1;\n }\n else if (step === undefined) {\n step = 1;\n }\n const length = Private.rangeLength(start, stop, step);\n for (let index = 0; index < length; index++) {\n yield start + step * index;\n }\n}\n/**\n * The namespace for the module implementation details.\n */\nvar Private;\n(function (Private) {\n /**\n * Compute the effective length of a range.\n *\n * @param start - The starting value for the range, inclusive.\n *\n * @param stop - The stopping value for the range, exclusive.\n *\n * @param step - The distance between each value.\n *\n * @returns The number of steps need to traverse the range.\n */\n function rangeLength(start, stop, step) {\n if (step === 0) {\n return Infinity;\n }\n if (start > stop && step > 0) {\n return 0;\n }\n if (start < stop && step < 0) {\n return 0;\n }\n return Math.ceil((stop - start) / step);\n }\n Private.rangeLength = rangeLength;\n})(Private || (Private = {}));\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\nfunction reduce(object, fn, initial) {\n // Setup the iterator and fetch the first value.\n const it = object[Symbol.iterator]();\n let index = 0;\n let first = it.next();\n // An empty iterator and no initial value is an error.\n if (first.done && initial === undefined) {\n throw new TypeError('Reduce of empty iterable with no initial value.');\n }\n // If the iterator is empty, return the initial value.\n if (first.done) {\n return initial;\n }\n // If the iterator has a single item and no initial value, the\n // reducer is not invoked and the first item is the return value.\n let second = it.next();\n if (second.done && initial === undefined) {\n return first.value;\n }\n // If iterator has a single item and an initial value is provided,\n // the reducer is invoked and that result is the return value.\n if (second.done) {\n return fn(initial, first.value, index++);\n }\n // Setup the initial accumlated value.\n let accumulator;\n if (initial === undefined) {\n accumulator = fn(first.value, second.value, index++);\n }\n else {\n accumulator = fn(fn(initial, first.value, index++), second.value, index++);\n }\n // Iterate the rest of the values, updating the accumulator.\n let next;\n while (!(next = it.next()).done) {\n accumulator = fn(accumulator, next.value, index++);\n }\n // Return the final accumulated value.\n return accumulator;\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an iterator which repeats a value a number of times.\n *\n * @deprecated\n *\n * @param value - The value to repeat.\n *\n * @param count - The number of times to repeat the value.\n *\n * @returns A new iterator which repeats the specified value.\n *\n * #### Example\n * ```typescript\n * import { repeat } from '@lumino/algorithm';\n *\n * let stream = repeat(7, 3);\n *\n * Array.from(stream); // [7, 7, 7]\n * ```\n */\nfunction* repeat(value, count) {\n while (0 < count--) {\n yield value;\n }\n}\n/**\n * Create an iterator which yields a value a single time.\n *\n * @deprecated\n *\n * @param value - The value to wrap in an iterator.\n *\n * @returns A new iterator which yields the value a single time.\n *\n * #### Example\n * ```typescript\n * import { once } from '@lumino/algorithm';\n *\n * let stream = once(7);\n *\n * Array.from(stream); // [7]\n * ```\n */\nfunction* once(value) {\n yield value;\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an iterator for a retroable object.\n *\n * @param object - The retroable or array-like object of interest.\n *\n * @returns An iterator which traverses the object's values in reverse.\n *\n * #### Example\n * ```typescript\n * import { retro } from '@lumino/algorithm';\n *\n * let data = [1, 2, 3, 4, 5, 6];\n *\n * let stream = retro(data);\n *\n * Array.from(stream); // [6, 5, 4, 3, 2, 1]\n * ```\n */\nfunction* retro(object) {\n if (typeof object.retro === 'function') {\n yield* object.retro();\n }\n else {\n for (let index = object.length - 1; index > -1; index--) {\n yield object[index];\n }\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Topologically sort an iterable of edges.\n *\n * @param edges - The iterable object of edges to sort.\n * An edge is represented as a 2-tuple of `[fromNode, toNode]`.\n *\n * @returns The topologically sorted array of nodes.\n *\n * #### Notes\n * If a cycle is present in the graph, the cycle will be ignored and\n * the return value will be only approximately sorted.\n *\n * #### Example\n * ```typescript\n * import { topologicSort } from '@lumino/algorithm';\n *\n * let data = [\n * ['d', 'e'],\n * ['c', 'd'],\n * ['a', 'b'],\n * ['b', 'c']\n * ];\n *\n * topologicSort(data); // ['a', 'b', 'c', 'd', 'e']\n * ```\n */\nfunction topologicSort(edges) {\n // Setup the shared sorting state.\n let sorted = [];\n let visited = new Set();\n let graph = new Map();\n // Add the edges to the graph.\n for (const edge of edges) {\n addEdge(edge);\n }\n // Visit each node in the graph.\n for (const [k] of graph) {\n visit(k);\n }\n // Return the sorted results.\n return sorted;\n // Add an edge to the graph.\n function addEdge(edge) {\n let [fromNode, toNode] = edge;\n let children = graph.get(toNode);\n if (children) {\n children.push(fromNode);\n }\n else {\n graph.set(toNode, [fromNode]);\n }\n }\n // Recursively visit the node.\n function visit(node) {\n if (visited.has(node)) {\n return;\n }\n visited.add(node);\n let children = graph.get(node);\n if (children) {\n for (const child of children) {\n visit(child);\n }\n }\n sorted.push(node);\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Iterate over an iterable using a stepped increment.\n *\n * @param object - The iterable object of interest.\n *\n * @param step - The distance to step on each iteration. A value\n * of less than `1` will behave the same as a value of `1`.\n *\n * @returns An iterator which traverses the iterable step-wise.\n *\n * #### Example\n * ```typescript\n * import { stride } from '@lumino/algorithm';\n *\n * let data = [1, 2, 3, 4, 5, 6];\n *\n * let stream = stride(data, 2);\n *\n * Array.from(stream); // [1, 3, 5];\n * ```\n */\nfunction* stride(object, step) {\n let count = 0;\n for (const value of object) {\n if (0 === count++ % step) {\n yield value;\n }\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * The namespace for string-specific algorithms.\n */\nvar StringExt;\n(function (StringExt) {\n /**\n * Find the indices of characters in a source text.\n *\n * @param source - The source text which should be searched.\n *\n * @param query - The characters to locate in the source text.\n *\n * @param start - The index to start the search.\n *\n * @returns The matched indices, or `null` if there is no match.\n *\n * #### Complexity\n * Linear on `sourceText`.\n *\n * #### Notes\n * In order for there to be a match, all of the characters in `query`\n * **must** appear in `source` in the order given by `query`.\n *\n * Characters are matched using strict `===` equality.\n */\n function findIndices(source, query, start = 0) {\n let indices = new Array(query.length);\n for (let i = 0, j = start, n = query.length; i < n; ++i, ++j) {\n j = source.indexOf(query[i], j);\n if (j === -1) {\n return null;\n }\n indices[i] = j;\n }\n return indices;\n }\n StringExt.findIndices = findIndices;\n /**\n * A string matcher which uses a sum-of-squares algorithm.\n *\n * @param source - The source text which should be searched.\n *\n * @param query - The characters to locate in the source text.\n *\n * @param start - The index to start the search.\n *\n * @returns The match result, or `null` if there is no match.\n * A lower `score` represents a stronger match.\n *\n * #### Complexity\n * Linear on `sourceText`.\n *\n * #### Notes\n * This scoring algorithm uses a sum-of-squares approach to determine\n * the score. In order for there to be a match, all of the characters\n * in `query` **must** appear in `source` in order. The index of each\n * matching character is squared and added to the score. This means\n * that early and consecutive character matches are preferred, while\n * late matches are heavily penalized.\n */\n function matchSumOfSquares(source, query, start = 0) {\n let indices = findIndices(source, query, start);\n if (!indices) {\n return null;\n }\n let score = 0;\n for (let i = 0, n = indices.length; i < n; ++i) {\n let j = indices[i] - start;\n score += j * j;\n }\n return { score, indices };\n }\n StringExt.matchSumOfSquares = matchSumOfSquares;\n /**\n * A string matcher which uses a sum-of-deltas algorithm.\n *\n * @param source - The source text which should be searched.\n *\n * @param query - The characters to locate in the source text.\n *\n * @param start - The index to start the search.\n *\n * @returns The match result, or `null` if there is no match.\n * A lower `score` represents a stronger match.\n *\n * #### Complexity\n * Linear on `sourceText`.\n *\n * #### Notes\n * This scoring algorithm uses a sum-of-deltas approach to determine\n * the score. In order for there to be a match, all of the characters\n * in `query` **must** appear in `source` in order. The delta between\n * the indices are summed to create the score. This means that groups\n * of matched characters are preferred, while fragmented matches are\n * penalized.\n */\n function matchSumOfDeltas(source, query, start = 0) {\n let indices = findIndices(source, query, start);\n if (!indices) {\n return null;\n }\n let score = 0;\n let last = start - 1;\n for (let i = 0, n = indices.length; i < n; ++i) {\n let j = indices[i];\n score += j - last - 1;\n last = j;\n }\n return { score, indices };\n }\n StringExt.matchSumOfDeltas = matchSumOfDeltas;\n /**\n * Highlight the matched characters of a source text.\n *\n * @param source - The text which should be highlighted.\n *\n * @param indices - The indices of the matched characters. They must\n * appear in increasing order and must be in bounds of the source.\n *\n * @param fn - The function to apply to the matched chunks.\n *\n * @returns An array of unmatched and highlighted chunks.\n */\n function highlight(source, indices, fn) {\n // Set up the result array.\n let result = [];\n // Set up the counter variables.\n let k = 0;\n let last = 0;\n let n = indices.length;\n // Iterator over each index.\n while (k < n) {\n // Set up the chunk indices.\n let i = indices[k];\n let j = indices[k];\n // Advance the right chunk index until it's non-contiguous.\n while (++k < n && indices[k] === j + 1) {\n j++;\n }\n // Extract the unmatched text.\n if (last < i) {\n result.push(source.slice(last, i));\n }\n // Extract and highlight the matched text.\n if (i < j + 1) {\n result.push(fn(source.slice(i, j + 1)));\n }\n // Update the last visited index.\n last = j + 1;\n }\n // Extract any remaining unmatched text.\n if (last < source.length) {\n result.push(source.slice(last));\n }\n // Return the highlighted result.\n return result;\n }\n StringExt.highlight = highlight;\n /**\n * A 3-way string comparison function.\n *\n * @param a - The first string of interest.\n *\n * @param b - The second string of interest.\n *\n * @returns `-1` if `a < b`, else `1` if `a > b`, else `0`.\n */\n function cmp(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n }\n StringExt.cmp = cmp;\n})(StringExt || (StringExt = {}));\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Take a fixed number of items from an iterable.\n *\n * @param object - The iterable object of interest.\n *\n * @param count - The number of items to take from the iterable.\n *\n * @returns An iterator which yields the specified number of items\n * from the source iterable.\n *\n * #### Notes\n * The returned iterator will exhaust early if the source iterable\n * contains an insufficient number of items.\n *\n * #### Example\n * ```typescript\n * import { take } from '@lumino/algorithm';\n *\n * let stream = take([5, 4, 3, 2, 1, 0, -1], 3);\n *\n * Array.from(stream); // [5, 4, 3]\n * ```\n */\nfunction* take(object, count) {\n if (count < 1) {\n return;\n }\n const it = object[Symbol.iterator]();\n let item;\n while (0 < count-- && !(item = it.next()).done) {\n yield item.value;\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Iterate several iterables in lockstep.\n *\n * @param objects - The iterable objects of interest.\n *\n * @returns An iterator which yields successive tuples of values where\n * each value is taken in turn from the provided iterables. It will\n * be as long as the shortest provided iterable.\n *\n * #### Example\n * ```typescript\n * import { zip } from '@lumino/algorithm';\n *\n * let data1 = [1, 2, 3];\n * let data2 = [4, 5, 6];\n *\n * let stream = zip(data1, data2);\n *\n * Array.from(stream); // [[1, 4], [2, 5], [3, 6]]\n * ```\n */\nfunction* zip(...objects) {\n const iters = objects.map(obj => obj[Symbol.iterator]());\n let tuple = iters.map(it => it.next());\n for (; every(tuple, item => !item.done); tuple = iters.map(it => it.next())) {\n yield tuple.map(item => item.value);\n }\n}\n\nexport { ArrayExt, StringExt, chain, each, empty, enumerate, every, filter, find, findIndex, map, max, min, minmax, once, range, reduce, repeat, retro, some, stride, take, toArray, toObject, topologicSort, zip };\n//# sourceMappingURL=index.es6.js.map\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.lumino_coreutils = {}));\n})(this, (function (exports) { 'use strict';\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * The namespace for JSON-specific functions.\n */\n exports.JSONExt = void 0;\n (function (JSONExt) {\n /**\n * A shared frozen empty JSONObject\n */\n JSONExt.emptyObject = Object.freeze({});\n /**\n * A shared frozen empty JSONArray\n */\n JSONExt.emptyArray = Object.freeze([]);\n /**\n * Test whether a JSON value is a primitive.\n *\n * @param value - The JSON value of interest.\n *\n * @returns `true` if the value is a primitive,`false` otherwise.\n */\n function isPrimitive(value) {\n return (value === null ||\n typeof value === 'boolean' ||\n typeof value === 'number' ||\n typeof value === 'string');\n }\n JSONExt.isPrimitive = isPrimitive;\n function isArray(value) {\n return Array.isArray(value);\n }\n JSONExt.isArray = isArray;\n function isObject(value) {\n return !isPrimitive(value) && !isArray(value);\n }\n JSONExt.isObject = isObject;\n /**\n * Compare two JSON values for deep equality.\n *\n * @param first - The first JSON value of interest.\n *\n * @param second - The second JSON value of interest.\n *\n * @returns `true` if the values are equivalent, `false` otherwise.\n */\n function deepEqual(first, second) {\n // Check referential and primitive equality first.\n if (first === second) {\n return true;\n }\n // If one is a primitive, the `===` check ruled out the other.\n if (isPrimitive(first) || isPrimitive(second)) {\n return false;\n }\n // Test whether they are arrays.\n let a1 = isArray(first);\n let a2 = isArray(second);\n // Bail if the types are different.\n if (a1 !== a2) {\n return false;\n }\n // If they are both arrays, compare them.\n if (a1 && a2) {\n return deepArrayEqual(first, second);\n }\n // At this point, they must both be objects.\n return deepObjectEqual(first, second);\n }\n JSONExt.deepEqual = deepEqual;\n /**\n * Create a deep copy of a JSON value.\n *\n * @param value - The JSON value to copy.\n *\n * @returns A deep copy of the given JSON value.\n */\n function deepCopy(value) {\n // Do nothing for primitive values.\n if (isPrimitive(value)) {\n return value;\n }\n // Deep copy an array.\n if (isArray(value)) {\n return deepArrayCopy(value);\n }\n // Deep copy an object.\n return deepObjectCopy(value);\n }\n JSONExt.deepCopy = deepCopy;\n /**\n * Compare two JSON arrays for deep equality.\n */\n function deepArrayEqual(first, second) {\n // Check referential equality first.\n if (first === second) {\n return true;\n }\n // Test the arrays for equal length.\n if (first.length !== second.length) {\n return false;\n }\n // Compare the values for equality.\n for (let i = 0, n = first.length; i < n; ++i) {\n if (!deepEqual(first[i], second[i])) {\n return false;\n }\n }\n // At this point, the arrays are equal.\n return true;\n }\n /**\n * Compare two JSON objects for deep equality.\n */\n function deepObjectEqual(first, second) {\n // Check referential equality first.\n if (first === second) {\n return true;\n }\n // Check for the first object's keys in the second object.\n for (let key in first) {\n if (first[key] !== undefined && !(key in second)) {\n return false;\n }\n }\n // Check for the second object's keys in the first object.\n for (let key in second) {\n if (second[key] !== undefined && !(key in first)) {\n return false;\n }\n }\n // Compare the values for equality.\n for (let key in first) {\n // Get the values.\n let firstValue = first[key];\n let secondValue = second[key];\n // If both are undefined, ignore the key.\n if (firstValue === undefined && secondValue === undefined) {\n continue;\n }\n // If only one value is undefined, the objects are not equal.\n if (firstValue === undefined || secondValue === undefined) {\n return false;\n }\n // Compare the values.\n if (!deepEqual(firstValue, secondValue)) {\n return false;\n }\n }\n // At this point, the objects are equal.\n return true;\n }\n /**\n * Create a deep copy of a JSON array.\n */\n function deepArrayCopy(value) {\n let result = new Array(value.length);\n for (let i = 0, n = value.length; i < n; ++i) {\n result[i] = deepCopy(value[i]);\n }\n return result;\n }\n /**\n * Create a deep copy of a JSON object.\n */\n function deepObjectCopy(value) {\n let result = {};\n for (let key in value) {\n // Ignore undefined values.\n let subvalue = value[key];\n if (subvalue === undefined) {\n continue;\n }\n result[key] = deepCopy(subvalue);\n }\n return result;\n }\n })(exports.JSONExt || (exports.JSONExt = {}));\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * An object which stores MIME data for general application use.\n *\n * #### Notes\n * This class does not attempt to enforce \"correctness\" of MIME types\n * and their associated data. Since this class is designed to transfer\n * arbitrary data and objects within the same application, it assumes\n * that the user provides correct and accurate data.\n */\n class MimeData {\n constructor() {\n this._types = [];\n this._values = [];\n }\n /**\n * Get an array of the MIME types contained within the dataset.\n *\n * @returns A new array of the MIME types, in order of insertion.\n */\n types() {\n return this._types.slice();\n }\n /**\n * Test whether the dataset has an entry for the given type.\n *\n * @param mime - The MIME type of interest.\n *\n * @returns `true` if the dataset contains a value for the given\n * MIME type, `false` otherwise.\n */\n hasData(mime) {\n return this._types.indexOf(mime) !== -1;\n }\n /**\n * Get the data value for the given MIME type.\n *\n * @param mime - The MIME type of interest.\n *\n * @returns The value for the given MIME type, or `undefined` if\n * the dataset does not contain a value for the type.\n */\n getData(mime) {\n let i = this._types.indexOf(mime);\n return i !== -1 ? this._values[i] : undefined;\n }\n /**\n * Set the data value for the given MIME type.\n *\n * @param mime - The MIME type of interest.\n *\n * @param data - The data value for the given MIME type.\n *\n * #### Notes\n * This will overwrite any previous entry for the MIME type.\n */\n setData(mime, data) {\n this.clearData(mime);\n this._types.push(mime);\n this._values.push(data);\n }\n /**\n * Remove the data entry for the given MIME type.\n *\n * @param mime - The MIME type of interest.\n *\n * #### Notes\n * This is a no-op if there is no entry for the given MIME type.\n */\n clearData(mime) {\n let i = this._types.indexOf(mime);\n if (i !== -1) {\n this._types.splice(i, 1);\n this._values.splice(i, 1);\n }\n }\n /**\n * Remove all data entries from the dataset.\n */\n clear() {\n this._types.length = 0;\n this._values.length = 0;\n }\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * A class which wraps a promise into a delegate object.\n *\n * #### Notes\n * This class is useful when the logic to resolve or reject a promise\n * cannot be defined at the point where the promise is created.\n */\n class PromiseDelegate {\n /**\n * Construct a new promise delegate.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n /**\n * Resolve the wrapped promise with the given value.\n *\n * @param value - The value to use for resolving the promise.\n */\n resolve(value) {\n let resolve = this._resolve;\n resolve(value);\n }\n /**\n * Reject the wrapped promise with the given value.\n *\n * @reason - The reason for rejecting the promise.\n */\n reject(reason) {\n let reject = this._reject;\n reject(reason);\n }\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * A runtime object which captures compile-time type information.\n *\n * #### Notes\n * A token captures the compile-time type of an interface or class in\n * an object which can be used at runtime in a type-safe fashion.\n */\n class Token {\n /**\n * Construct a new token.\n *\n * @param name - A human readable name for the token.\n * @param description - Token purpose description for documentation.\n */\n constructor(name, description) {\n this.name = name;\n this.description = description !== null && description !== void 0 ? description : '';\n this._tokenStructuralPropertyT = null;\n }\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n // Fallback\n function fallbackRandomValues(buffer) {\n let value = 0;\n for (let i = 0, n = buffer.length; i < n; ++i) {\n if (i % 4 === 0) {\n value = (Math.random() * 0xffffffff) >>> 0;\n }\n buffer[i] = value & 0xff;\n value >>>= 8;\n }\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * The namespace for random number related functionality.\n */\n exports.Random = void 0;\n (function (Random) {\n /**\n * A function which generates random bytes.\n *\n * @param buffer - The `Uint8Array` to fill with random bytes.\n *\n * #### Notes\n * A cryptographically strong random number generator will be used if\n * available. Otherwise, `Math.random` will be used as a fallback for\n * randomness.\n *\n * The following RNGs are supported, listed in order of precedence:\n * - `window.crypto.getRandomValues`\n * - `window.msCrypto.getRandomValues`\n * - `require('crypto').randomFillSync\n * - `require('crypto').randomBytes\n * - `Math.random`\n */\n Random.getRandomValues = (() => {\n // Look up the crypto module if available.\n const crypto = (typeof window !== 'undefined' && (window.crypto || window.msCrypto)) ||\n null;\n // Modern browsers and IE 11\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return function getRandomValues(buffer) {\n return crypto.getRandomValues(buffer);\n };\n }\n // Fallback\n return fallbackRandomValues;\n })();\n })(exports.Random || (exports.Random = {}));\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * A function which creates a function that generates UUID v4 identifiers.\n *\n * @returns A new function that creates a UUID v4 string.\n *\n * #### Notes\n * This implementation complies with RFC 4122.\n *\n * This uses `Random.getRandomValues()` for random bytes, which in\n * turn will use the underlying `crypto` module of the platform if\n * it is available. The fallback for randomness is `Math.random`.\n */\n function uuid4Factory(getRandomValues) {\n // Create a 16 byte array to hold the random values.\n const bytes = new Uint8Array(16);\n // Create a look up table from bytes to hex strings.\n const lut = new Array(256);\n // Pad the single character hex digits with a leading zero.\n for (let i = 0; i < 16; ++i) {\n lut[i] = '0' + i.toString(16);\n }\n // Populate the rest of the hex digits.\n for (let i = 16; i < 256; ++i) {\n lut[i] = i.toString(16);\n }\n // Return a function which generates the UUID.\n return function uuid4() {\n // Get a new batch of random values.\n getRandomValues(bytes);\n // Set the UUID version number to 4.\n bytes[6] = 0x40 | (bytes[6] & 0x0f);\n // Set the clock sequence bit to the RFC spec.\n bytes[8] = 0x80 | (bytes[8] & 0x3f);\n // Assemble the UUID string.\n return (lut[bytes[0]] +\n lut[bytes[1]] +\n lut[bytes[2]] +\n lut[bytes[3]] +\n '-' +\n lut[bytes[4]] +\n lut[bytes[5]] +\n '-' +\n lut[bytes[6]] +\n lut[bytes[7]] +\n '-' +\n lut[bytes[8]] +\n lut[bytes[9]] +\n '-' +\n lut[bytes[10]] +\n lut[bytes[11]] +\n lut[bytes[12]] +\n lut[bytes[13]] +\n lut[bytes[14]] +\n lut[bytes[15]]);\n };\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * The namespace for UUID related functionality.\n */\n exports.UUID = void 0;\n (function (UUID) {\n /**\n * A function which generates UUID v4 identifiers.\n *\n * @returns A new UUID v4 string.\n *\n * #### Notes\n * This implementation complies with RFC 4122.\n *\n * This uses `Random.getRandomValues()` for random bytes, which in\n * turn will use the underlying `crypto` module of the platform if\n * it is available. The fallback for randomness is `Math.random`.\n */\n UUID.uuid4 = uuid4Factory(exports.Random.getRandomValues);\n })(exports.UUID || (exports.UUID = {}));\n\n exports.MimeData = MimeData;\n exports.PromiseDelegate = PromiseDelegate;\n exports.Token = Token;\n\n}));\n//# sourceMappingURL=index.js.map\n","import { Signal } from '@lumino/signaling';\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * @packageDocumentation\n * @module disposable\n */\n/**\n * A disposable object which delegates to a callback function.\n */\nclass DisposableDelegate {\n /**\n * Construct a new disposable delegate.\n *\n * @param fn - The callback function to invoke on dispose.\n */\n constructor(fn) {\n this._fn = fn;\n }\n /**\n * Test whether the delegate has been disposed.\n */\n get isDisposed() {\n return !this._fn;\n }\n /**\n * Dispose of the delegate and invoke the callback function.\n */\n dispose() {\n if (!this._fn) {\n return;\n }\n let fn = this._fn;\n this._fn = null;\n fn();\n }\n}\n/**\n * An observable disposable object which delegates to a callback function.\n */\nclass ObservableDisposableDelegate extends DisposableDelegate {\n constructor() {\n super(...arguments);\n this._disposed = new Signal(this);\n }\n /**\n * A signal emitted when the delegate is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * Dispose of the delegate and invoke the callback function.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n super.dispose();\n this._disposed.emit(undefined);\n Signal.clearData(this);\n }\n}\n/**\n * An object which manages a collection of disposable items.\n */\nclass DisposableSet {\n constructor() {\n this._isDisposed = false;\n this._items = new Set();\n }\n /**\n * Test whether the set has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the set and the items it contains.\n *\n * #### Notes\n * Items are disposed in the order they are added to the set.\n */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._items.forEach(item => {\n item.dispose();\n });\n this._items.clear();\n }\n /**\n * Test whether the set contains a specific item.\n *\n * @param item - The item of interest.\n *\n * @returns `true` if the set contains the item, `false` otherwise.\n */\n contains(item) {\n return this._items.has(item);\n }\n /**\n * Add a disposable item to the set.\n *\n * @param item - The item to add to the set.\n *\n * #### Notes\n * If the item is already contained in the set, this is a no-op.\n */\n add(item) {\n this._items.add(item);\n }\n /**\n * Remove a disposable item from the set.\n *\n * @param item - The item to remove from the set.\n *\n * #### Notes\n * If the item is not contained in the set, this is a no-op.\n */\n remove(item) {\n this._items.delete(item);\n }\n /**\n * Remove all items from the set.\n */\n clear() {\n this._items.clear();\n }\n}\n/**\n * The namespace for the `DisposableSet` class statics.\n */\n(function (DisposableSet) {\n /**\n * Create a disposable set from an iterable of items.\n *\n * @param items - The iterable object of interest.\n *\n * @returns A new disposable initialized with the given items.\n */\n function from(items) {\n let set = new DisposableSet();\n for (const item of items) {\n set.add(item);\n }\n return set;\n }\n DisposableSet.from = from;\n})(DisposableSet || (DisposableSet = {}));\n/**\n * An observable object which manages a collection of disposable items.\n */\nclass ObservableDisposableSet extends DisposableSet {\n constructor() {\n super(...arguments);\n this._disposed = new Signal(this);\n }\n /**\n * A signal emitted when the set is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * Dispose of the set and the items it contains.\n *\n * #### Notes\n * Items are disposed in the order they are added to the set.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n super.dispose();\n this._disposed.emit(undefined);\n Signal.clearData(this);\n }\n}\n/**\n * The namespace for the `ObservableDisposableSet` class statics.\n */\n(function (ObservableDisposableSet) {\n /**\n * Create an observable disposable set from an iterable of items.\n *\n * @param items - The iterable object of interest.\n *\n * @returns A new disposable initialized with the given items.\n */\n function from(items) {\n let set = new ObservableDisposableSet();\n for (const item of items) {\n set.add(item);\n }\n return set;\n }\n ObservableDisposableSet.from = from;\n})(ObservableDisposableSet || (ObservableDisposableSet = {}));\n\nexport { DisposableDelegate, DisposableSet, ObservableDisposableDelegate, ObservableDisposableSet };\n//# sourceMappingURL=index.es6.js.map\n","import { PromiseDelegate, JSONExt } from '@lumino/coreutils';\nimport { Signal } from '@lumino/signaling';\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/**\n * A class that wraps an asynchronous function to poll at a regular interval\n * with exponential increases to the interval length if the poll fails.\n *\n * @typeparam T - The resolved type of the factory's promises.\n * Defaults to `any`.\n *\n * @typeparam U - The rejected type of the factory's promises.\n * Defaults to `any`.\n *\n * @typeparam V - An optional type to extend the phases supported by a poll.\n * Defaults to `standby`, which already exists in the `Phase` type.\n */\nclass Poll {\n /**\n * Instantiate a new poll with exponential backoff in case of failure.\n *\n * @param options - The poll instantiation options.\n */\n constructor(options) {\n var _a;\n this._disposed = new Signal(this);\n this._lingered = 0;\n this._tick = new PromiseDelegate();\n this._ticked = new Signal(this);\n this._factory = options.factory;\n this._linger = (_a = options.linger) !== null && _a !== void 0 ? _a : Private.DEFAULT_LINGER;\n this._standby = options.standby || Private.DEFAULT_STANDBY;\n this._state = { ...Private.DEFAULT_STATE, timestamp: new Date().getTime() };\n // Normalize poll frequency `max` to be the greater of\n // default `max`, `options.frequency.max`, or `options.frequency.interval`.\n const frequency = options.frequency || {};\n const max = Math.max(frequency.interval || 0, frequency.max || 0, Private.DEFAULT_FREQUENCY.max);\n this.frequency = { ...Private.DEFAULT_FREQUENCY, ...frequency, ...{ max } };\n this.name = options.name || Private.DEFAULT_NAME;\n if ('auto' in options ? options.auto : true) {\n setTimeout(() => this.start());\n }\n }\n /**\n * A signal emitted when the poll is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * The polling frequency parameters.\n */\n get frequency() {\n return this._frequency;\n }\n set frequency(frequency) {\n if (this.isDisposed || JSONExt.deepEqual(frequency, this.frequency || {})) {\n return;\n }\n let { backoff, interval, max } = frequency;\n interval = Math.round(interval);\n max = Math.round(max);\n if (typeof backoff === 'number' && backoff < 1) {\n throw new Error('Poll backoff growth factor must be at least 1');\n }\n if ((interval < 0 || interval > max) && interval !== Poll.NEVER) {\n throw new Error('Poll interval must be between 0 and max');\n }\n if (max > Poll.MAX_INTERVAL && max !== Poll.NEVER) {\n throw new Error(`Max interval must be less than ${Poll.MAX_INTERVAL}`);\n }\n this._frequency = { backoff, interval, max };\n }\n /**\n * Whether the poll is disposed.\n */\n get isDisposed() {\n return this.state.phase === 'disposed';\n }\n /**\n * Indicates when the poll switches to standby.\n */\n get standby() {\n return this._standby;\n }\n set standby(standby) {\n if (this.isDisposed || this.standby === standby) {\n return;\n }\n this._standby = standby;\n }\n /**\n * The poll state, which is the content of the current poll tick.\n */\n get state() {\n return this._state;\n }\n /**\n * A promise that resolves when the poll next ticks.\n */\n get tick() {\n return this._tick.promise;\n }\n /**\n * A signal emitted when the poll ticks and fires off a new request.\n */\n get ticked() {\n return this._ticked;\n }\n /**\n * Return an async iterator that yields every tick.\n */\n async *[Symbol.asyncIterator]() {\n while (!this.isDisposed) {\n yield this.state;\n await this.tick.catch(() => undefined);\n }\n }\n /**\n * Dispose the poll.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._state = {\n ...Private.DISPOSED_STATE,\n timestamp: new Date().getTime()\n };\n this._tick.promise.catch(_ => undefined);\n this._tick.reject(new Error(`Poll (${this.name}) is disposed.`));\n this._disposed.emit(undefined);\n Signal.clearData(this);\n }\n /**\n * Refreshes the poll. Schedules `refreshed` tick if necessary.\n *\n * @returns A promise that resolves after tick is scheduled and never rejects.\n *\n * #### Notes\n * The returned promise resolves after the tick is scheduled, but before\n * the polling action is run. To wait until after the poll action executes,\n * await the `poll.tick` promise: `await poll.refresh(); await poll.tick;`\n */\n refresh() {\n return this.schedule({\n cancel: ({ phase }) => phase === 'refreshed',\n interval: Poll.IMMEDIATE,\n phase: 'refreshed'\n });\n }\n /**\n * Schedule the next poll tick.\n *\n * @param next - The next poll state data to schedule. Defaults to standby.\n *\n * @param next.cancel - Cancels state transition if function returns `true`.\n *\n * @returns A promise that resolves when the next poll state is active.\n *\n * #### Notes\n * This method is not meant to be invoked by user code typically. It is public\n * to allow poll instances to be composed into classes that schedule ticks.\n */\n async schedule(next = {}) {\n if (this.isDisposed) {\n return;\n }\n // Check if the phase transition should be canceled.\n if (next.cancel && next.cancel(this.state)) {\n return;\n }\n // Update poll state.\n const pending = this._tick;\n const scheduled = new PromiseDelegate();\n const state = {\n interval: this.frequency.interval,\n payload: null,\n phase: 'standby',\n timestamp: new Date().getTime(),\n ...next\n };\n this._state = state;\n this._tick = scheduled;\n // Clear the schedule if possible.\n clearTimeout(this._timeout);\n // Emit ticked signal, resolve pending promise, and await its settlement.\n this._ticked.emit(this.state);\n pending.resolve(this);\n await pending.promise;\n if (state.interval === Poll.NEVER) {\n this._timeout = undefined;\n return;\n }\n // Schedule next execution and cache its timeout handle.\n const execute = () => {\n if (this.isDisposed || this.tick !== scheduled.promise) {\n return;\n }\n this._execute();\n };\n // Cache the handle in case it needs to be unscheduled.\n this._timeout = setTimeout(execute, state.interval);\n }\n /**\n * Starts the poll. Schedules `started` tick if necessary.\n *\n * @returns A promise that resolves after tick is scheduled and never rejects.\n */\n start() {\n return this.schedule({\n cancel: ({ phase }) => phase !== 'constructed' && phase !== 'standby' && phase !== 'stopped',\n interval: Poll.IMMEDIATE,\n phase: 'started'\n });\n }\n /**\n * Stops the poll. Schedules `stopped` tick if necessary.\n *\n * @returns A promise that resolves after tick is scheduled and never rejects.\n */\n stop() {\n return this.schedule({\n cancel: ({ phase }) => phase === 'stopped',\n interval: Poll.NEVER,\n phase: 'stopped'\n });\n }\n /**\n * Whether the poll is hidden.\n *\n * #### Notes\n * This property is only relevant in a browser context.\n */\n get hidden() {\n return Private.hidden;\n }\n /**\n * Execute a new poll factory promise or stand by if necessary.\n */\n _execute() {\n let standby = typeof this.standby === 'function' ? this.standby() : this.standby;\n // Check if execution should proceed, linger, or stand by.\n if (standby === 'never') {\n standby = false;\n }\n else if (standby === 'when-hidden') {\n if (this.hidden) {\n standby = ++this._lingered > this._linger;\n }\n else {\n this._lingered = 0;\n standby = false;\n }\n }\n // If in standby mode schedule next tick without calling the factory.\n if (standby) {\n void this.schedule();\n return;\n }\n const pending = this.tick;\n this._factory(this.state)\n .then((resolved) => {\n if (this.isDisposed || this.tick !== pending) {\n return;\n }\n void this.schedule({\n payload: resolved,\n phase: this.state.phase === 'rejected' ? 'reconnected' : 'resolved'\n });\n })\n .catch((rejected) => {\n if (this.isDisposed || this.tick !== pending) {\n return;\n }\n void this.schedule({\n interval: Private.sleep(this.frequency, this.state),\n payload: rejected,\n phase: 'rejected'\n });\n });\n }\n}\n/**\n * A namespace for `Poll` types, interfaces, and statics.\n */\n(function (Poll) {\n /**\n * An interval value in ms that indicates the poll should tick immediately.\n */\n Poll.IMMEDIATE = 0;\n /**\n * Delays are 32-bit integers in many browsers so intervals need to be capped.\n *\n * #### Notes\n * https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Maximum_delay_value\n */\n Poll.MAX_INTERVAL = 2147483647;\n /**\n * An interval value that indicates the poll should never tick.\n */\n Poll.NEVER = Infinity;\n})(Poll || (Poll = {}));\n/**\n * A namespace for private module data.\n */\nvar Private;\n(function (Private) {\n /**\n * The default backoff growth rate if `backoff` is `true`.\n */\n Private.DEFAULT_BACKOFF = 3;\n /**\n * The default polling frequency.\n */\n Private.DEFAULT_FREQUENCY = {\n backoff: true,\n interval: 1000,\n max: 30 * 1000\n };\n /**\n * The default number of times to `linger` when a poll is hidden.\n */\n Private.DEFAULT_LINGER = 1;\n /**\n * The default poll name.\n */\n Private.DEFAULT_NAME = 'unknown';\n /**\n * The default poll standby behavior.\n */\n Private.DEFAULT_STANDBY = 'when-hidden';\n /**\n * The first poll tick state's default values superseded in constructor.\n */\n Private.DEFAULT_STATE = {\n interval: Poll.NEVER,\n payload: null,\n phase: 'constructed',\n timestamp: new Date(0).getTime()\n };\n /**\n * The disposed tick state values.\n */\n Private.DISPOSED_STATE = {\n interval: Poll.NEVER,\n payload: null,\n phase: 'disposed',\n timestamp: new Date(0).getTime()\n };\n /**\n * Returns the number of milliseconds to sleep before the next tick.\n *\n * @param frequency - The poll's base frequency.\n * @param last - The poll's last tick.\n */\n function sleep(frequency, last) {\n const { backoff, interval, max } = frequency;\n if (interval === Poll.NEVER) {\n return interval;\n }\n const growth = backoff === true ? Private.DEFAULT_BACKOFF : backoff === false ? 1 : backoff;\n const random = getRandomIntInclusive(interval, last.interval * growth);\n return Math.min(max, random);\n }\n Private.sleep = sleep;\n /**\n * Keep track of whether the document is hidden. This flag is only relevant in\n * a browser context.\n *\n * Listen to `visibilitychange` event to set the `hidden` flag.\n *\n * Listening to `pagehide` is also necessary because Safari support for\n * `visibilitychange` events is partial, cf.\n * https://developer.mozilla.org/docs/Web/API/Document/visibilitychange_event\n */\n Private.hidden = (() => {\n if (typeof document === 'undefined') {\n return false;\n }\n document.addEventListener('visibilitychange', () => {\n Private.hidden = document.visibilityState === 'hidden';\n });\n document.addEventListener('pagehide', () => {\n Private.hidden = document.visibilityState === 'hidden';\n });\n return document.visibilityState === 'hidden';\n })();\n /**\n * Get a random integer between min and max, inclusive of both.\n *\n * #### Notes\n * From\n * https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/random#Getting_a_random_integer_between_two_values_inclusive\n *\n * From the MDN page: It might be tempting to use Math.round() to accomplish\n * that, but doing so would cause your random numbers to follow a non-uniform\n * distribution, which may not be acceptable for your needs.\n */\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n})(Private || (Private = {}));\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/**\n * A base class to implement rate limiters with different invocation strategies.\n *\n * @typeparam T - The resolved type of the underlying function.\n *\n * @typeparam U - The rejected type of the underlying function.\n *\n * @typeparam V - Arguments for the underlying function.\n */\nclass RateLimiter {\n /**\n * Instantiate a rate limiter.\n *\n * @param fn - The function to rate limit.\n *\n * @param limit - The rate limit; defaults to 500ms.\n */\n constructor(fn, limit = 500) {\n /**\n * Arguments for the underlying function.\n */\n this.args = undefined;\n /**\n * A promise that resolves on each successful invocation.\n */\n this.payload = null;\n this.limit = limit;\n this.poll = new Poll({\n auto: false,\n factory: async () => {\n const { args } = this;\n this.args = undefined;\n return fn(...args);\n },\n frequency: { backoff: false, interval: Poll.NEVER, max: Poll.NEVER },\n standby: 'never'\n });\n this.payload = new PromiseDelegate();\n this.poll.ticked.connect((_, state) => {\n const { payload } = this;\n if (state.phase === 'resolved') {\n this.payload = new PromiseDelegate();\n payload.resolve(state.payload);\n return;\n }\n if (state.phase === 'rejected' || state.phase === 'stopped') {\n this.payload = new PromiseDelegate();\n payload.promise.catch(_ => undefined);\n payload.reject(state.payload);\n return;\n }\n }, this);\n }\n /**\n * Whether the rate limiter is disposed.\n */\n get isDisposed() {\n return this.payload === null;\n }\n /**\n * Disposes the rate limiter.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this.args = undefined;\n this.payload = null;\n this.poll.dispose();\n }\n /**\n * Stop the function if it is mid-flight.\n */\n async stop() {\n return this.poll.stop();\n }\n}\n/**\n * Wraps and debounces a function that can be called multiple times and only\n * executes the underlying function one `interval` after the last invocation.\n *\n * @typeparam T - The resolved type of the underlying function. Defaults to any.\n *\n * @typeparam U - The rejected type of the underlying function. Defaults to any.\n *\n * @typeparam V - Arguments for the underlying function. Defaults to any[].\n */\nclass Debouncer extends RateLimiter {\n /**\n * Invokes the function and only executes after rate limit has elapsed.\n * Each invocation resets the timer.\n */\n invoke(...args) {\n this.args = args;\n void this.poll.schedule({ interval: this.limit, phase: 'invoked' });\n return this.payload.promise;\n }\n}\n/**\n * Wraps and throttles a function that can be called multiple times and only\n * executes the underlying function once per `interval`.\n *\n * @typeparam T - The resolved type of the underlying function. Defaults to any.\n *\n * @typeparam U - The rejected type of the underlying function. Defaults to any.\n *\n * @typeparam V - Arguments for the underlying function. Defaults to any[].\n */\nclass Throttler extends RateLimiter {\n /**\n * Instantiate a throttler.\n *\n * @param fn - The function being throttled.\n *\n * @param options - Throttling configuration or throttling limit in ms.\n *\n * #### Notes\n * The `edge` defaults to `leading`; the `limit` defaults to `500`.\n */\n constructor(fn, options) {\n super(fn, typeof options === 'number' ? options : options && options.limit);\n this._trailing = false;\n if (typeof options !== 'number' && options && options.edge === 'trailing') {\n this._trailing = true;\n }\n this._interval = this._trailing ? this.limit : Poll.IMMEDIATE;\n }\n /**\n * Throttles function invocations if one is currently in flight.\n */\n invoke(...args) {\n const idle = this.poll.state.phase !== 'invoked';\n if (idle || this._trailing) {\n this.args = args;\n }\n if (idle) {\n void this.poll.schedule({ interval: this._interval, phase: 'invoked' });\n }\n return this.payload.promise;\n }\n}\n\nexport { Debouncer, Poll, RateLimiter, Throttler };\n//# sourceMappingURL=index.es6.js.map\n","// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * @packageDocumentation\n * @module properties\n */\n/**\n * A class which attaches a value to an external object.\n *\n * #### Notes\n * Attached properties are used to extend the state of an object with\n * semantic data from an unrelated class. They also encapsulate value\n * creation, coercion, and notification.\n *\n * Because attached property values are stored in a hash table, which\n * in turn is stored in a WeakMap keyed on the owner object, there is\n * non-trivial storage overhead involved in their use. The pattern is\n * therefore best used for the storage of rare data.\n */\nclass AttachedProperty {\n /**\n * Construct a new attached property.\n *\n * @param options - The options for initializing the property.\n */\n constructor(options) {\n this._pid = Private.nextPID();\n this.name = options.name;\n this._create = options.create;\n this._coerce = options.coerce || null;\n this._compare = options.compare || null;\n this._changed = options.changed || null;\n }\n /**\n * Get the current value of the property for a given owner.\n *\n * @param owner - The property owner of interest.\n *\n * @returns The current value of the property.\n *\n * #### Notes\n * If the value has not yet been set, the default value will be\n * computed and assigned as the current value of the property.\n */\n get(owner) {\n let value;\n let map = Private.ensureMap(owner);\n if (this._pid in map) {\n value = map[this._pid];\n }\n else {\n value = map[this._pid] = this._createValue(owner);\n }\n return value;\n }\n /**\n * Set the current value of the property for a given owner.\n *\n * @param owner - The property owner of interest.\n *\n * @param value - The value for the property.\n *\n * #### Notes\n * If the value has not yet been set, the default value will be\n * computed and used as the previous value for the comparison.\n */\n set(owner, value) {\n let oldValue;\n let map = Private.ensureMap(owner);\n if (this._pid in map) {\n oldValue = map[this._pid];\n }\n else {\n oldValue = map[this._pid] = this._createValue(owner);\n }\n let newValue = this._coerceValue(owner, value);\n this._maybeNotify(owner, oldValue, (map[this._pid] = newValue));\n }\n /**\n * Explicitly coerce the current property value for a given owner.\n *\n * @param owner - The property owner of interest.\n *\n * #### Notes\n * If the value has not yet been set, the default value will be\n * computed and used as the previous value for the comparison.\n */\n coerce(owner) {\n let oldValue;\n let map = Private.ensureMap(owner);\n if (this._pid in map) {\n oldValue = map[this._pid];\n }\n else {\n oldValue = map[this._pid] = this._createValue(owner);\n }\n let newValue = this._coerceValue(owner, oldValue);\n this._maybeNotify(owner, oldValue, (map[this._pid] = newValue));\n }\n /**\n * Get or create the default value for the given owner.\n */\n _createValue(owner) {\n let create = this._create;\n return create(owner);\n }\n /**\n * Coerce the value for the given owner.\n */\n _coerceValue(owner, value) {\n let coerce = this._coerce;\n return coerce ? coerce(owner, value) : value;\n }\n /**\n * Compare the old value and new value for equality.\n */\n _compareValue(oldValue, newValue) {\n let compare = this._compare;\n return compare ? compare(oldValue, newValue) : oldValue === newValue;\n }\n /**\n * Run the change notification if the given values are different.\n */\n _maybeNotify(owner, oldValue, newValue) {\n let changed = this._changed;\n if (changed && !this._compareValue(oldValue, newValue)) {\n changed(owner, oldValue, newValue);\n }\n }\n}\n/**\n * The namespace for the `AttachedProperty` class statics.\n */\n(function (AttachedProperty) {\n /**\n * Clear the stored property data for the given owner.\n *\n * @param owner - The property owner of interest.\n *\n * #### Notes\n * This will clear all property values for the owner, but it will\n * **not** run the change notification for any of the properties.\n */\n function clearData(owner) {\n Private.ownerData.delete(owner);\n }\n AttachedProperty.clearData = clearData;\n})(AttachedProperty || (AttachedProperty = {}));\n/**\n * The namespace for the module implementation details.\n */\nvar Private;\n(function (Private) {\n /**\n * A weak mapping of property owner to property map.\n */\n Private.ownerData = new WeakMap();\n /**\n * A function which computes successive unique property ids.\n */\n Private.nextPID = (() => {\n let id = 0;\n return () => {\n let rand = Math.random();\n let stem = `${rand}`.slice(2);\n return `pid-${stem}-${id++}`;\n };\n })();\n /**\n * Lookup the data map for the property owner.\n *\n * This will create the map if one does not already exist.\n */\n function ensureMap(owner) {\n let map = Private.ownerData.get(owner);\n if (map) {\n return map;\n }\n map = Object.create(null);\n Private.ownerData.set(owner, map);\n return map;\n }\n Private.ensureMap = ensureMap;\n})(Private || (Private = {}));\n\nexport { AttachedProperty };\n//# sourceMappingURL=index.es6.js.map\n","import { find, ArrayExt } from '@lumino/algorithm';\nimport { PromiseDelegate } from '@lumino/coreutils';\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * @packageDocumentation\n * @module signaling\n */\n/**\n * A concrete implementation of `ISignal`.\n *\n * #### Example\n * ```typescript\n * import { ISignal, Signal } from '@lumino/signaling';\n *\n * class SomeClass {\n *\n * constructor(name: string) {\n * this.name = name;\n * }\n *\n * readonly name: string;\n *\n * get valueChanged: ISignal {\n * return this._valueChanged;\n * }\n *\n * get value(): number {\n * return this._value;\n * }\n *\n * set value(value: number) {\n * if (value === this._value) {\n * return;\n * }\n * this._value = value;\n * this._valueChanged.emit(value);\n * }\n *\n * private _value = 0;\n * private _valueChanged = new Signal(this);\n * }\n *\n * function logger(sender: SomeClass, value: number): void {\n * console.log(sender.name, value);\n * }\n *\n * let m1 = new SomeClass('foo');\n * let m2 = new SomeClass('bar');\n *\n * m1.valueChanged.connect(logger);\n * m2.valueChanged.connect(logger);\n *\n * m1.value = 42; // logs: foo 42\n * m2.value = 17; // logs: bar 17\n * ```\n */\nclass Signal {\n /**\n * Construct a new signal.\n *\n * @param sender - The sender which owns the signal.\n */\n constructor(sender) {\n this.sender = sender;\n }\n /**\n * Connect a slot to the signal.\n *\n * @param slot - The slot to invoke when the signal is emitted.\n *\n * @param thisArg - The `this` context for the slot. If provided,\n * this must be a non-primitive object.\n *\n * @returns `true` if the connection succeeds, `false` otherwise.\n */\n connect(slot, thisArg) {\n return Private.connect(this, slot, thisArg);\n }\n /**\n * Disconnect a slot from the signal.\n *\n * @param slot - The slot to disconnect from the signal.\n *\n * @param thisArg - The `this` context for the slot. If provided,\n * this must be a non-primitive object.\n *\n * @returns `true` if the connection is removed, `false` otherwise.\n */\n disconnect(slot, thisArg) {\n return Private.disconnect(this, slot, thisArg);\n }\n /**\n * Emit the signal and invoke the connected slots.\n *\n * @param args - The args to pass to the connected slots.\n *\n * #### Notes\n * Slots are invoked synchronously in connection order.\n *\n * Exceptions thrown by connected slots will be caught and logged.\n */\n emit(args) {\n Private.emit(this, args);\n }\n}\n/**\n * The namespace for the `Signal` class statics.\n */\n(function (Signal) {\n /**\n * Remove all connections between a sender and receiver.\n *\n * @param sender - The sender object of interest.\n *\n * @param receiver - The receiver object of interest.\n *\n * #### Notes\n * If a `thisArg` is provided when connecting a signal, that object\n * is considered the receiver. Otherwise, the `slot` is considered\n * the receiver.\n */\n function disconnectBetween(sender, receiver) {\n Private.disconnectBetween(sender, receiver);\n }\n Signal.disconnectBetween = disconnectBetween;\n /**\n * Remove all connections where the given object is the sender.\n *\n * @param sender - The sender object of interest.\n */\n function disconnectSender(sender) {\n Private.disconnectSender(sender);\n }\n Signal.disconnectSender = disconnectSender;\n /**\n * Remove all connections where the given object is the receiver.\n *\n * @param receiver - The receiver object of interest.\n *\n * #### Notes\n * If a `thisArg` is provided when connecting a signal, that object\n * is considered the receiver. Otherwise, the `slot` is considered\n * the receiver.\n */\n function disconnectReceiver(receiver) {\n Private.disconnectReceiver(receiver);\n }\n Signal.disconnectReceiver = disconnectReceiver;\n /**\n * Remove all connections where an object is the sender or receiver.\n *\n * @param object - The object of interest.\n *\n * #### Notes\n * If a `thisArg` is provided when connecting a signal, that object\n * is considered the receiver. Otherwise, the `slot` is considered\n * the receiver.\n */\n function disconnectAll(object) {\n Private.disconnectAll(object);\n }\n Signal.disconnectAll = disconnectAll;\n /**\n * Clear all signal data associated with the given object.\n *\n * @param object - The object for which the data should be cleared.\n *\n * #### Notes\n * This removes all signal connections and any other signal data\n * associated with the object.\n */\n function clearData(object) {\n Private.disconnectAll(object);\n }\n Signal.clearData = clearData;\n /**\n * Get the signal exception handler.\n *\n * @returns The current exception handler.\n *\n * #### Notes\n * The default exception handler is `console.error`.\n */\n function getExceptionHandler() {\n return Private.exceptionHandler;\n }\n Signal.getExceptionHandler = getExceptionHandler;\n /**\n * Set the signal exception handler.\n *\n * @param handler - The function to use as the exception handler.\n *\n * @returns The old exception handler.\n *\n * #### Notes\n * The exception handler is invoked when a slot throws an exception.\n */\n function setExceptionHandler(handler) {\n let old = Private.exceptionHandler;\n Private.exceptionHandler = handler;\n return old;\n }\n Signal.setExceptionHandler = setExceptionHandler;\n})(Signal || (Signal = {}));\n/**\n * A concrete implementation of `IStream`.\n *\n * #### Example\n * ```typescript\n * import { IStream, Stream } from '@lumino/signaling';\n *\n * class SomeClass {\n *\n * constructor(name: string) {\n * this.name = name;\n * }\n *\n * readonly name: string;\n *\n * get pings(): IStream {\n * return this._pings;\n * }\n *\n * ping(value: string) {\n * this._pings.emit(value);\n * }\n *\n * private _pings = new Stream(this);\n * }\n *\n * let m1 = new SomeClass('foo');\n *\n * m1.pings.connect((_, value: string) => {\n * console.log('connect', value);\n * });\n *\n * void (async () => {\n * for await (const ping of m1.pings) {\n * console.log('iterator', ping);\n * }\n * })();\n *\n * m1.ping('alpha'); // logs: connect alpha\n * // logs: iterator alpha\n * m1.ping('beta'); // logs: connect beta\n * // logs: iterator beta\n * ```\n */\nclass Stream extends Signal {\n constructor() {\n super(...arguments);\n this._pending = new PromiseDelegate();\n }\n /**\n * Return an async iterator that yields every emission.\n */\n async *[Symbol.asyncIterator]() {\n let pending = this._pending;\n while (true) {\n try {\n const { args, next } = await pending.promise;\n pending = next;\n yield args;\n }\n catch (_) {\n return; // Any promise rejection stops the iterator.\n }\n }\n }\n /**\n * Emit the signal, invoke the connected slots, and yield the emission.\n *\n * @param args - The args to pass to the connected slots.\n */\n emit(args) {\n const pending = this._pending;\n const next = (this._pending = new PromiseDelegate());\n pending.resolve({ args, next });\n super.emit(args);\n }\n /**\n * Stop the stream's async iteration.\n */\n stop() {\n this._pending.promise.catch(() => undefined);\n this._pending.reject('stop');\n this._pending = new PromiseDelegate();\n }\n}\n/**\n * The namespace for the module implementation details.\n */\nvar Private;\n(function (Private) {\n /**\n * The signal exception handler function.\n */\n Private.exceptionHandler = (err) => {\n console.error(err);\n };\n /**\n * Connect a slot to a signal.\n *\n * @param signal - The signal of interest.\n *\n * @param slot - The slot to invoke when the signal is emitted.\n *\n * @param thisArg - The `this` context for the slot. If provided,\n * this must be a non-primitive object.\n *\n * @returns `true` if the connection succeeds, `false` otherwise.\n */\n function connect(signal, slot, thisArg) {\n // Coerce a `null` `thisArg` to `undefined`.\n thisArg = thisArg || undefined;\n // Ensure the sender's array of receivers is created.\n let receivers = receiversForSender.get(signal.sender);\n if (!receivers) {\n receivers = [];\n receiversForSender.set(signal.sender, receivers);\n }\n // Bail if a matching connection already exists.\n if (findConnection(receivers, signal, slot, thisArg)) {\n return false;\n }\n // Choose the best object for the receiver.\n let receiver = thisArg || slot;\n // Ensure the receiver's array of senders is created.\n let senders = sendersForReceiver.get(receiver);\n if (!senders) {\n senders = [];\n sendersForReceiver.set(receiver, senders);\n }\n // Create a new connection and add it to the end of each array.\n let connection = { signal, slot, thisArg };\n receivers.push(connection);\n senders.push(connection);\n // Indicate a successful connection.\n return true;\n }\n Private.connect = connect;\n /**\n * Disconnect a slot from a signal.\n *\n * @param signal - The signal of interest.\n *\n * @param slot - The slot to disconnect from the signal.\n *\n * @param thisArg - The `this` context for the slot. If provided,\n * this must be a non-primitive object.\n *\n * @returns `true` if the connection is removed, `false` otherwise.\n */\n function disconnect(signal, slot, thisArg) {\n // Coerce a `null` `thisArg` to `undefined`.\n thisArg = thisArg || undefined;\n // Lookup the list of receivers, and bail if none exist.\n let receivers = receiversForSender.get(signal.sender);\n if (!receivers || receivers.length === 0) {\n return false;\n }\n // Bail if no matching connection exits.\n let connection = findConnection(receivers, signal, slot, thisArg);\n if (!connection) {\n return false;\n }\n // Choose the best object for the receiver.\n let receiver = thisArg || slot;\n // Lookup the array of senders, which is now known to exist.\n let senders = sendersForReceiver.get(receiver);\n // Clear the connection and schedule cleanup of the arrays.\n connection.signal = null;\n scheduleCleanup(receivers);\n scheduleCleanup(senders);\n // Indicate a successful disconnection.\n return true;\n }\n Private.disconnect = disconnect;\n /**\n * Remove all connections between a sender and receiver.\n *\n * @param sender - The sender object of interest.\n *\n * @param receiver - The receiver object of interest.\n */\n function disconnectBetween(sender, receiver) {\n // If there are no receivers, there is nothing to do.\n let receivers = receiversForSender.get(sender);\n if (!receivers || receivers.length === 0) {\n return;\n }\n // If there are no senders, there is nothing to do.\n let senders = sendersForReceiver.get(receiver);\n if (!senders || senders.length === 0) {\n return;\n }\n // Clear each connection between the sender and receiver.\n for (const connection of senders) {\n // Skip connections which have already been cleared.\n if (!connection.signal) {\n continue;\n }\n // Clear the connection if it matches the sender.\n if (connection.signal.sender === sender) {\n connection.signal = null;\n }\n }\n // Schedule a cleanup of the senders and receivers.\n scheduleCleanup(receivers);\n scheduleCleanup(senders);\n }\n Private.disconnectBetween = disconnectBetween;\n /**\n * Remove all connections where the given object is the sender.\n *\n * @param sender - The sender object of interest.\n */\n function disconnectSender(sender) {\n // If there are no receivers, there is nothing to do.\n let receivers = receiversForSender.get(sender);\n if (!receivers || receivers.length === 0) {\n return;\n }\n // Clear each receiver connection.\n for (const connection of receivers) {\n // Skip connections which have already been cleared.\n if (!connection.signal) {\n continue;\n }\n // Choose the best object for the receiver.\n let receiver = connection.thisArg || connection.slot;\n // Clear the connection.\n connection.signal = null;\n // Cleanup the array of senders, which is now known to exist.\n scheduleCleanup(sendersForReceiver.get(receiver));\n }\n // Schedule a cleanup of the receivers.\n scheduleCleanup(receivers);\n }\n Private.disconnectSender = disconnectSender;\n /**\n * Remove all connections where the given object is the receiver.\n *\n * @param receiver - The receiver object of interest.\n */\n function disconnectReceiver(receiver) {\n // If there are no senders, there is nothing to do.\n let senders = sendersForReceiver.get(receiver);\n if (!senders || senders.length === 0) {\n return;\n }\n // Clear each sender connection.\n for (const connection of senders) {\n // Skip connections which have already been cleared.\n if (!connection.signal) {\n continue;\n }\n // Lookup the sender for the connection.\n let sender = connection.signal.sender;\n // Clear the connection.\n connection.signal = null;\n // Cleanup the array of receivers, which is now known to exist.\n scheduleCleanup(receiversForSender.get(sender));\n }\n // Schedule a cleanup of the list of senders.\n scheduleCleanup(senders);\n }\n Private.disconnectReceiver = disconnectReceiver;\n /**\n * Remove all connections where an object is the sender or receiver.\n *\n * @param object - The object of interest.\n */\n function disconnectAll(object) {\n // Remove all connections where the given object is the sender.\n disconnectSender(object);\n // Remove all connections where the given object is the receiver.\n disconnectReceiver(object);\n }\n Private.disconnectAll = disconnectAll;\n /**\n * Emit a signal and invoke its connected slots.\n *\n * @param signal - The signal of interest.\n *\n * @param args - The args to pass to the connected slots.\n *\n * #### Notes\n * Slots are invoked synchronously in connection order.\n *\n * Exceptions thrown by connected slots will be caught and logged.\n */\n function emit(signal, args) {\n // If there are no receivers, there is nothing to do.\n let receivers = receiversForSender.get(signal.sender);\n if (!receivers || receivers.length === 0) {\n return;\n }\n // Invoke the slots for connections with a matching signal.\n // Any connections added during emission are not invoked.\n for (let i = 0, n = receivers.length; i < n; ++i) {\n let connection = receivers[i];\n if (connection.signal === signal) {\n invokeSlot(connection, args);\n }\n }\n }\n Private.emit = emit;\n /**\n * A weak mapping of sender to array of receiver connections.\n */\n const receiversForSender = new WeakMap();\n /**\n * A weak mapping of receiver to array of sender connections.\n */\n const sendersForReceiver = new WeakMap();\n /**\n * A set of connection arrays which are pending cleanup.\n */\n const dirtySet = new Set();\n /**\n * A function to schedule an event loop callback.\n */\n const schedule = (() => {\n let ok = typeof requestAnimationFrame === 'function';\n return ok ? requestAnimationFrame : setImmediate;\n })();\n /**\n * Find a connection which matches the given parameters.\n */\n function findConnection(connections, signal, slot, thisArg) {\n return find(connections, connection => connection.signal === signal &&\n connection.slot === slot &&\n connection.thisArg === thisArg);\n }\n /**\n * Invoke a slot with the given parameters.\n *\n * The connection is assumed to be valid.\n *\n * Exceptions in the slot will be caught and logged.\n */\n function invokeSlot(connection, args) {\n let { signal, slot, thisArg } = connection;\n try {\n slot.call(thisArg, signal.sender, args);\n }\n catch (err) {\n Private.exceptionHandler(err);\n }\n }\n /**\n * Schedule a cleanup of a connection array.\n *\n * This will add the array to the dirty set and schedule a deferred\n * cleanup of the array contents. On cleanup, any connection with a\n * `null` signal will be removed from the array.\n */\n function scheduleCleanup(array) {\n if (dirtySet.size === 0) {\n schedule(cleanupDirtySet);\n }\n dirtySet.add(array);\n }\n /**\n * Cleanup the connection lists in the dirty set.\n *\n * This function should only be invoked asynchronously, when the\n * stack frame is guaranteed to not be on the path of user code.\n */\n function cleanupDirtySet() {\n dirtySet.forEach(cleanupConnections);\n dirtySet.clear();\n }\n /**\n * Cleanup the dirty connections in a connections array.\n *\n * This will remove any connection with a `null` signal.\n *\n * This function should only be invoked asynchronously, when the\n * stack frame is guaranteed to not be on the path of user code.\n */\n function cleanupConnections(connections) {\n ArrayExt.removeAllWhere(connections, isDeadConnection);\n }\n /**\n * Test whether a connection is dead.\n *\n * A dead connection has a `null` signal.\n */\n function isDeadConnection(connection) {\n return connection.signal === null;\n }\n})(Private || (Private = {}));\n\nexport { Signal, Stream };\n//# sourceMappingURL=index.es6.js.map\n","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attributeNames = exports.elementNames = void 0;\nexports.elementNames = new Map([\n [\"altglyph\", \"altGlyph\"],\n [\"altglyphdef\", \"altGlyphDef\"],\n [\"altglyphitem\", \"altGlyphItem\"],\n [\"animatecolor\", \"animateColor\"],\n [\"animatemotion\", \"animateMotion\"],\n [\"animatetransform\", \"animateTransform\"],\n [\"clippath\", \"clipPath\"],\n [\"feblend\", \"feBlend\"],\n [\"fecolormatrix\", \"feColorMatrix\"],\n [\"fecomponenttransfer\", \"feComponentTransfer\"],\n [\"fecomposite\", \"feComposite\"],\n [\"feconvolvematrix\", \"feConvolveMatrix\"],\n [\"fediffuselighting\", \"feDiffuseLighting\"],\n [\"fedisplacementmap\", \"feDisplacementMap\"],\n [\"fedistantlight\", \"feDistantLight\"],\n [\"fedropshadow\", \"feDropShadow\"],\n [\"feflood\", \"feFlood\"],\n [\"fefunca\", \"feFuncA\"],\n [\"fefuncb\", \"feFuncB\"],\n [\"fefuncg\", \"feFuncG\"],\n [\"fefuncr\", \"feFuncR\"],\n [\"fegaussianblur\", \"feGaussianBlur\"],\n [\"feimage\", \"feImage\"],\n [\"femerge\", \"feMerge\"],\n [\"femergenode\", \"feMergeNode\"],\n [\"femorphology\", \"feMorphology\"],\n [\"feoffset\", \"feOffset\"],\n [\"fepointlight\", \"fePointLight\"],\n [\"fespecularlighting\", \"feSpecularLighting\"],\n [\"fespotlight\", \"feSpotLight\"],\n [\"fetile\", \"feTile\"],\n [\"feturbulence\", \"feTurbulence\"],\n [\"foreignobject\", \"foreignObject\"],\n [\"glyphref\", \"glyphRef\"],\n [\"lineargradient\", \"linearGradient\"],\n [\"radialgradient\", \"radialGradient\"],\n [\"textpath\", \"textPath\"],\n]);\nexports.attributeNames = new Map([\n [\"definitionurl\", \"definitionURL\"],\n [\"attributename\", \"attributeName\"],\n [\"attributetype\", \"attributeType\"],\n [\"basefrequency\", \"baseFrequency\"],\n [\"baseprofile\", \"baseProfile\"],\n [\"calcmode\", \"calcMode\"],\n [\"clippathunits\", \"clipPathUnits\"],\n [\"diffuseconstant\", \"diffuseConstant\"],\n [\"edgemode\", \"edgeMode\"],\n [\"filterunits\", \"filterUnits\"],\n [\"glyphref\", \"glyphRef\"],\n [\"gradienttransform\", \"gradientTransform\"],\n [\"gradientunits\", \"gradientUnits\"],\n [\"kernelmatrix\", \"kernelMatrix\"],\n [\"kernelunitlength\", \"kernelUnitLength\"],\n [\"keypoints\", \"keyPoints\"],\n [\"keysplines\", \"keySplines\"],\n [\"keytimes\", \"keyTimes\"],\n [\"lengthadjust\", \"lengthAdjust\"],\n [\"limitingconeangle\", \"limitingConeAngle\"],\n [\"markerheight\", \"markerHeight\"],\n [\"markerunits\", \"markerUnits\"],\n [\"markerwidth\", \"markerWidth\"],\n [\"maskcontentunits\", \"maskContentUnits\"],\n [\"maskunits\", \"maskUnits\"],\n [\"numoctaves\", \"numOctaves\"],\n [\"pathlength\", \"pathLength\"],\n [\"patterncontentunits\", \"patternContentUnits\"],\n [\"patterntransform\", \"patternTransform\"],\n [\"patternunits\", \"patternUnits\"],\n [\"pointsatx\", \"pointsAtX\"],\n [\"pointsaty\", \"pointsAtY\"],\n [\"pointsatz\", \"pointsAtZ\"],\n [\"preservealpha\", \"preserveAlpha\"],\n [\"preserveaspectratio\", \"preserveAspectRatio\"],\n [\"primitiveunits\", \"primitiveUnits\"],\n [\"refx\", \"refX\"],\n [\"refy\", \"refY\"],\n [\"repeatcount\", \"repeatCount\"],\n [\"repeatdur\", \"repeatDur\"],\n [\"requiredextensions\", \"requiredExtensions\"],\n [\"requiredfeatures\", \"requiredFeatures\"],\n [\"specularconstant\", \"specularConstant\"],\n [\"specularexponent\", \"specularExponent\"],\n [\"spreadmethod\", \"spreadMethod\"],\n [\"startoffset\", \"startOffset\"],\n [\"stddeviation\", \"stdDeviation\"],\n [\"stitchtiles\", \"stitchTiles\"],\n [\"surfacescale\", \"surfaceScale\"],\n [\"systemlanguage\", \"systemLanguage\"],\n [\"tablevalues\", \"tableValues\"],\n [\"targetx\", \"targetX\"],\n [\"targety\", \"targetY\"],\n [\"textlength\", \"textLength\"],\n [\"viewbox\", \"viewBox\"],\n [\"viewtarget\", \"viewTarget\"],\n [\"xchannelselector\", \"xChannelSelector\"],\n [\"ychannelselector\", \"yChannelSelector\"],\n [\"zoomandpan\", \"zoomAndPan\"],\n]);\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/*\n * Module dependencies\n */\nvar ElementType = __importStar(require(\"domelementtype\"));\nvar entities_1 = require(\"entities\");\n/**\n * Mixed-case SVG and MathML tags & attributes\n * recognized by the HTML parser.\n *\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nvar foreignNames_1 = require(\"./foreignNames\");\nvar unencodedElements = new Set([\n \"style\",\n \"script\",\n \"xmp\",\n \"iframe\",\n \"noembed\",\n \"noframes\",\n \"plaintext\",\n \"noscript\",\n]);\n/**\n * Format attributes\n */\nfunction formatAttributes(attributes, opts) {\n if (!attributes)\n return;\n return Object.keys(attributes)\n .map(function (key) {\n var _a, _b;\n var value = (_a = attributes[key]) !== null && _a !== void 0 ? _a : \"\";\n if (opts.xmlMode === \"foreign\") {\n /* Fix up mixed-case attribute names */\n key = (_b = foreignNames_1.attributeNames.get(key)) !== null && _b !== void 0 ? _b : key;\n }\n if (!opts.emptyAttrs && !opts.xmlMode && value === \"\") {\n return key;\n }\n return key + \"=\\\"\" + (opts.decodeEntities !== false\n ? entities_1.encodeXML(value)\n : value.replace(/\"/g, \""\")) + \"\\\"\";\n })\n .join(\" \");\n}\n/**\n * Self-enclosing tags\n */\nvar singleTag = new Set([\n \"area\",\n \"base\",\n \"basefont\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"frame\",\n \"hr\",\n \"img\",\n \"input\",\n \"isindex\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n/**\n * Renders a DOM node or an array of DOM nodes to a string.\n *\n * Can be thought of as the equivalent of the `outerHTML` of the passed node(s).\n *\n * @param node Node to be rendered.\n * @param options Changes serialization behavior\n */\nfunction render(node, options) {\n if (options === void 0) { options = {}; }\n var nodes = \"length\" in node ? node : [node];\n var output = \"\";\n for (var i = 0; i < nodes.length; i++) {\n output += renderNode(nodes[i], options);\n }\n return output;\n}\nexports.default = render;\nfunction renderNode(node, options) {\n switch (node.type) {\n case ElementType.Root:\n return render(node.children, options);\n case ElementType.Directive:\n case ElementType.Doctype:\n return renderDirective(node);\n case ElementType.Comment:\n return renderComment(node);\n case ElementType.CDATA:\n return renderCdata(node);\n case ElementType.Script:\n case ElementType.Style:\n case ElementType.Tag:\n return renderTag(node, options);\n case ElementType.Text:\n return renderText(node, options);\n }\n}\nvar foreignModeIntegrationPoints = new Set([\n \"mi\",\n \"mo\",\n \"mn\",\n \"ms\",\n \"mtext\",\n \"annotation-xml\",\n \"foreignObject\",\n \"desc\",\n \"title\",\n]);\nvar foreignElements = new Set([\"svg\", \"math\"]);\nfunction renderTag(elem, opts) {\n var _a;\n // Handle SVG / MathML in HTML\n if (opts.xmlMode === \"foreign\") {\n /* Fix up mixed-case element names */\n elem.name = (_a = foreignNames_1.elementNames.get(elem.name)) !== null && _a !== void 0 ? _a : elem.name;\n /* Exit foreign mode at integration points */\n if (elem.parent &&\n foreignModeIntegrationPoints.has(elem.parent.name)) {\n opts = __assign(__assign({}, opts), { xmlMode: false });\n }\n }\n if (!opts.xmlMode && foreignElements.has(elem.name)) {\n opts = __assign(__assign({}, opts), { xmlMode: \"foreign\" });\n }\n var tag = \"<\" + elem.name;\n var attribs = formatAttributes(elem.attribs, opts);\n if (attribs) {\n tag += \" \" + attribs;\n }\n if (elem.children.length === 0 &&\n (opts.xmlMode\n ? // In XML mode or foreign mode, and user hasn't explicitly turned off self-closing tags\n opts.selfClosingTags !== false\n : // User explicitly asked for self-closing tags, even in HTML mode\n opts.selfClosingTags && singleTag.has(elem.name))) {\n if (!opts.xmlMode)\n tag += \" \";\n tag += \"/>\";\n }\n else {\n tag += \">\";\n if (elem.children.length > 0) {\n tag += render(elem.children, opts);\n }\n if (opts.xmlMode || !singleTag.has(elem.name)) {\n tag += \"\";\n }\n }\n return tag;\n}\nfunction renderDirective(elem) {\n return \"<\" + elem.data + \">\";\n}\nfunction renderText(elem, opts) {\n var data = elem.data || \"\";\n // If entities weren't decoded, no need to encode them back\n if (opts.decodeEntities !== false &&\n !(!opts.xmlMode &&\n elem.parent &&\n unencodedElements.has(elem.parent.name))) {\n data = entities_1.encodeXML(data);\n }\n return data;\n}\nfunction renderCdata(elem) {\n return \"\";\n}\nfunction renderComment(elem) {\n return \"\";\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Doctype = exports.CDATA = exports.Tag = exports.Style = exports.Script = exports.Comment = exports.Directive = exports.Text = exports.Root = exports.isTag = exports.ElementType = void 0;\n/** Types of elements found in htmlparser2's DOM */\nvar ElementType;\n(function (ElementType) {\n /** Type for the root element of a document */\n ElementType[\"Root\"] = \"root\";\n /** Type for Text */\n ElementType[\"Text\"] = \"text\";\n /** Type for */\n ElementType[\"Directive\"] = \"directive\";\n /** Type for */\n ElementType[\"Comment\"] = \"comment\";\n /** Type for