" - + display_out - + "" + def html(self): + """Displays model as HTML.""" + # NOTE(nopdive): Have this public for now until all widget related issues are sorted out. + clear_output(wait=True) + display(HTML(self._html())) + + def _html(self) -> str: + """Returns HTML string that displays the model object.""" + + return trace_node_to_html( + self.engine.trace_handler.id_node_map[self._id], hasattr(self, "indent_roles") ) - return display_out def _send_to_event_queue(self, value): """For streaming in code. @@ -363,10 +923,13 @@ def copy(self): # then copy a few things we need deeper copies of new_lm._variables = self._variables.copy() new_lm._variables_log_probs = self._variables_log_probs.copy() + new_lm._variables_positions = self._variables_positions.copy() new_lm.opened_blocks = self.opened_blocks.copy() # create a new clean event queue - new_lm._event_queue = None # we start with no event queue because nobody is listening to us yet + new_lm._event_queue = ( + None # we start with no event queue because nobody is listening to us yet + ) if self._event_queue is not None: # if the current lm has an event queue, we make it our parent @@ -374,8 +937,19 @@ def copy(self): elif self._event_parent is not None: # otherwise if the current event que has an event parent then that is also our parent - new_lm._event_parent = self._event_parent - + new_lm._event_parent = self._event_parent + + new_lm._id = self.__class__.gen_id() + new_lm._parent_id = self._id + new_lm._trace_nodes = set() + new_lm._update_trace_node(new_lm._id, new_lm._parent_id, None) + self.engine.model_dict[new_lm._id] = new_lm + new_lm.vis_chunk = None + new_lm._parent = self + new_lm.metrics = self.metrics.model_copy(deep=True) + + weakref.finalize(new_lm, log_cleanup, f"model({id(self)})") + log_copy(f"model({id(self)})") return new_lm def _inplace_append(self, value, force_silent=False): @@ -386,40 +960,18 @@ def _inplace_append(self, value, force_silent=False): Parameters ---------- - value : bytes + value : bytes | str The bytes we should append to our current state. """ # update the byte state - self._state += str(value) # TODO: make _state to be bytes not a string - - # see if we should update the display - if not force_silent: - self._update_display() + v = value + if not isinstance(v, str): + v = str(value) + self._state += v # this is for programmatic streaming among other things - if Model._throttle_refresh > 0: - curr_time = time.time() - if curr_time - self._last_event_stream >= self.max_display_rate: - self._last_event_stream = curr_time - self._send_to_event_queue(self) - else: - self._send_to_event_queue(self) - - def _update_display(self, throttle=True): - if self.echo: - if Model._throttle_refresh > 0: - curr_time = time.time() - if throttle and curr_time - self._last_display < self.max_display_rate: - return # we are throttling the update - else: - self._last_display = curr_time - - if ipython_is_imported: - clear_output(wait=True) - display(HTML(self._html())) - else: - pprint(self._state) + self._send_to_event_queue(self) def reset(self, clear_variables=True): """This resets the state of the model object. @@ -429,13 +981,40 @@ def reset(self, clear_variables=True): clear_variables : bool If we should clear all the model object's variables in addition to reseting the byte state. """ + # TODO(nopdive): This violates the immutability assumption on model class for users. Remove on confirmation. + self._state = self._state[:0] self.opened_blocks = {} if clear_variables: self._variables = {} self._variables_log_probs = {} + self._variables_positions = {} return self + def role_opener(self, role_name, **kwargs): + # TODO [HN]: Temporary change while I instrument chat_template in transformers only. + # Eventually have all models use chat_template. + if hasattr(self, "get_role_start"): + return self.get_role_start(role_name, **kwargs) + elif hasattr(self, "chat_template"): + return self.chat_template.get_role_start(role_name) + else: + raise Exception( + f"You need to use a chat model in order the use role blocks like `with {role_name}():`! Perhaps you meant to use the {type(self).__name__}Chat class?" + ) + + def role_closer(self, role_name, **kwargs): + # TODO [HN]: Temporary change while I instrument chat_template in transformers only. + # Eventually have all models use chat_template. + if hasattr(self, "get_role_end"): + return self.get_role_end(role_name, **kwargs) + elif hasattr(self, "chat_template"): + return self.chat_template.get_role_end(role_name) + else: + raise Exception( + f"You need to use a chat model in order the use role blocks like `with {role_name}():`! Perhaps you meant to use the {type(self).__name__}Chat class?" + ) + def _repr_html_(self): if ipython_is_imported: clear_output(wait=True) @@ -443,14 +1022,30 @@ def _repr_html_(self): def _current_prompt(self): """The current prompt in bytes (which is the state without the context close tags).""" - return format_pattern.sub("", self._state) + return trace_node_to_str(self.engine.trace_handler.id_node_map[self._id]) + + def _update_trace_node( + self, identifier: int, parent_id: Optional[int], node_attr: Optional[NodeAttr] + ): + """Updates trace node that corresponds to this model.""" + + trace_node = self.engine.trace_handler.update_node(identifier, parent_id, node_attr) + self._trace_nodes.add(trace_node) + + if self.renderer is not None: + self.renderer.update( + TraceMessage( + trace_id=identifier, + parent_trace_id=parent_id, + node_attr=node_attr, + ) + ) def __str__(self): """A string representation of the current model object (that includes context closers).""" - out = self._current_prompt() - for context in reversed(self.opened_blocks): - out += format_pattern.sub("", self.opened_blocks[context][1]) - return out + + # TODO(nopdive): Ensure context closers or no? + return trace_node_to_str(self.engine.trace_handler.id_node_map[self._id]) def __add__(self, value): """Adding is the primary mechanism for extending model state. @@ -465,102 +1060,164 @@ def __add__(self, value): # (we need to do this since Model objects are immutable) lm = self.copy() - # inside this context we are free to drop display calls that come too close together - with throttle_refresh(): + # find blocks that are now active, but haven't been opened by lm yet + enter_blocks = [] + for context in Model.global_active_blocks: + if context not in lm.opened_blocks: + enter_blocks.append(context) + lm.opened_blocks[context] = (0, "") + + # find opened blocks by lm, but are no longer active + exit_blocks = [] + for context in list(reversed(lm.opened_blocks.keys())): + if context not in Model.global_active_blocks: + exit_blocks.append(context) + + # finish any exiting blocks + for context in exit_blocks: + pos, close_text = lm.opened_blocks[context] + del lm.opened_blocks[context] + + # handle variables + if context.name is not None: + # TODO(nopdive): Replace with trace traversal. + v = format_pattern.sub("", lm._state[pos:]) + lm._variables[context.name] = v + lm._variables_positions[context.name] = pos + lm._update_trace_node( + lm._id, lm._parent_id, CaptureOutput(name=context.name, value=v) + ) - # find what new blocks need to be applied - new_blocks = [] - for context in Model.open_blocks: - if context not in lm.opened_blocks: - new_blocks.append(context) + # add closer + # TODO(nopdive): Consider removing context closer/opener on confirmation. + closer_text = context.closer if isinstance(context.closer, str) else "" + lm._update_trace_node( + lm._id, lm._parent_id, RoleCloserInput(name=context.name, text=closer_text) + ) + lm += context.closer + lm = lm.copy() + + # start any entering blocks + for context in enter_blocks: + # add opener + opener_text = context.opener if isinstance(context.opener, str) else "" + closer_text = context.closer if isinstance(context.closer, str) else "" + + lm._update_trace_node( + lm._id, + lm._parent_id, + RoleOpenerInput(name=context.name, text=opener_text, closer_text=closer_text), + ) + lm += context.opener + lm = lm.copy() + + # store closer for state extraction later + # TODO(nopdive): Replace with trace traversal. + lm.opened_blocks[context] = (len(lm._state), closer_text) + + # handle variables + # NOTE(nopdive): No stack for variables, this process removes shadowed variables? + if context.name is not None: + if context.name in lm._variables: + del lm._variables[context.name] + if context.name in lm._variables_log_probs: + del lm._variables_log_probs[context.name] + if context.name in lm._variables_positions: + del lm._variables_positions[context.name] + + if isinstance(value, TextOutput): + lm._inplace_append(value.value) + out = lm + out._update_trace_node(out._id, out._parent_id, value) + elif isinstance(value, CaptureOutput): + out = lm + out._update_trace_node(out._id, out._parent_id, value) + elif isinstance(value, str): + # wrap raw string values - # mark this so we don't re-add when computing the opener or closer (even though we don't know the close text yet) - lm.opened_blocks[context] = (0, "") + is_id = False + parts = re.split(_tag_pattern, value) - # find what old blocks need to be removed - old_blocks = [] - for context in list(reversed(lm.opened_blocks)): - if context not in Model.open_blocks and context in lm.opened_blocks: - old_blocks.append((lm.opened_blocks[context], context)) + # we have no embedded objects + if len(parts) == 1: + lm._update_trace_node(lm._id, lm._parent_id, LiteralInput(value=value)) - # delete this so we don't re-close when computing the opener or closer - del lm.opened_blocks[context] + lm._inplace_append(value) + out = lm - # close any newly closed contexts - for (pos, close_text), context in old_blocks: - if context.name is not None: - lm._variables[context.name] = format_pattern.sub( - "", lm._state[pos:] + # generate VisBytesChunk so we know this chunk is input + input_tokens = [] + if self.echo: + _bytes = value.encode("utf-8") + _tokens = out.engine.tokenizer.encode(_bytes) + out.vis_chunk = VisBytesChunk( + bytes=_bytes, + is_input=True, + input_tokens=[ + GenToken( + token_id=_token, + prob=1.0, + text=to_utf8_or_bytes_string(out.engine.tokenizer.decode([_token])), + latency_ms=0, + is_generated=False, + is_force_forwarded=False, + is_input=True, + ) + for _token in _tokens + ], ) - lm += context.closer - - # apply any newly opened contexts (new from this object's perspective) - for context in new_blocks: - lm += context.opener - with grammar_only(): - tmp = lm + context.closer - close_text = tmp._state[len(lm._state):] # get the new state added by calling the closer - lm.opened_blocks[context] = (len(lm._state), close_text) - - # clear out names that we override - if context.name is not None: - if context.name in lm._variables: - del lm._variables[context.name] - if context.name in lm._variables_log_probs: - del lm._variables_log_probs[context.name] + input_tokens = out.vis_chunk.input_tokens - # wrap raw string values - if isinstance(value, str): - is_id = False - parts = re.split(_tag_pattern, value) + out._update_trace_node( + out._id, + out._parent_id, + TextOutput(value=value, is_input=True, tokens=input_tokens), + ) - # we have no embedded objects - if len(parts) == 1: - lm._inplace_append(value) - out = lm + # if we have embedded objects we have to convert the string to a grammar tree + else: + lm._update_trace_node(lm._id, lm._parent_id, EmbeddedInput(value=value)) + + partial_grammar = _null_grammar + lm.suffix = "" + for i, part in enumerate(parts): + if i < len(parts) - 1: + lm.suffix = parts[i + 1] + if is_id: + call = _call_pool[part] + if isinstance(call, GrammarFunction): + partial_grammar += _call_pool[part] + else: + lm += partial_grammar + lm = _call_pool[part](lm) + partial_grammar = _null_grammar + elif part != "": + partial_grammar += string(part) + is_id = not is_id - # if we have embedded objects we have to convert the string to a grammar tree - else: - partial_grammar = _null_grammar - lm.suffix = "" - for i, part in enumerate(parts): - if i < len(parts) - 1: - lm.suffix = parts[i + 1] - if is_id: - call = _call_pool[part] - if isinstance(call, GrammarFunction): - partial_grammar += _call_pool[part] - else: - lm += partial_grammar - lm = _call_pool[part](lm) - partial_grammar = _null_grammar - elif part != "": - partial_grammar += string(part) - is_id = not is_id - out = lm + partial_grammar - - # if we find a null value we do nothing - elif isinstance(value, Null): - out = lm + out = lm + partial_grammar - # run stateless functions (grammar nodes) - elif isinstance(value, GrammarFunction): - out = lm._run_stateless(value) + # if we find a null value we do nothing + elif isinstance(value, Null): + out = lm - # run stateful functions - else: - out = value(lm) - if out is None: - raise Exception( - f"A guidance function returned `None`, not a model object! Did you forget to return the new lm at the end of your function?" - ) - if not isinstance(out, Model): - raise Exception( - f"A guidance function did not return a model object! Did you try to add a function to a model without calling the function? For example `model + guidance_function()` is correct, while `model + guidance_function` will cause this error." - ) + # run stateless functions (grammar nodes) + elif isinstance(value, GrammarFunction): + lm._update_trace_node(lm._id, lm._parent_id, StatelessGuidanceInput(value=value)) + out = lm._run_stateless(value) - # this flushes the display - out._inplace_append("") + # run stateful functions + else: + lm._update_trace_node(lm._id, lm._parent_id, StatefulGuidanceInput(value=value)) + out = value(lm) + if out is None: + raise Exception( + f"A guidance function returned `None`, not a model object! Did you forget to return the new lm at the end of your function?" + ) + if not isinstance(out, Model): + raise Exception( + f"A guidance function did not return a model object! Did you try to add a function to a model without calling the function? For example `model + guidance_function()` is correct, while `model + guidance_function` will cause this error." + ) return out @@ -588,9 +1245,7 @@ def __getitem__(self, key): else: for context in list(reversed(self.opened_blocks)): if context.name == key: - return format_pattern.sub( - "", self._state[self.opened_blocks[context][0] :] - ) + return format_pattern.sub("", self._state[self.opened_blocks[context][0] :]) raise KeyError(f"Model does not contain the variable '{key}'") @@ -739,10 +1394,13 @@ def _run_stateless(self, stateless_function, temperature=0.0, top_p=1.0, n=1): replacements = replace_model_variables(stateless_function, self) # start the generation stream - gen_obj = self.engine(self._current_prompt(), stateless_function) + gen_obj = self.engine(self._current_prompt(), stateless_function, echo=self.echo) # we will return a new extended version of ourselves, which we track as `lm` lm = self + lm.engine.metrics.engine_backtrack_tokens = lm.metrics.engine_backtrack_tokens + lm.engine.metrics.engine_input_tokens = lm.metrics.engine_input_tokens + lm.engine.metrics.engine_output_tokens = lm.metrics.engine_output_tokens # single generation if n == 1: @@ -751,6 +1409,7 @@ def _run_stateless(self, stateless_function, temperature=0.0, top_p=1.0, n=1): delayed_bytes = b"" # last_is_generated = False + for chunk in gen_obj: # we make everything full probability if we are not computing uncertainty @@ -767,16 +1426,43 @@ def _run_stateless(self, stateless_function, temperature=0.0, top_p=1.0, n=1): continue delayed_bytes = b"" + if chunk.backtrack: + lm.engine.metrics.engine_backtrack_tokens += chunk.backtrack + if len(chunk.new_bytes) > 0: generated_value += new_text - if chunk.is_generated: - lm += f"<||_html:_||>" - lm += new_text - if chunk.is_generated: - lm += "<||_html:_||>" - # last_is_generated = chunk.is_generated + # split chunk into generated and force_forwarded parts for better animated visualization + if chunk.generated_bytes: + lm += TextOutput( + value=chunk.generated_bytes.decode("utf8"), + is_generated=True, + token_count=0, + prob=0.0, + tokens=chunk.generated_tokens, + ) + + if chunk.force_forwarded_bytes: + lm += TextOutput( + value=chunk.force_forwarded_bytes.decode("utf8"), + is_force_forwarded=True, + token_count=0, + prob=0.0, + tokens=chunk.force_forwarded_tokens, + ) + + if self.echo: + lm.vis_chunk = VisBytesChunk( + bytes=chunk.new_bytes, + is_input=False, + # generated_bytes=chunk.generated_bytes, + generated_tokens=chunk.generated_tokens, + force_forwarded_tokens=chunk.force_forwarded_tokens, + backtrack=chunk.backtrack, + engine_outputs=chunk.engine_outputs, + ) + # last_is_generated = chunk.is_generated if len(chunk.capture_groups) > 0: for k in chunk.capture_groups: v = chunk.capture_groups[k] @@ -797,13 +1483,24 @@ def _run_stateless(self, stateless_function, temperature=0.0, top_p=1.0, n=1): if k not in lm or not isinstance(lm._variables[k], list): lm._variables[k] = [] - if k not in lm._variables_log_probs or not isinstance(lm._variables_log_probs[k], list): + lm += CaptureOutput(name=k) + if k not in lm._variables_log_probs or not isinstance( + lm._variables_log_probs[k], list + ): lm._variables_log_probs[k] = [] - + if k not in lm._variables_positions: + lm._variables_positions[k] = len(lm._state) + lm._variables[k].append(inner_v) lm._variables_log_probs[k].append( chunk.capture_group_log_probs[k][i] ) + lm += CaptureOutput( + name=k, + value=inner_v, + is_append=True, + log_probs=lm._variables_log_probs[k][i], + ) # ...or standard assignment mode else: @@ -813,8 +1510,15 @@ def _run_stateless(self, stateless_function, temperature=0.0, top_p=1.0, n=1): v = v.decode("utf8") if isinstance(v, bytes) else v except UnicodeDecodeError: pass + lm._variables[k] = v + lm._variables_positions[k] = len(lm._state) - len(v) lm._variables_log_probs[k] = chunk.capture_group_log_probs[k] + lm += CaptureOutput( + name=k, + value=v, + log_probs=chunk.capture_group_log_probs[k], + ) # if len(chunk.capture_groups) > 0: # for k in chunk.capture_groups: @@ -825,8 +1529,346 @@ def _run_stateless(self, stateless_function, temperature=0.0, top_p=1.0, n=1): logger.debug("finish Model._run_stateless") + lm.metrics = lm.engine.metrics.model_copy(deep=True) + return lm + def get_per_token_stats(self) -> list[GenTokenExtra]: + """Get the per token stats (prob, top-k, latency, etc.) for the model. + + Returns + List[GenTokenExtra]: a list of GenToken objects. + """ + + paths = [] + model = self + while model is not None: + paths.append(model) + if model._parent_id is None: + break + model: "Model" = self.engine.model_dict[model._parent_id] + paths.reverse() + + vis_chunks: list[VisBytesChunk] = [ + path.vis_chunk for path in paths if path.vis_chunk is not None + ] + + gen_tokens_infos: list[tuple[int, float, list[GenToken]]] = [] + gen_tokens_indices: list[int] = [] + for vis_chunk in vis_chunks: + for engine_output in vis_chunk.engine_outputs: + gen_tokens_infos.append( + ( + engine_output.issued_token.token_id, + engine_output.issued_token.latency_ms, + engine_output.masked_top_k, + ) + ) + gen_tokens_indices.append(len(gen_tokens_infos) - 1) + + text = self._state + token_ids = self.engine.tokenizer.encode(text.encode("utf-8")) + + # verify if text == encode(decode(text)) + # decoded_text = self.engine.tokenizer.decode(token_ids).decode("utf-8") + decoded_text = "".join(self.engine.tokenizer.decode([_token]).decode("utf-8") for _token in token_ids) + + token_texts: list[str] = [] + if text == decoded_text: + for idx, token_id in enumerate(token_ids): + token_texts.append(self.engine.tokenizer.decode([token_id]).decode("utf-8")) + else: + # Some models like phi-3 removes spaces and line breaks + # Scan through the text and find the missing chunks so we can map the token back into generated chunks by the parser later on + ptr_idx = 0 + for _idx, token_id in enumerate(token_ids): + missing_chunk = "" + decoded = self.engine.tokenizer.decode([token_id]).decode("utf-8") + if not text[ptr_idx:].startswith(decoded): + _next_idx = ptr_idx + found = False + while _next_idx < len(text): + if text[_next_idx:].startswith(decoded): + found = True + break + _next_idx += 1 + + assert found, f"Failed to find the token {decoded} in the text {text}" + missing_chunk = text[ptr_idx:_next_idx] + + token_texts.append(missing_chunk + decoded) + ptr_idx += len(missing_chunk + decoded) + + # verify + _decoded_text = "".join(token_texts) + assert _decoded_text in text, f"Failed to decode the text {text} into {_decoded_text}" + if _decoded_text in text and len(_decoded_text) < len(text): + # there are some missing chunks (probably empty spaces/ end lines removed by the tokenizer) + missing_chunk = text[len(_decoded_text):] + token_texts[-1] += missing_chunk + + # NOTE (loc): Not all engines support the get_logits method + try: + # make sure token_ids start with BOS token if needed + prev_token_ids_len = len(token_ids) + if ( + len(token_ids) > 0 + and self.engine.tokenizer.bos_token_id != None + and token_ids[0] != self.engine.tokenizer.bos_token_id + ): + token_ids = [self.engine.tokenizer.bos_token_id] + token_ids + + tokens_with_topk = self.engine.get_per_token_topk_probs(token_ids, top_k=self.engine._top_k) + + # remove the BOS token + if prev_token_ids_len != len(token_ids): + token_ids = token_ids[1:] + tokens_with_topk = tokens_with_topk[1:] + + except Exception as e: + logger.warning( + f"Failed to get the top k probabilities for the tokens {token_ids}. Error: {e}" + ) + # FIXME (loc): assume prob 1.0 for all tokens + tokens_with_topk = [] + for token_id, token_text in zip(token_ids, token_texts): + tokens_with_topk.append( + GenTokenExtra( + token_id=token_id, + prob=1.0, + text=token_text, + top_k=[ + GenToken(token_id=token_id, prob=1.0, text=token_text), + ], + ) + ) + + start_idx = 0 + end_idx = 1 + start_pos = 0 + remainder = "" + + processed_gen_tokens: list[GenTokenExtra] = [] + # Map token back to generated chunk to extract correct info (is_generated, latency, etc.) + for vis_chunk_idx, vis_chunk in enumerate(vis_chunks): + vis_text = vis_chunk.bytes.decode("utf-8") + + if not vis_text: + continue + + # Find the chunk starting at start_idx that contains the vis_text + end_idx = start_idx + _chunk = "".join(token_texts[start_idx : end_idx + 1]) + while vis_text not in _chunk and end_idx < len(token_texts): + # expand the chunk + end_idx += 1 + _chunk = "".join(token_texts[start_idx : end_idx + 1]) + + if vis_text not in _chunk and end_idx >= len(token_texts): + # failed = True + # break + raise Exception(f"Failed to find the {vis_text} in the tokens chunk {_chunk}") + + if vis_text == _chunk: + # perfect match + pass + else: + start_pos = _chunk.index(vis_text) + remainder = _chunk[start_pos + len(vis_text) :] + + if remainder: + # we have a current chunk that is larger than the vis_text + # probably the last token is a partial token that spans across two chunks due to backtracking + # we should not issue that token for now + end_idx -= 1 + + _chunk_token_ids = token_ids[start_idx : end_idx + 1] + _chunk_tokens_with_topk = tokens_with_topk[start_idx : end_idx + 1] + _chunk_token_texts = token_texts[start_idx : end_idx + 1] + + is_input = len(vis_chunk.input_tokens) > 0 + is_force_forwarded = len(vis_chunk.force_forwarded_tokens) > 0 + + _gen_tokens: list[GenTokenExtra] = [] + for token_id, token_info_with_topk, token_text in zip( + _chunk_token_ids, _chunk_tokens_with_topk, _chunk_token_texts + ): + prob = -1 + for _token in token_info_with_topk.top_k: + if _token.token_id == token_id: + prob = _token.prob + break + + _gen_token = GenTokenExtra( + token_id=token_id, + prob=prob, + text=token_text, + latency_ms=0, + is_input=is_input, + is_generated=False, + is_force_forwarded=False, + ) + _gen_token.top_k = token_info_with_topk.top_k + _gen_tokens.append(_gen_token) + + for i, _gen_token in enumerate(_gen_tokens): + if not is_input: + if i < len(vis_chunk.generated_tokens): + _gen_token.is_generated = True + else: + if is_force_forwarded: + _gen_token.is_force_forwarded = True + + # Start from the end of current chunk + # go backwards to find the match between token and associated text string + found_perfect_match = False + max_idx = gen_tokens_indices[vis_chunk_idx] + for idx in range(max_idx, -1, -1): + if _gen_token.token_id == gen_tokens_infos[idx][0]: + _gen_token.latency_ms = gen_tokens_infos[idx][1] + _masked_top_k = gen_tokens_infos[idx][2] + + # if we find a match in tokens list generated by the engine, then this token should be marked as generated + _gen_token.is_generated = True + _gen_token.is_force_forwarded = False + + if _masked_top_k is None: + # in free accepting state, no masking + for _token in _gen_token.top_k: + _token.is_masked = False + else: + _masked_tokens = [token.token_id for token in _masked_top_k] + for _token in _gen_token.top_k: + if _token.token_id not in _masked_tokens: + _token.is_masked = True + else: + _token.is_masked = False + + found_perfect_match = True + break + + # NOTE (loc): There are cases that the generated token and issued token are not matched + # for example, the engine may issue token "pl" but the parser decides to generate token "plate" due to the constraints + # To mitigate the issue, we narrow down the search space to find the text that may contain the generated token + if not found_perfect_match: + # only search within this chunk + max_idx = gen_tokens_indices[vis_chunk_idx] + prev_max_idx = ( + -1 if vis_chunk_idx == 0 else gen_tokens_indices[vis_chunk_idx - 1] - 1 + ) + for idx in range(max_idx, prev_max_idx, -1): + if ( + self.engine.tokenizer.decode([gen_tokens_infos[idx][0]]).decode( + "utf-8" + ) + in _gen_token.text + ): + _gen_token.latency_ms = gen_tokens_infos[idx][1] + _masked_top_k = gen_tokens_infos[idx][2] + + # if we find a match in tokens list generated by the engine, then this token should be marked as generated + _gen_token.is_generated = True + _gen_token.is_force_forwarded = False + + if _masked_top_k is None: + # in free accepting state, no masking + for _token in _gen_token.top_k: + _token.is_masked = False + else: + _masked_tokens = [token.token_id for token in _masked_top_k] + for _token in _gen_token.top_k: + if ( + _token.token_id not in _masked_tokens + and _token.token_id != _gen_token.token_id + ): + _token.is_masked = True + else: + _token.is_masked = False + + break + else: + # input tokens are not masked + for _token in _gen_token.top_k: + _token.is_masked = False + + for _gen_token in _gen_tokens: + if _gen_token.text != "": + processed_gen_tokens.append(_gen_token) + + start_idx = end_idx + 1 + + start_pos = 0 + remainder = "" + + if not self._variables: + return processed_gen_tokens + + def find_start_and_end_positions(chunk: str, start_idx: int, end_idx: int) -> tuple[int, int]: + s = "".join(gen_token.text for gen_token in processed_gen_tokens[start_idx:end_idx+1]) + if chunk not in s: + # chunk is not in the string + return (-1, -1) + + i = start_idx + (end_idx - start_idx) // 2 + traversed = [] + while True: + if i in traversed: + break + + s = "".join(gen_token.text for gen_token in processed_gen_tokens[i:end_idx+1]) + traversed.append(i) + + if chunk in s: + start_idx = i + # shift the start position to the right + i += (end_idx - i) // 2 + else: + # shift the start position to the left + i -= (i - start_idx) // 2 + + j = end_idx + traversed = [] + while True: + if j in traversed: + break + + s = "".join(gen_token.text for gen_token in processed_gen_tokens[start_idx:j+1]) + traversed.append(j) + + if chunk in s: + end_idx = j + # shift the end position to the left + j -= (j - start_idx) // 2 + else: + # shift the end position to the right + j += (end_idx - j) // 2 + + return (start_idx, end_idx) + + if self.engine.compute_log_probs: + for k in self._variables: + try: + chunk = self._variables[k] + chunk_start_pos = self._variables_positions[k] + # find the start of this capture in case we have multiple similar captures + _, start_idx = find_start_and_end_positions(self._state[:chunk_start_pos+1], 0, len(processed_gen_tokens)-1) + start_idx, end_idx = find_start_and_end_positions(chunk, start_idx, len(processed_gen_tokens)-1) + if start_idx == -1: + continue + + self._variables_log_probs[k] = [ + { + "token": token.text, + "token_id": token.token_id, + "logprob": np.log(token.prob).item() + } + for token in processed_gen_tokens[start_idx:end_idx+1] + ] + except: + pass + + return processed_gen_tokens + class ModelStream: def __init__(self, model, grammar=None, timeout=5): @@ -907,10 +1949,7 @@ def get_role_start(self, role_name, **kwargs): This kwargs are added to the role start as arguments. """ return ( - "<|im_start|>" - + role_name - + "".join([f' {k}="{v}"' for k, v in kwargs.items()]) - + "\n" + "<|im_start|>" + role_name + "".join([f' {k}="{v}"' for k, v in kwargs.items()]) + "\n" ) def get_role_end(self, role_name=None): @@ -951,21 +1990,206 @@ def grammar_only(): return GrammarOnly() -class ThrottleRefresh: - def __enter__(self): - Model._throttle_refresh += 1 - - def __exit__(self, exc_type, exc_value, traceback): - Model._throttle_refresh -= 1 - - -def throttle_refresh(): - """Returns a context manager that allows the print statement to drop display calls above the throttle rate.""" - return ThrottleRefresh() - - class ConstraintException(Exception): def __init__(self, *args, **kwargs): self.prompt = kwargs.pop("prompt", None) self.data = kwargs.pop("data", None) super().__init__(*args, **kwargs) + + +class MonitoringMetric(str, Enum): + CPU_USAGE = "cpu_usage" + MEM_USAGE = "mem_usage" + GPU_USAGE = "gpu_usage" + GPU_USED_MEM = "gpu_used_mem" + GPU_TOTAL_MEM = "gpu_total_mem" + INPUT_TOKENS = "input_tokens" + OUTPUT_TOKENS = "output_tokens" + BACKTRACK_TOKENS = "backtrack_tokens" + TOKEN_COUNT = "token_count" + TOKEN_REDUCTION = "token_reduction" + AVG_LATENCY = "avg_latency" + + +ALL_METRICS = [ + MonitoringMetric.CPU_USAGE, + MonitoringMetric.MEM_USAGE, + MonitoringMetric.GPU_USAGE, + MonitoringMetric.GPU_USED_MEM, + MonitoringMetric.GPU_TOTAL_MEM, + MonitoringMetric.INPUT_TOKENS, + MonitoringMetric.OUTPUT_TOKENS, + MonitoringMetric.BACKTRACK_TOKENS, + MonitoringMetric.TOKEN_COUNT, + MonitoringMetric.TOKEN_REDUCTION, + MonitoringMetric.AVG_LATENCY, +] + + +def _monitor_fn( + stop_flag, + metrics_dict: dict[MonitoringMetric, list], + max_size: int = 100, + interval_ms: float = 1000, +): + # print("Monitoring started") + + to_collect_gpu_stats = False + has_gpustat = False + try: + import gpustat + + has_gpustat = True + except: + logger.warning("gpustat is not installed, run `pip install gpustat` to collect GPU stats.") + + if has_gpustat: + try: + gpu_stats = gpustat.GPUStatCollection.new_query() + if len(gpu_stats) > 0: + # only collect GPU stats if there is at least one GPU + to_collect_gpu_stats = True + except: + logger.warning("Non-Nvidia GPU monitoring is not supported in this version.") + + try: + while not stop_flag.value: + t0 = time.time() + + # cpu_percent = psutil.cpu_percent(interval=1) + cpu_percent = psutil.cpu_percent() + memory_usage = psutil.virtual_memory() + + metrics_dict[MonitoringMetric.CPU_USAGE].append(cpu_percent) + metrics_dict[MonitoringMetric.MEM_USAGE].append(memory_usage.percent) + + if to_collect_gpu_stats: + gpu_stats = gpustat.GPUStatCollection.new_query() + + usage = [gpu.utilization for gpu in gpu_stats.gpus] + mem_usage = [gpu.memory_used for gpu in gpu_stats.gpus] + mem_total = [gpu.memory_total for gpu in gpu_stats.gpus] + + metrics_dict[MonitoringMetric.GPU_USAGE].append(usage) + metrics_dict[MonitoringMetric.GPU_USED_MEM].append(mem_usage) + metrics_dict[MonitoringMetric.GPU_TOTAL_MEM].append(mem_total) + + for metrics in metrics_dict.values(): + if len(metrics) > max_size: + metrics.pop(0) + + lat = time.time() - t0 + + # sleep for the remaining time of the interval + sleep_time = interval_ms / 1000.0 - lat + if sleep_time < 0: + time.sleep(sleep_time) + except Exception as e: + # print(f"Error in monitoring: {e}") + pass + + # print("Monitoring stopped") + + +class Monitor: + """Monitoring service to collect necessary metrics for visualization""" + + def __init__(self, engine_metrics: GuidanceEngineMetrics, **kwargs): + self.engine_metrics = engine_metrics + self.mp_manager = Manager() + + # use list instead of queue for easily accessing each item, e.g., last item + self.max_size = kwargs.get("max_size", 100) + + self.metrics_dict = { + MonitoringMetric.CPU_USAGE: self.mp_manager.list(), + MonitoringMetric.MEM_USAGE: self.mp_manager.list(), + MonitoringMetric.GPU_USAGE: self.mp_manager.list(), + MonitoringMetric.GPU_USED_MEM: self.mp_manager.list(), + MonitoringMetric.GPU_TOTAL_MEM: self.mp_manager.list(), + } + + self.stop_flag = self.mp_manager.Value("b", False) + self.process = None + + self.per_token_metrics = [] # store metrics per token in token list + + def start(self): + self.process = Process( + target=_monitor_fn, args=(self.stop_flag, self.metrics_dict, self.max_size) + ) + self.process.start() + logger.debug("Monitor:start") + + def stop(self): + if self.process: + self.stop_flag.value = True + self.process.terminate() + + for metrics in self.metrics_dict.values(): + metrics[:] = [] # NOTE(nopdive): ListProxy does not have .clear method. + logger.debug("Monitor:stop") + + def reset(self): + self.stop() + + for metrics in self.metrics_dict.values(): + metrics.clear() + + self.start() + logger.debug("Monitor:reset") + + def get_metrics( + self, metrics=None, lm: Union[Model, None] = None + ) -> dict[MonitoringMetric, Any]: + if metrics is None: + metrics = ALL_METRICS + result = {} + + for metric in metrics: + if metric in [ + MonitoringMetric.CPU_USAGE, + MonitoringMetric.MEM_USAGE, + MonitoringMetric.GPU_USAGE, + MonitoringMetric.GPU_USED_MEM, + MonitoringMetric.GPU_TOTAL_MEM, + ]: + result[metric] = ( + self.metrics_dict[metric][-1] if len(self.metrics_dict[metric]) > 0 else None + ) + elif metric == MonitoringMetric.INPUT_TOKENS: + result[metric] = self.engine_metrics.engine_input_tokens + elif metric == MonitoringMetric.OUTPUT_TOKENS: + result[metric] = self.engine_metrics.engine_output_tokens + elif metric == MonitoringMetric.BACKTRACK_TOKENS: + result[metric] = self.engine_metrics.engine_backtrack_tokens + elif metric == MonitoringMetric.TOKEN_COUNT: + result[metric] = lm.token_count if lm is not None else None + elif metric == MonitoringMetric.TOKEN_REDUCTION: + if lm is not None and lm.token_count > 0: + result[metric] = 1 - min(1, (lm.metrics.engine_output_tokens / lm.token_count)) + else: + result[metric] = None + elif metric == MonitoringMetric.AVG_LATENCY: + if lm is None: + result[metric] = None + else: + lats = [] + model = lm + while model._parent is not None: + if model.vis_chunk: + for token in model.vis_chunk.generated_tokens: + lats.append(token.latency_ms) + for token in model.vis_chunk.force_forwarded_tokens: + lats.append(token.latency_ms) + model = model._parent + + if len(lats) == 0: + result[metric] = None + else: + result[metric] = np.mean(lats) + + return result + + def get_metric(self, metric: MonitoringMetric, lm: Union[Model, None] = None) -> Any: + return self.get_metrics([metric], lm)[metric] diff --git a/guidance/models/_remote.py b/guidance/models/_remote.py index 86db8fcc5..973e8e7b6 100644 --- a/guidance/models/_remote.py +++ b/guidance/models/_remote.py @@ -29,7 +29,7 @@ def __init__(self, server_url, api_key, tokenizer=None, verify=None): # build the Engine super().__init__(tokenizer=tokenizer, compute_log_probs=False) - def __call__(self, parser, grammar, ensure_bos_token=True): + def __call__(self, parser, grammar, ensure_bos_token=True, echo: bool = False): # Prepare the request data data = { "parser": parser, diff --git a/guidance/models/llama_cpp/_llama_cpp.py b/guidance/models/llama_cpp/_llama_cpp.py index 3e0b7aa85..d243360f8 100644 --- a/guidance/models/llama_cpp/_llama_cpp.py +++ b/guidance/models/llama_cpp/_llama_cpp.py @@ -11,10 +11,12 @@ import numpy as np +from guidance._schema import GenToken, GenTokenExtra + from .._model import Engine, Model, Chat from .._remote import RemoteEngine from .._tokenizer import Tokenizer -from ..._utils import normalize_notebook_stdout_stderr +from ..._utils import normalize_notebook_stdout_stderr, softmax try: import llama_cpp @@ -100,7 +102,14 @@ def encode(self, byte_string: bytes) -> list[int]: class LlamaCppEngine(Engine): """The core class that runs inference using llama.cpp.""" - def __init__(self, model, compute_log_probs, chat_template=None, enable_backtrack=True, enable_ff_tokens=True, **kwargs): + def __init__(self, + model, + compute_log_probs, + chat_template=None, + enable_backtrack=True, + enable_ff_tokens=True, + enable_monitoring=True, + **kwargs): if not is_llama_cpp: raise Exception( "Please install llama-cpp-python with `pip install llama-cpp-python` in order to use guidance.models.LlamaCpp!" @@ -151,6 +160,8 @@ def __init__(self, model, compute_log_probs, chat_template=None, enable_backtrac compute_log_probs=compute_log_probs, enable_backtrack=enable_backtrack, enable_ff_tokens=enable_ff_tokens, + enable_monitoring=enable_monitoring, + **kwargs, ) self._n_vocab = len(self.tokenizer.tokens) @@ -219,6 +230,112 @@ def get_logits(self, token_ids): return logits + def get_per_token_topk_probs(self, token_ids: list[int], top_k: int = 5) -> list[GenTokenExtra]: + if len(token_ids) == 0: + return [] + + # clear kv-cache + llama_cpp.llama_kv_cache_seq_rm(self.model_obj.ctx, -1, 0, -1) + + # create new context + context = self._context + n_batch = self.model_obj.n_batch + batch = context.batch + + logits_batch = [] + for i in range(0, len(token_ids), n_batch): + n_tokens = min(i + n_batch, len(token_ids)) - i + batch.n_tokens = n_tokens + + for j in range(n_tokens): + batch.token[j] = token_ids[i + j] + batch.pos[j] = i + j + batch.seq_id[j][0] = 0 + batch.n_seq_id[j] = 1 + batch.logits[j] = True + + ret = llama_cpp.llama_decode(self.model_obj.ctx, batch) + if ret != 0: + raise Exception(f"Call to llama_cpp.llama_decode returned {ret}.") + + # get all the logits + if llama_cpp.__version__ < "0.2.58": + logits = llama_cpp.llama_get_logits(self.model_obj.ctx) + logits = logits.reshape((-1, self._n_vocab)) + logits_batch.extend(logits) + else: + for j in range(n_tokens): + logits = llama_cpp.llama_get_logits_ith(self.model_obj.ctx, j) + logits = np.ctypeslib.as_array(logits, shape=(self._n_vocab,)).copy() + logits_batch.append(logits) + + # process each token's logits + text_sequence = [] + + # add 1st token + _bytes = self.tokenizer.decode([token_ids[0]]) + try: + _text = _bytes.decode("utf-8") + except Exception as e: + _text = str(_bytes) + print(f"Failed to decode token: {token_ids[0]}, error: {e}, _bytes: {str(_bytes)}") + text_sequence.append( + GenTokenExtra( + token_id=token_ids[0], + prob=1.0, + text=_text, + top_k=[GenToken(token_id=token_ids[0], prob=1.0, text=_text)], + ) + ) + + for token_id, logits in zip(token_ids[1:], logits_batch[:-1]): + _probs = softmax(logits) + + # get the top k indices + top_k_ids, top_k_probs = self._get_top_k(_probs.copy(), top_k, ascending=False) + if token_id not in top_k_ids: + top_k_ids = np.append(top_k_ids, token_id) + top_k_probs = np.append(top_k_probs, _probs[token_id]) + + top_k_list = [] + for _token_id, _prob in zip(top_k_ids, top_k_probs): + _text = "" + try: + _text = self.tokenizer.decode([_token_id]).decode("utf-8") + except Exception as e: + _bytes = self.tokenizer.decode([_token_id]) + _text = str(_bytes) + print( + f"Failed to decode token: {_token_id}, error: {e}, _bytes: {str(_bytes)}" + ) + top_k_list.append(GenToken(token_id=_token_id, prob=_prob, text=_text)) + + text_sequence.append( + GenTokenExtra( + token_id=token_id, + prob=_probs[token_id], + text=self.tokenizer.decode([token_id]).decode("utf-8"), + top_k=top_k_list, + ) + ) + + return text_sequence + + def _get_top_k(self, probs: np.ndarray, k: int, axis: int = None, ascending: bool = True): + if not ascending: + probs *= -1 + ind = np.argpartition(probs, k, axis=axis) + ind = np.take(ind, np.arange(k), axis=axis) # k non-sorted indices + probs = np.take_along_axis(probs, ind, axis=axis) # k non-sorted values + + # sort within k elements + ind_part = np.argsort(probs, axis=axis) + ind = np.take_along_axis(ind, ind_part, axis=axis) + if not ascending: + probs *= -1 + val = np.take_along_axis(probs, ind_part, axis=axis) + return ind, val + class LlamaCpp(Model): def __init__( @@ -230,6 +347,7 @@ def __init__( chat_template=None, enable_backtrack=True, enable_ff_tokens=True, + enable_monitoring=True, **llama_cpp_kwargs, ): """Build a new LlamaCpp model object that represents a model in a given state.""" @@ -243,6 +361,7 @@ def __init__( chat_template=chat_template, enable_backtrack=enable_backtrack, enable_ff_tokens=enable_ff_tokens, + enable_monitoring=enable_monitoring, **llama_cpp_kwargs, ) diff --git a/guidance/models/transformers/_transformers.py b/guidance/models/transformers/_transformers.py index 3afd0be70..19b73a038 100644 --- a/guidance/models/transformers/_transformers.py +++ b/guidance/models/transformers/_transformers.py @@ -5,6 +5,8 @@ from typing import Sequence, Union +from guidance._schema import GenToken, GenTokenExtra + try: import torch except ModuleNotFoundError: @@ -35,12 +37,15 @@ "trust_remote_code", ] + class ByteDecoderError(Exception): pass + class ByteTokensError(Exception): pass + class TransformersTokenizer(Tokenizer): def __init__( self, @@ -104,10 +109,14 @@ def _tokenizer(self, model: str, **kwargs) -> tuple[ raise except ByteTokensError as e: # Give a specific warning for ByteTokensError and fall back to fast tokenizer - warnings.warn(f"Falling back to fast tokenizer. Could not build byte tokens for model {model!r} due to exception {e.__class__.__name__}: {e}") + warnings.warn( + f"Falling back to fast tokenizer. Could not build byte tokens for model {model!r} due to exception {e.__class__.__name__}: {e}" + ) except Exception as e: # Fall back for other exceptions - warnings.warn(f"Falling back to fast tokenizer. Could not load tokenizer for model {model!r} due to exception {e.__class__.__name__}: {e}") + warnings.warn( + f"Falling back to fast tokenizer. Could not load tokenizer for model {model!r} due to exception {e.__class__.__name__}: {e}" + ) else: return tokenizer, byte_tokens @@ -139,7 +148,9 @@ def _byte_tokens( ) pass else: - return self._byte_tokens_from_byte_decoder(transformers_tokenizer.byte_decoder, transformers_tokenizer) + return self._byte_tokens_from_byte_decoder( + transformers_tokenizer.byte_decoder, transformers_tokenizer + ) if hasattr(transformers_tokenizer, "sp_model"): return self._byte_tokens_from_sp_model(transformers_tokenizer) @@ -154,9 +165,7 @@ def _byte_tokens( fallback_byte_decoder = self._fallback_byte_decoder() try: - self._check_byte_decoder( - fallback_byte_decoder, transformers_tokenizer - ) + self._check_byte_decoder(fallback_byte_decoder, transformers_tokenizer) except ByteDecoderError as e: # Should be the only exception that is raised in _byte_tokens raise ByteTokensError( @@ -230,7 +239,9 @@ def _byte_tokens_by_encoding_token_strings( token_str = transformers_tokenizer.convert_tokens_to_string([token]) encoded_str = transformers_tokenizer.encode(token_str) if len(encoded_str) != 1: - raise ValueError(f"Round-trip encoding of tokens [{token}] failed! Got {encoded_str}") + raise ValueError( + f"Round-trip encoding of tokens [{token}] failed! Got {encoded_str}" + ) roundtrip_id = encoded_str[0] if roundtrip_id == i: byte_coded = token_str.encode() @@ -246,7 +257,7 @@ def _byte_tokens_by_encoding_token_strings( def _fallback_byte_decoder(self) -> dict[str, int]: byte_decoder = transformers_package.AutoTokenizer.from_pretrained( "gpt2", use_fast=False - ).byte_decoder # fall back to gpt2 mapping + ).byte_decoder # fall back to gpt2 mapping # some special tokens may not have their whitespace encoded... byte_decoder[" "] = 32 @@ -293,8 +304,10 @@ def check_byte_decoder_complex_round_trip() -> None: # if it's at the start of the reconstructed bytes # Some tokenizers add this automatically as part of the call function, so # we need to remove it to compare - if hasattr(transformers_tokenizer, "bos_token") and transformers_tokenizer.bos_token and reconstructed.startswith( - transformers_tokenizer.bos_token.encode() + if ( + hasattr(transformers_tokenizer, "bos_token") + and transformers_tokenizer.bos_token + and reconstructed.startswith(transformers_tokenizer.bos_token.encode()) ): reconstructed = reconstructed[len(transformers_tokenizer.bos_token) :] # TODO: can we narrow this exception? @@ -371,7 +384,15 @@ def recode(self, tokens: Sequence[int]) -> list[int]: class TransformersEngine(Engine): - def __init__(self, model, tokenizer, compute_log_probs: bool, chat_template=None, enable_backtrack=True, enable_ff_tokens=True, **kwargs): + def __init__(self, + model, + tokenizer, + compute_log_probs: bool, + chat_template=None, + enable_backtrack=True, + enable_ff_tokens=True, + enable_monitoring=True, + **kwargs): # fill in default model value if model is None: model = os.environ.get("TRANSFORMERS_MODEL", None) @@ -414,7 +435,9 @@ def __init__(self, model, tokenizer, compute_log_probs: bool, chat_template=None my_tokenizer, compute_log_probs=compute_log_probs, enable_backtrack=enable_backtrack, - enable_ff_tokens=enable_ff_tokens + enable_ff_tokens=enable_ff_tokens, + enable_monitoring=enable_monitoring, + **kwargs, ) def _model(self, model, **kwargs): @@ -517,6 +540,62 @@ def get_logits(self, token_ids): return self._cached_logits + def get_per_token_topk_probs(self, token_ids: list[int], top_k: int = 5) -> list[GenTokenExtra]: + tokenizer = self.tokenizer._orig_tokenizer + + # NOTE (loc) - assume batch size of 1 + input_ids = torch.tensor(token_ids).unsqueeze(0).long().to(self.device) + + outputs = self.model_obj(input_ids) + probs = torch.softmax(outputs.logits, dim=-1).detach() + + # append "1" to probs to account for the 1st token in the input_ids + probs = torch.cat([torch.ones_like(probs[:, :1, :]), probs], dim=1) + + # collect the probability of the generated token + probs = probs[:, :-1, :] + + batch = [] + for input_sentence, input_probs in zip(input_ids, probs): + text_sequence = [] + + for _token_id, _probs in zip(input_sentence, input_probs): + _token = tokenizer.decode(_token_id) + + if len(text_sequence) == 0: + token = GenTokenExtra( + token_id=_token_id.item(), + prob=1.0, + text=tokenizer.decode([_token_id]), + top_k=[ + GenToken(token_id=_token_id.item(), prob=1.0, text=_token), + ], + ) + text_sequence.append(token) + continue + + # get the top k indices + top_k_indices = torch.topk(_probs, top_k).indices.tolist() + if _token_id not in top_k_indices: + top_k_indices.append(_token_id.item()) + + top_k_probs = [_probs[i].item() for i in top_k_indices] + top_k_list = [] + for t, p in zip(top_k_indices, top_k_probs): + top_k_list.append(GenToken(token_id=t, prob=p, text=tokenizer.decode([t]))) + + token = GenTokenExtra( + token_id=_token_id.item(), + prob=_probs[_token_id].item(), + text=_token, + top_k=top_k_list, + ) + text_sequence.append(token) + + batch.append(text_sequence) + + return batch[0] + class Transformers(Model): def __init__( @@ -528,6 +607,7 @@ def __init__( chat_template=None, enable_backtrack=True, enable_ff_tokens=True, + enable_monitoring=True, **kwargs, ): """Build a new Transformers model object that represents a model in a given state.""" @@ -539,6 +619,7 @@ def __init__( chat_template=chat_template, enable_backtrack=enable_backtrack, enable_ff_tokens=enable_ff_tokens, + enable_monitoring=enable_monitoring, **kwargs, ), echo=echo, diff --git a/guidance/resources/graphpaper-inline.html b/guidance/resources/graphpaper-inline.html new file mode 100644 index 000000000..4d108f32c --- /dev/null +++ b/guidance/resources/graphpaper-inline.html @@ -0,0 +1,16 @@ + + + + + + + + + + + + + diff --git a/guidance/trace/__init__.py b/guidance/trace/__init__.py new file mode 100644 index 000000000..f70829da7 --- /dev/null +++ b/guidance/trace/__init__.py @@ -0,0 +1,11 @@ +"""Trace tree of inputs & outputs generated from a guidance program. + +The first implementation aims for simplicity. +Once benchmark figures are out, we'll figure out what to optimize. + +The most critical class is the trace handler. See its documentation for trace design & motivations. +""" + +from ._trace import NodeAttr, InputAttr, OutputAttr, StatefulGuidanceInput, StatelessGuidanceInput +from ._trace import LiteralInput, EmbeddedInput, ImageInput, RoleCloserInput, RoleOpenerInput +from ._trace import TextOutput, ImageOutput, CaptureOutput, TraceNode, TraceHandler diff --git a/guidance/trace/_trace.py b/guidance/trace/_trace.py new file mode 100644 index 000000000..3bfea4bd0 --- /dev/null +++ b/guidance/trace/_trace.py @@ -0,0 +1,339 @@ +# TODO(nopdive): Consider integrating token operations into trace nodes (handles token healing cleaner). +# TODO(nopdive): Benchmark (expected heap fragmentation issue). Likely need memory pooling (via rust/ctypes/Cython). +# TODO(nopdive): Integrate images when PR for multimodal is in. +import weakref +from itertools import count +from typing import Any, Optional, Generator, Dict +import logging +from pydantic import BaseModel, Field +from guidance._schema import GenToken +from .._utils import pydantic_no_default_repr, pydantic_no_default_str, log_cleanup + +logger = logging.getLogger(__name__) + + +class NodeAttr(BaseModel): + """Attributes of a trace node.""" + + class_name: str = "" + + def __init__(self, **kwargs): + kwargs["class_name"] = self.__class__.__name__ + super().__init__(**kwargs) + + def __repr__(self): + return pydantic_no_default_repr(self) + + def __str__(self): + return pydantic_no_default_str(self) + + +class InputAttr(NodeAttr): + """Input for a guidance program (i.e. literal or guidance grammar).""" + + pass + + +class OutputAttr(NodeAttr): + """Output for a guidance program (i.e. text output).""" + + pass + + +class StatelessGuidanceInput(InputAttr): + """Stateless guidance input (light wrapper).""" + + # NOTE(nopdive): Open to debate what we should serialize here, excluding for now. + value: Any = Field(exclude=True) + + def __repr__(self): + return f"{self.__class__.__name__}({self.value})" + + +class StatefulGuidanceInput(InputAttr): + """Stateful guidance input (light wrapper).""" + + # NOTE(nopdive): Open to debate what we should serialize here, excluding for now. + value: Any = Field(exclude=True) + + def __repr__(self): + return f"{self.__class__.__name__}({self.value})" + + +class LiteralInput(InputAttr): + """Text string as a literal.""" + + value: str + + +# NOTE(nopdive): Placeholder, needs to be filled once multimodal PR is in. +class ImageInput(InputAttr): + """Image input.""" + + value: bytes + + +class EmbeddedInput(InputAttr): + """Text string with embedded guidance input.""" + + value: str + + +class RoleOpenerInput(InputAttr): + """Appears when a role is opened (i.e. user / system). + + This usually occurs as a role context and __enter__ is called. + """ + + name: Optional[str] = None + text: Optional[str] = None + closer_text: Optional[str] = None + + +class RoleCloserInput(InputAttr): + """Appears when a role is closed (i.e. user / system). + + This usually occurs as a role context and __exit__ is called. + """ + + name: Optional[str] = None + text: Optional[str] = None + + +class TextOutput(OutputAttr): + """Text string.""" + + value: str + is_input: bool = False + is_generated: bool = False + is_force_forwarded: bool = False + token_count: int = 0 + prob: float = 0.0 + tokens: list[GenToken] = Field( + exclude=True, default_factory=list + ) # use to store tokens associated with output + + def __str__(self): + return self.value + + +# NOTE(nopdive): Placeholder, needs to be filled once multimodal PR is in. +class ImageOutput(OutputAttr): + """Image as bytes.""" + + value: bytes + + +class CaptureOutput(OutputAttr): + """Capture variable output as a string. + + If `value` is set to None, this means it's a reset (needed for append capture group outputs). + """ + + name: str + value: Optional[str] = None + is_append: bool = False + log_probs: float = 0.0 + + def __str__(self): + return f"{self.name}{'+=' if self.is_append else '='}{self.value.__str__()}" + + +class WeakRefList(list): + """Weak reference list implementation that uses weakref ref objects. + + This does not override all methods for list. + """ + + def append(self, item): + super().append(weakref.ref(item)) + + def __getitem__(self, index): + ref = super().__getitem__(index) + obj = ref() + if obj is None: + raise ReferenceError("The referenced object has been garbage collected") + return obj + + def __iter__(self): + return (ref() for ref in super().__iter__() if ref() is not None) + + def remove(self, item): + ref_to_remove = None + for ref in super().__iter__(): + obj = ref() + if obj is item: + ref_to_remove = ref + break + if ref_to_remove: + super().remove(ref_to_remove) + + +def _cleanup(log_msg: str): + log_cleanup(log_msg) + + +class TraceNode(BaseModel): + """Trace node which associates inputs and outputs of a guidance program.""" + + identifier: int = Field(default_factory=count().__next__) + parent: Optional["TraceNode"] = None + children: list["TraceNode"] = Field(default_factory=WeakRefList) + input: Optional[InputAttr] = None + output: Optional[OutputAttr] = None + + def __init__(self, **kwargs): + super().__init__(**kwargs) + weakref.finalize(self, _cleanup, f"trace({id(self)}):{self.identifier}") + + def add_child(self, child: "TraceNode") -> None: + """Add a child node to the trace node. + + Args: + child: The child node to add. + """ + child.parent = self + self.children.append(child) + + def remove_child(self, child: "TraceNode") -> None: + """Remove a child node from the trace node. + + Args: + child: The child node to remove. + """ + child.parent = None + self.children.remove(child) + + def ancestors(self) -> Generator["TraceNode", None, None]: + """Yields ancestor trace nodes ending with root. + + Yields: + Ancestor trace nodes. + """ + node = self + while node.parent is not None: + yield node.parent + node = node.parent + + def path(self) -> Generator["TraceNode", None, None]: + """Yields path of from root to self inclusively. + + Yields: + Trace nodes from root to self. + """ + yield from reversed(list(self.ancestors())) + yield self + + def root(self) -> "TraceNode": + """Returns root by traversing parents of self. + + Returns: + Root of tree self is part of. + """ + if self.parent is None: + root = self + else: + *_, root = self.ancestors() + return root + + def traverse(self, bfs: bool = True): + """Traverse the trace nodes starting with self. + + Args: + bfs: Use breadth-first-search, otherwise depth-first-search. + + Yields: + Trace nodes in traversal order. + """ + queue = [self] + while queue: + node = queue.pop(0) + yield node + + if bfs: + queue.extend(node.children) + else: + # NOTE(nopdive): Analogous to extend but at front of list. + queue[0:0] = node.children + + def __repr__(self): + return f"{self.identifier}:{self.input!r}:{self.output!r}" + + def __hash__(self): + return hash(self.identifier) + + +class TraceHandler(BaseModel): + """Trace handler that will own a tree of trace nodes. + + This will primarily be owned by a model's engine. + Each guidance model corresponds to one trace node. + All guidance models emitted from an engine is to be included as their own paths within the tree. + + The requirement for holding all live traces ensures downstream consumers such as UI providers + can do near-real-time partial updates. + """ + + # NOTE(nopdive): Type trickery for pydantic. + id_node_map: Dict[int, TraceNode] = weakref.WeakValueDictionary() # type: ignore + node_id_map: Dict[TraceNode, int] = weakref.WeakKeyDictionary() # type: ignore + + def __init__(self, **kwargs): + super().__init__(**kwargs) + weakref.finalize(self, _cleanup, f"tracehandler({id(self)})") + + def __getitem__(self, item): + return self.id_node_map[item] + + def update_node( + self, identifier: int, parent_id: Optional[int], node_attr: Optional[NodeAttr] = None + ) -> TraceNode: + """Update the trace node with the given identifier. + + If the trace node does not exist, it will be created. + Both parent id and node attributes can be updated only once until further notice. + + Args: + identifier: User-defined identifier for the trace node. + parent_id: User-defined parent identifier for the trace node. + node_attr: Input or output node attribute to be updated on the trace node. + """ + node = self.id_node_map.get(identifier, None) + if node is None: + node = TraceNode() + + self.id_node_map[identifier] = node + self.node_id_map[node] = identifier + + if parent_id is not None: + parent_node = self.id_node_map.get(parent_id, None) + if parent_node is not None: + parent_node.add_child(node) + + if node_attr is not None: + if isinstance(node_attr, InputAttr): + assert node.input is None + node.input = node_attr + elif isinstance(node_attr, OutputAttr): + assert node.output is None + node.output = node_attr + else: + raise ValueError(f"Unexpected node attr: {node_attr}") + return node + + def root(self) -> TraceNode: + """Returns root node of trace handler. + + Raises: + Exception: If root cannot be found. + + Returns: Root trace node. + """ + root = None + for _, node in self.id_node_map.items(): + if node.parent is None: + root = node + break + if root is None: + raise Exception("No root in trace handler.") + return root diff --git a/guidance/visual/__init__.py b/guidance/visual/__init__.py index a286a2509..1cbcbefae 100644 --- a/guidance/visual/__init__.py +++ b/guidance/visual/__init__.py @@ -3,4 +3,9 @@ Users should have few reasons to be accessing this module. """ -from ._environment import Environment \ No newline at end of file +from ._message import GuidanceMessage, TraceMessage, ResetDisplayMessage, ClientReadyMessage, ClientReadyAckMessage +from ._message import ExecutionCompletedMessage, TokensMessage, MetricMessage, OutputRequestMessage +from ._message import ExecutionStartedMessage +from ._renderer import AutoRenderer, LegacyHtmlRenderer, JupyterWidgetRenderer, Renderer, legacy_mode +from ._message import serialize_message, deserialize_message +from ._trace import trace_node_to_str, display_trace_tree, trace_node_to_html \ No newline at end of file diff --git a/guidance/visual/_async.py b/guidance/visual/_async.py new file mode 100644 index 000000000..2ddc69d7a --- /dev/null +++ b/guidance/visual/_async.py @@ -0,0 +1,84 @@ +""" Asynchronous handling for visual components. + +This includes a separate thread dedicated for visualization and messaging. +""" +# NOTE(nopdive): This is run on a single global thread. +# Consider per engine threads later after memory review on engine. + +import asyncio +import threading +from asyncio import AbstractEventLoop, Future, Task +from typing import Tuple, Coroutine + + +def _start_asyncio_loop(loop: AbstractEventLoop): + asyncio.set_event_loop(loop) + loop.run_forever() + + +def _asyncio_background_thread() -> Tuple[threading.Thread, AbstractEventLoop]: + loop = asyncio.new_event_loop() + thread = threading.Thread(target=_start_asyncio_loop, args=(loop,)) + thread.daemon = True + return thread, loop + +def _run_thread_if_needed(): + global _loop + global _thread + + if _loop is None: + _thread, _loop = _asyncio_background_thread() + _thread.start() + return _thread, _loop + + +async def async_task(coroutine: Coroutine) -> Task: + """ Creates an asyncio task from coroutine. + + Args: + coroutine: Coroutine within task. + + Returns: + Asyncio task. + """ + task = asyncio.create_task(coroutine) + return task + + +async def print_all_tasks(): # pragma: no cover + """Prints all tasks running in visual thread loop.""" + for task in asyncio.all_tasks(): + print(task) + + +def async_loop() -> AbstractEventLoop: + """ Returns async loop in visual thread. + + Returns: + Async loop of visual thread. + """ + _, loop = _run_thread_if_needed() + return loop + + +# TODO: Test. +def call_soon_threadsafe(cb, *args, context = None): + loop = async_loop() + return loop.call_soon_threadsafe(cb, *args, context=context) + + +def run_async_coroutine(coroutine: Coroutine) -> Future: + """ Runs an asynchronous coroutine in the visual thread. + + Args: + coroutine: Coroutine to be run on visual thread. + + Returns: + Future of coroutine. + """ + _, loop = _run_thread_if_needed() + future = asyncio.run_coroutine_threadsafe(coroutine, loop) + return future + +_loop = None +_thread = None \ No newline at end of file diff --git a/guidance/visual/_jupyter.py b/guidance/visual/_jupyter.py new file mode 100644 index 000000000..01dc70230 --- /dev/null +++ b/guidance/visual/_jupyter.py @@ -0,0 +1,30 @@ +""" Jupyter specific utilities.""" + + +import weakref +from typing import Callable, Any, Tuple +import logging +try: + from IPython import get_ipython +except ImportError: + pass + +logger = logging.getLogger(__name__) + +IPythonCallback = Callable[[Any], None] + +# TODO(nopdive): Connect cell handling again to renderer. + + +def ipy_handle_event_once(cb: IPythonCallback, event_name: str) -> IPythonCallback: + ipy = get_ipython() + + if ipy is None: + return None + + def cb_closure(msg): + cb(info=msg) + ipy.events.unregister(event_name, cb_closure) + ipy.events.register(event_name, cb_closure) + + return cb_closure \ No newline at end of file diff --git a/guidance/visual/_message.py b/guidance/visual/_message.py new file mode 100644 index 000000000..8c0298239 --- /dev/null +++ b/guidance/visual/_message.py @@ -0,0 +1,129 @@ +"""Messages that used between server (usually Jupyter Python kernel) and client. + +Messages are required to be added to the model registry for serialization. +""" +from typing import Optional, Dict, Union + +from pydantic import BaseModel, Field + +from guidance._schema import GenTokenExtra +from ..trace import NodeAttr +import json + + +_msg_counter: int = -1 +class GuidanceMessage(BaseModel): + """Message sent within Guidance layer.""" + + message_id: int = Field(default=None) + class_name: str = "" + + def __init__(self, **kwargs): + global _msg_counter + + kwargs["class_name"] = self.__class__.__name__ + if kwargs.get("message_id") is None: + _msg_counter += 1 + kwargs["message_id"] = _msg_counter + super().__init__(**kwargs) + + +class TraceMessage(GuidanceMessage): + """Update on a trace node.""" + trace_id: int + parent_trace_id: Optional[int] = None + node_attr: Optional[NodeAttr] = None + + +class MetricMessage(GuidanceMessage): + """Metric that has been emitted.""" + name: str + value: Union[float, str, list[float], list[str]] = Field(union_mode='left_to_right') + scalar: bool = True + + +class ExecutionStartedMessage(GuidanceMessage): + """Fired when renderer has started trace messages.""" + + +class ExecutionCompletedMessage(GuidanceMessage): + """Fired when renderer has completed trace messages. + + This functions as the last message sent to client. + """ + last_trace_id: Optional[int] = None + is_err: bool = False + + +class TokensMessage(GuidanceMessage): + """Fired when trace messages are completed, with tokens for client.""" + trace_id: int + text: str + tokens: list[GenTokenExtra] + + def __str__(self): + return f"message_id={self.message_id} class_name={self.class_name} trace_id={self.trace_id}" + + +class ResetDisplayMessage(GuidanceMessage): + """Instructs client to reset the display, removing all output.""" + pass + + +class ClientReadyMessage(GuidanceMessage): + """Fired when client is ready to receive messages.""" + pass + + +class ClientReadyAckMessage(GuidanceMessage): + """Fired when server acknowledges client readiness.""" + pass + + +class OutputRequestMessage(GuidanceMessage): + """Fired when client requests tokens from server.""" + pass + + +model_registry: Dict[str, type(GuidanceMessage)] = { + 'TraceMessage': TraceMessage, + 'ExecutionStartedMessage': ExecutionStartedMessage, + 'ExecutionCompletedMessage': ExecutionCompletedMessage, + 'ExecutionCompletedOutputMessage': TokensMessage, + 'ResetDisplayMessage': ResetDisplayMessage, + 'ClientReadyMessage': ClientReadyMessage, + 'ClientReadyAckMessage': ClientReadyAckMessage, + 'OutputRequestMessage': OutputRequestMessage, + 'MetricMessage': MetricMessage, + 'TokensMessage': TokensMessage, +} + + +def serialize_message(message: GuidanceMessage) -> str: + """ Serializes guidance message. + + Args: + message: Message to be serialized. + + Returns: + Serialized message in JSON format. + """ + message_json = message.model_dump_json(indent=2, serialize_as_any=True) + return message_json + + +def deserialize_message(data: str) -> GuidanceMessage: + """ Deserializes string into a guidance message. + + Args: + data: JSON string to be deserialized. + + Returns: + Guidance message. + """ + data_json = json.loads(data) + class_name = data_json.get("class_name") + model_class = model_registry.get(class_name) + if not model_class: + raise ValueError(f"Unknown class_name: {class_name}") + return model_class.model_validate_json(data) \ No newline at end of file diff --git a/guidance/visual/_renderer.py b/guidance/visual/_renderer.py new file mode 100644 index 000000000..3dee7ec1a --- /dev/null +++ b/guidance/visual/_renderer.py @@ -0,0 +1,497 @@ +""" Renderer is responsible for displaying output. + +Our main focus is on jupyter notebooks and later terminal. +""" +# TODO(nopdive): Implementation for terminals & append-only text displays. +# NOTE(nopdive): Testing this notebook related components is tricky. Should figure this out at some point. + +import asyncio +import logging +import weakref +from typing import Optional, Callable, Tuple, Any +from asyncio import Queue +from functools import partial + +from . import MetricMessage, TokensMessage +from ._environment import Environment +from ._jupyter import ipy_handle_event_once +from ._message import ExecutionCompletedMessage, \ + deserialize_message, serialize_message, ClientReadyAckMessage, ExecutionStartedMessage +from .._utils import log_cleanup +from ..trace import TraceHandler +from ..visual import GuidanceMessage, TraceMessage, ResetDisplayMessage, ClientReadyMessage +from ._trace import trace_node_to_html +from ._async import run_async_coroutine, async_task, call_soon_threadsafe +from warnings import warn + +try: + from IPython.display import clear_output, display, HTML + from IPython import get_ipython + + ipython_imported = True +except ImportError: + ipython_imported = False + + +try: + import stitch + + stitch_installed = True +except ImportError: + stitch_installed = False + +logger = logging.getLogger(__name__) + + +# NOTE(nopdive): Temporary solution until we iron out all issues with widgets. +_legacy_mode = False # pragma: no cover +def legacy_mode(flag: Optional[bool] = None) -> bool: # pragma: no cover + """ Sets visualizations to legacy mode (how Guidance used to be). + + This method call will likely deprecate when a fresher API for + renderers is defined. + + Args: + flag: True if legacy is wanted. + + Returns: + Whether legacy mode is enabled. + """ + global _legacy_mode + if flag is not None: + _legacy_mode = flag + return _legacy_mode + + +class Renderer: + """Renders guidance model to a visual medium.""" + + def __init__(self): + """Initializes. """ + self._observers = [] + + def notify(self, message: GuidanceMessage): + """ Notifies all observers of the renderer of an incoming message. + + Args: + message: Incoming message. + """ + for observer in self._observers: + observer(message) + + def subscribe(self, callback: Callable[[GuidanceMessage], None]) -> None: + """ Subscribes to incoming messages. + + Args: + callback: Callback to handle incoming messages. + """ + self._observers.append(callback) + + def unsubscribe(self, callback: Callable[[GuidanceMessage], None]) -> None: + """ Unsubscribes from incoming messages. + + Args: + callback: Callback to remove. + """ + self._observers.remove(callback) + + def update(self, message: GuidanceMessage) -> None: + """ Updates renderer with incoming message. + + Args: + message: Incoming message. + """ + raise NotImplementedError("Update not implemented.") + + +def _create_stitch_widget(): + from stitch import StitchWidget + import pkg_resources + + if _create_stitch_widget.src_doc_template is None: + with open( + pkg_resources.resource_filename("guidance", "resources/graphpaper-inline.html"), "r" + ) as f: + _create_stitch_widget.src_doc_template = f.read() + w = StitchWidget() + w.initial_width = "100%" + w.initial_height = "auto" + w.srcdoc = _create_stitch_widget.src_doc_template + weakref.finalize(w, log_cleanup, f"stitch({id(w)})") + + return w + + +_create_stitch_widget.src_doc_template = None + + +def _cleanup(recv_queue: Optional[Queue], send_queue: Optional[Queue], log_msg: str) -> None: + log_cleanup(log_msg) + if recv_queue is not None: + call_soon_threadsafe(send_queue.put_nowait, None) + if send_queue is not None: + call_soon_threadsafe(recv_queue.put_nowait, None) + + +async def _create_queue() -> Queue: + # This will run in the visual thread. + return Queue() + + +def _on_stitch_clientmsg(recv_queue_weakref: weakref.ReferenceType["Queue"], change: dict) -> None: + # NOTE(nopdive): Widget callbacks do not print to stdout/stderr nor module log. + recv_queue = recv_queue_weakref() + if recv_queue is not None: + call_soon_threadsafe(recv_queue.put_nowait, change['new']) + + +def _on_cell_completion(renderer_weakref: weakref.ReferenceType["Renderer"], info) -> None: + logger.debug(f"CELL:executed") + try: + renderer = renderer_weakref() + if renderer is None: + return + + message = ExecutionCompletedMessage( + last_trace_id=renderer._last_trace_id, + is_err=info.error_in_exec is not None, + ) + renderer.update(message) + except Exception as e: + logger.error(repr(e)) + + +async def _handle_recv_messages(renderer_weakref: weakref.ReferenceType["Renderer"], queue_weakref: weakref.ReferenceType["Queue"]) -> None: + logger.debug("RECV:init") + + while True: + try: + queue = queue_weakref() + if queue is None: + break + value = await queue.get() + + # logger.debug(f"RECV:raw:{value}") + + if value is None: + logger.debug("RECV:closing") + break + + message = deserialize_message(value) + # logger.debug(f"RECV:msg:{message}") + + renderer = renderer_weakref() + if renderer is None: + logger.debug("RECV:renderer early clean") + break + + if isinstance(message, ClientReadyMessage): + logger.debug("RECV:clientready") + call_soon_threadsafe(renderer._send_queue.put_nowait, ClientReadyAckMessage()) + + renderer.notify(message) + renderer._recv_queue.task_done() + except Exception as e: + logger.error(f"RECV:err:{repr(e)}") + + +async def _handle_send_messages(renderer_weakref: weakref.ReferenceType["Renderer"], queue_weakref: weakref.ReferenceType["Queue"]) -> None: + logger.debug("SEND:init") + # NOTE(nopdive): Waiting on client cb does not work, client messages received on cell completion. + # Currently, we do a replay of messages on completion for client if client + # first receives non-zero message identifier. + + # What if we only used 1% of our brain? + await asyncio.sleep(200 / 1000.) + logger.debug("SEND:ready") + + while True: + try: + queue = queue_weakref() + if queue is None: + break + message = await queue.get() + # logger.debug(f"SEND:msg:{message}") + + if message is None: + logger.debug("SEND:closing") + break + + message_json = serialize_message(message) + # logger.debug(f"SEND:json:{message_json}") + + renderer = renderer_weakref() + if renderer is None: + break + if renderer._stitch_widget is not None: + renderer._stitch_widget.kernelmsg = message_json + else: + logger.debug(f"SEND:jupyter:send but no widget") + renderer._send_queue.task_done() + except Exception as e: + logger.error(f"SEND:err:{repr(e)}") + + +class JupyterWidgetRenderer(Renderer): + """Jupyter widget renderer that is implemented via stitch package.""" + + def __init__(self, trace_handler: TraceHandler) -> None: + """ Initializes. + + Args: + trace_handler: Trace handler of an engine. + """ + super().__init__() + + self._trace_handler = trace_handler + self._messages: list[GuidanceMessage] = [] + self._completed = False + self._running = False + self._need_reset = False + self._stitch_widget = None + self._stitch_on_clientmsg = None + self._cell_event_handler = None + self._last_trace_id = None + + # Create queue and wait for instantiation + self._send_queue: Queue = run_async_coroutine(_create_queue()).result() + self._recv_queue: Queue = run_async_coroutine(_create_queue()).result() + + # Start send/recv message loops + recv_coroutine = _handle_recv_messages(weakref.ref(self), weakref.ref(self._recv_queue)) + send_coroutine = _handle_send_messages(weakref.ref(self), weakref.ref(self._send_queue)) + self._recv_task = run_async_coroutine(async_task(recv_coroutine)).result() + self._send_task = run_async_coroutine(async_task(send_coroutine)).result() + + weakref.finalize(self, _cleanup, self._recv_queue, self._send_queue, f"renderer({id(self)})") + + + def has_divergence(self, message: GuidanceMessage) -> Tuple[bool, int]: + """Checks if message has divergence with current path. + + Args: + message: Incoming message. + + Returns: + Tuple of (has diverged, shared ancestor index). Index will be -1 if no divergence. + + Raises: + Exception if there is no shared ancestor (including root). This should not happen. + """ + if not isinstance(message, TraceMessage): + return False, -1 + + # If we diverge from the model path, truncate and reset + message_trace_node = self._trace_handler[message.trace_id] + + prev_trace_messages = [x for x in self._messages if isinstance(x, TraceMessage)] + trace_messages_len = len(prev_trace_messages) + if trace_messages_len == 0: + return False, -1 + elif trace_messages_len == 1: + if isinstance(self._messages[0], TraceMessage): + last_trace_node = self._trace_handler[self._messages[0].trace_id] + if message_trace_node.parent == last_trace_node: + return False, -1 + else: + return True, 0 + else: + return False, -1 + else: + last_trace_message = prev_trace_messages[-1] + last_trace_node = self._trace_handler[last_trace_message.trace_id] + + if last_trace_node not in message_trace_node.path(): + logger.debug(f"DIVERGENCE:curr:{message_trace_node}") + logger.debug(f"DIVERGENCE:prev:{last_trace_node}") + + # Truncate path that is no longer used by current trace node + ancestor_idx = -1 + ancestors = set(message_trace_node.ancestors()) + for idx, prev_message in enumerate(self._messages): + if isinstance(prev_message, TraceMessage): + prev_trace_node = self._trace_handler[prev_message.trace_id] + if prev_trace_node in ancestors: + ancestor_idx = idx + + if ancestor_idx == -1: + if message_trace_node.parent == last_trace_node.root(): # pragma: no cover + ancestor_idx = 0 + else: + raise Exception(f"Parent missing for trace node: {message_trace_node}") + + return True, ancestor_idx + else: + return False, -1 + + + def update(self, message: GuidanceMessage) -> None: + out_messages = [] + + if isinstance(message, ExecutionCompletedMessage): + logger.debug("RENDERER:execution end") + self._completed = True + self._running = False + self.notify(message) + + if message.is_err: + out_messages.append(MetricMessage(name="status", value="⚠")) + else: + out_messages.append(MetricMessage(name="status", value="✓")) + + if not self._running and isinstance(message, TraceMessage): + logger.debug("RENDERER:execution start") + started_msg = ExecutionStartedMessage() + out_messages.append(started_msg) + out_messages.append(MetricMessage(name="status", value='⟳')) + + ipy_handle_event_once( + partial(_on_cell_completion, weakref.ref(self)), + 'post_run_cell' + ) + self._need_reset = True + self._running = True + self._completed = False + + # TODO(nopdive): Fire off execution immediately to renderer subscribers. Review later. + call_soon_threadsafe(self._recv_queue.put_nowait, serialize_message(started_msg)) + + # Check if message has diverged from prev messages + diverged, shared_ancestor_idx = self.has_divergence(message) + if diverged: + out_messages.append(ResetDisplayMessage()) + out_messages[len(out_messages):] = self._messages[:shared_ancestor_idx] + self._messages.clear() + + # Reset if needed + if self._need_reset: + logger.debug("RENDERER:reset") + + # Clear messages + self._messages = [] + + if self._stitch_widget is not None: + self._stitch_widget.unobserve(self._stitch_on_clientmsg, names='clientmsg') + + self._stitch_widget = _create_stitch_widget() + self._stitch_on_clientmsg = partial(_on_stitch_clientmsg, weakref.ref(self._recv_queue)) + self._stitch_widget.observe(self._stitch_on_clientmsg, names='clientmsg') + + # Redraw + # clear_output(wait=True) + display(self._stitch_widget) + + self._need_reset = False + + # Append current message to outgoing + out_messages.append(message) + + # Send outgoing messages to client + for out_message in out_messages: + # logger.debug(f"RENDERER:out:{out_message}") + if isinstance(out_message, TraceMessage): + self._last_trace_id = out_message.trace_id + + self._messages.append(out_message) + call_soon_threadsafe(self._send_queue.put_nowait, out_message) + +class DoNothingRenderer(Renderer): + """ It does nothing. Placeholder for future renderers.""" + + def __init__(self, trace_handler: TraceHandler) -> None: + """ Initializes. + + Args: + trace_handler: Trace handler of an engine. + """ + self._trace_handler = trace_handler + super().__init__() + + def update(self, message: GuidanceMessage) -> None: + pass + + +class LegacyHtmlRenderer(JupyterWidgetRenderer): + """Original HTML renderer for guidance.""" + + def __init__(self, trace_handler: TraceHandler) -> None: + """ Initializes. + + Args: + trace_handler: Trace handler of an engine. + """ + + self._trace_handler = trace_handler + super().__init__(trace_handler) + + def update(self, message: GuidanceMessage) -> None: + pass + # # Handle Jupyter cell completion + # self._handle_jupyter_cell_completion() + # + # if isinstance(message, TraceMessage) or isinstance(message, ExecutionCompletedOutputMessage): + # complete_msg = None + # if isinstance(message, ExecutionCompletedOutputMessage): + # complete_msg = message + # + # trace_node = self._trace_handler[message.trace_id] + # self._last_trace_id = message.trace_id + # if trace_node is not None: + # clear_output(wait=True) + # display(HTML(trace_node_to_html(trace_node, prettify_roles=False, complete_msg=complete_msg))) + # elif isinstance(message, ExecutionCompletedMessage): + # logger.debug("RENDERER:cell executed") + # else: + # pass + + +class AutoRenderer(Renderer): + """ Automatically detects which renderer to use based on environment.""" + + def __init__(self, trace_handler: TraceHandler): + """ Initializes. + + Args: + trace_handler: Trace handler of an engine. + """ + self._env = Environment() + + if legacy_mode(): + self._renderer = LegacyHtmlRenderer(trace_handler=trace_handler) + else: + if self._env.is_notebook(): + if stitch_installed: + self._renderer = JupyterWidgetRenderer(trace_handler=trace_handler) + else: + self._renderer = LegacyHtmlRenderer(trace_handler=trace_handler) + elif self._env.is_terminal(): + # TODO(nopdive): When IPython events are figured out (cell completion) + # hook up terminal interface separate to non-interactive + # shell. + self._renderer = DoNothingRenderer(trace_handler=trace_handler) + else: # pragma: no cover + logger.error("Env detection has failed. This is a bug.") + warn("Env detection has failed. No renderer will be provided.") + self._renderer = DoNothingRenderer(trace_handler=trace_handler) + + super().__init__() + + def notify(self, message: GuidanceMessage): + self._renderer.notify(message) + + def subscribe(self, callback: Callable[[GuidanceMessage], None]) -> None: + self._renderer.subscribe(callback) + + def unsubscribe(self, callback: Callable[[GuidanceMessage], None]) -> None: + self._renderer.unsubscribe(callback) + + def update(self, message: GuidanceMessage) -> None: + self._renderer.update(message) + + def renderer_type(self) -> type: + """Type of renderer that has been selected based on environment. + + Returns: + Type of selected renderer. + """ + return type(self._renderer) \ No newline at end of file diff --git a/guidance/visual/_trace.py b/guidance/visual/_trace.py new file mode 100644 index 000000000..24f6f2c62 --- /dev/null +++ b/guidance/visual/_trace.py @@ -0,0 +1,208 @@ +""" Visualization related to trace. """ + +import base64 +import json +from typing import Optional, Dict +from .._schema import GenToken + +from ..visual._message import TokensMessage +from ..trace import ( + TextOutput, + TraceNode, + TraceHandler, + RoleOpenerInput, + RoleCloserInput, + ImageOutput, +) +import html + + +def trace_node_to_html( + node: TraceNode, prettify_roles=False, complete_msg: TokensMessage = None +) -> str: + """Represents trace path as html string. + + Args: + node: Trace node that designates the end of a trace path for HTML output. + prettify_roles: Enables prettier formatting for roles. + complete_msg: Output message received on completion of engine. + + Returns: + HTML string of trace path as html. + """ + buffer = [] + node_path = list(node.path()) + active_role: Optional[TraceNode] = None + + prob_idx = 0 + # remaining_text = "" + full_text = "" + if complete_msg: + for token in complete_msg.tokens: + full_text += token.text + + for i, node in enumerate(node_path): + if isinstance(node.input, RoleOpenerInput): + active_role = node + elif isinstance(node.input, RoleCloserInput): + active_role = node + + if isinstance(node.output, TextOutput): + if active_role is not None: + if isinstance(active_role.input, RoleOpenerInput) and prettify_roles: + role_name = active_role.input.name + fmt = f"
", + ) + buffer.append("") + return "".join(buffer) + + +def trace_node_to_str(node: TraceNode) -> str: + """Visualize output attributes of a trace node up to the root. + + Users should not be accessing this function. For debugging purposes. + + Args: + node: The trace node to visualize. + Returns: + Output as string. + """ + buffer = [] + for node in node.path(): + if isinstance(node.output, TextOutput): + buffer.append(str(node.output)) + return "".join(buffer) + + +def display_trace_tree(trace_handler: TraceHandler) -> None: + """Visualize tree of a trace node going down to all its leaves. + + Users should not normally be accessing this function. For debugging purposes. + + Args: + trace_handler: Trace handler needed to pull user-defined identifiers of trace nodes. + """ + from anytree import Node, RenderTree + + root = trace_handler.root() + trace_viz_map: Dict[TraceNode, Node] = {} + for node in root.traverse(bfs=False): + viz_parent = trace_viz_map.get(node.parent, None) + viz_node = Node(f"{trace_handler.node_id_map[node]}:{node!r}", parent=viz_parent) + trace_viz_map[node] = viz_node + viz_root = trace_viz_map[root] + + for pre, fill, node in RenderTree(viz_root): + tree_str = "%s%s" % (pre, node.name) + print(tree_str) diff --git a/notebooks/unstable/.gitignore b/notebooks/unstable/.gitignore new file mode 100644 index 000000000..c96a04f00 --- /dev/null +++ b/notebooks/unstable/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/notebooks/unstable/State Debugging.ipynb b/notebooks/unstable/State Debugging.ipynb new file mode 100644 index 000000000..7d7df97e7 --- /dev/null +++ b/notebooks/unstable/State Debugging.ipynb @@ -0,0 +1,196 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "d7d1e6967616e177", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-11T22:50:52.915277Z", + "start_time": "2024-10-11T22:50:52.730830Z" + } + }, + "outputs": [], + "source": [ + "import stitch" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1ec02432-a44d-4fdb-b44c-b153529fc03d", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-20T19:58:31.247827Z", + "start_time": "2024-10-20T19:58:24.650343Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/samueljenkins/dev/guidance-dev/venv/lib/python3.9/site-packages/urllib3/__init__.py:35: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "from guidance.models import Transformers\n", + "from guidance import gen, user, system\n", + "\n", + "import logging\n", + "logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s',\n", + " datefmt='%Y-%m-%d %H:%M:%S')\n", + "logging.getLogger().setLevel(logging.DEBUG)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "18b70f42-4b6d-41a4-94be-a41360571901", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ed0ad5ac277c4702b21ff8fdc9494dcf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "StitchWidget(initial_height='auto', initial_width='100%', srcdoc='\\n\\n\\n …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-10-21 00:33:38 - DEBUG - start gen(name=\"suffix\")\n", + "2024-10-21 00:33:38 - DEBUG - finish gen\n", + "2024-10-21 00:33:38 - DEBUG - start Model._run_stateless\n", + "2024-10-21 00:33:38 - DEBUG - SEND:ready\n", + "2024-10-21 00:33:38 - DEBUG - finish Model._run_stateless\n", + "2024-10-21 00:33:38 - DEBUG - CELL:executed:message_id=201 class_name='ExecutionCompletedMessage' last_trace_id=69\n", + "2024-10-21 00:33:38 - DEBUG - ENGINE:message_id=201 class_name='ExecutionCompletedMessage' last_trace_id=69\n", + "2024-10-21 00:33:38 - DEBUG - JUPYTER:changed:8eea1d49-65c5-4f25-a863-5d7000948161|7\n", + "2024-10-21 00:33:38 - DEBUG - ENGINE:final_text:<|im_start|>system\n", + "You are responsible for writing an epic poem.<|im_end|>\n", + "<|im_start|>user\n", + "Roses are red and white and blue and red and\n", + "2024-10-21 00:33:38 - DEBUG - RENDER:execution completed out\n", + "2024-10-21 00:33:38 - DEBUG - RENDER:execution completed\n", + "2024-10-21 00:33:38 - DEBUG - RECV:clientready\n", + "2024-10-21 00:33:38 - DEBUG - ENGINE:message_id=208 class_name='ClientReadyMessage'\n", + "2024-10-21 00:33:38 - DEBUG - JUPYTER:changed:b5537f3f-cafc-4815-9da1-413e814172bd|7\n" + ] + } + ], + "source": [ + "m0 = Transformers(\"gpt2\")\n", + "# m0 = Transformers(\"microsoft/Phi-3-mini-4k-instruct\")\n", + "# m1 = m0 + \"Alms for the \" + gen(name=\"suffix\", max_tokens=5, stop='\\n')\n", + "\n", + "with system():\n", + " # m1 = m0 + \"You are responsible for autocompleting a sentence.\"\n", + " m1 = m0 + \"You are responsible for writing an epic poem.\"\n", + "with user():\n", + " m2 = m1 + \"Roses are red and \" + gen(name=\"suffix\", regex=r'[\\w\\s]{20,30}', max_tokens=30)\n", + " # m2 = m1 + \"Roses are red and \" + gen(name=\"suffix\", regex=r'[\\w\\s]+{100}', max_tokens=500)\n", + " # m2 = m1 + \"Once upon a time\" + gen(name=\"end\", max_tokens=500)\n", + "# m3 = m2 + \">:(\"\n", + "\n", + "# with user():\n", + "# m3 = m2 + \"\\nWhat can I do?\"\n", + "\n", + "# m1 = m0 + f\"Hi there {gen(name='name', max_tokens=10, regex='[A-Za-z]{3,5}')}\"\n", + "# m2 = m0 + f\"You can't stop \" + gen(name='name', max_tokens=10, regex='[A-Za-z]{3,5}')\n", + "\n", + "# with system():\n", + "# m3 = m0 + \"You are responsible for autocompleting a sentence.\"\n", + "\n", + "# with user():\n", + "# m4 = m3 + \"The sun is rising \" + gen(name='sentence_suffix', max_tokens=3)\n", + "\n", + "# m2.html()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5a5d668a11bda28f", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7bc266ab105a4e1ebac84a5ccf374e93", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "StitchWidget(initial_height='auto', initial_width='100%', srcdoc='\\n\\n\\n …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-10-21 00:23:55 - DEBUG - CELL:executed:message_id=70 class_name='ExecutionCompletedMessage' last_trace_id=25\n", + "2024-10-21 00:23:55 - DEBUG - ENGINE:message_id=70 class_name='ExecutionCompletedMessage' last_trace_id=25\n", + "2024-10-21 00:23:55 - DEBUG - JUPYTER:changed:4a597956-2fce-418b-9cd4-7442bfc9dea2|5\n", + "2024-10-21 00:23:55 - DEBUG - SEND:ready\n", + "2024-10-21 00:23:55 - DEBUG - ENGINE:final_text:What is this?\n", + "2024-10-21 00:23:55 - DEBUG - RENDER:execution completed out\n", + "2024-10-21 00:23:55 - DEBUG - RENDER:execution completed\n", + "2024-10-21 00:23:55 - DEBUG - RECV:clientready\n", + "2024-10-21 00:23:55 - DEBUG - ENGINE:message_id=77 class_name='ClientReadyMessage'\n", + "2024-10-21 00:23:55 - DEBUG - JUPYTER:changed:196b33d5-8401-4388-ba99-d49248536afb|5\n" + ] + } + ], + "source": [ + "from guidance import legacy_mode\n", + "legacy_mode(False)\n", + "\n", + "m5 = Transformers(\"gpt2\")\n", + "m6 = m5 + \"What is this?\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "235109a1-e1de-4303-bb0b-d7f9931a421c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/python/stitch/.coveragerc b/packages/python/stitch/.coveragerc new file mode 100644 index 000000000..dc0dc815f --- /dev/null +++ b/packages/python/stitch/.coveragerc @@ -0,0 +1,2 @@ +[run] +omit = stitch/tests/* diff --git a/packages/python/stitch/.eslintignore b/packages/python/stitch/.eslintignore new file mode 100644 index 000000000..e8a22210a --- /dev/null +++ b/packages/python/stitch/.eslintignore @@ -0,0 +1,5 @@ +node_modules +dist +coverage +**/*.d.ts +tests \ No newline at end of file diff --git a/packages/python/stitch/.eslintrc.js b/packages/python/stitch/.eslintrc.js new file mode 100644 index 000000000..9fb27ea5b --- /dev/null +++ b/packages/python/stitch/.eslintrc.js @@ -0,0 +1,28 @@ +module.exports = { + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended' + ], + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.eslint.json', + sourceType: 'module' + }, + plugins: ['@typescript-eslint'], + rules: { + '@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }], + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/quotes': [ + 'error', + 'single', + { avoidEscape: true, allowTemplateLiterals: false } + ], + curly: ['error', 'all'], + eqeqeq: 'error', + 'prefer-arrow-callback': 'error' + } +}; \ No newline at end of file diff --git a/packages/python/stitch/.github/workflows/build.yml b/packages/python/stitch/.github/workflows/build.yml new file mode 100644 index 000000000..dfab4e374 --- /dev/null +++ b/packages/python/stitch/.github/workflows/build.yml @@ -0,0 +1,44 @@ +name: Build + +on: + push: + branches: main + pull_request: + branches: "*" + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + python-version: ["3.7", "3.10"] + steps: + - name: Checkout + uses: actions/checkout@v2 + + - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + + - name: Install dependencies + run: | + python -m pip install -U codecov + npm install -g codecov + - name: Test the extension + run: | + python -m pip install --upgrade -v -e ".[test, examples, docs]" + python -m pytest + yarn run test + + - name: Linting + if: ${{ matrix.os == 'ubuntu-latest' }} + run: | + yarn run lint:check + + - name: Check docs can be build + links + if: ${{ matrix.os == 'ubuntu-latest' }} + working-directory: docs + run: | + sudo apt install -y pandoc + make html + python -m pytest --check-links diff --git a/packages/python/stitch/.gitignore b/packages/python/stitch/.gitignore new file mode 100644 index 000000000..61493d6f8 --- /dev/null +++ b/packages/python/stitch/.gitignore @@ -0,0 +1,156 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask instance folder +instance/ + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ +docs/source/_static/embed-bundle.js +docs/source/_static/embed-bundle.js.map + +# PyBuilder +target/ + +# IPython Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# dotenv +.env + +# virtualenv +venv/ +ENV/ + +# Spyder project settings +.spyderproject + +# Rope project settings +.ropeproject + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +# NPM +# ---- + +**/node_modules/ +stitch/nbextension/index.* +.yarn/ + +# Coverage data +# ------------- +**/coverage/ + +# Packed lab extensions +stitch/labextension diff --git a/packages/python/stitch/.npmignore b/packages/python/stitch/.npmignore new file mode 100644 index 000000000..f8ec1d196 --- /dev/null +++ b/packages/python/stitch/.npmignore @@ -0,0 +1,7 @@ +.DS_Store +node_modules/ +tests/ +.jshintrc +# Ignore any build output from python: +dist/*.tar.gz +dist/*.wheel diff --git a/packages/python/stitch/.prettierignore b/packages/python/stitch/.prettierignore new file mode 100644 index 000000000..b56605bbd --- /dev/null +++ b/packages/python/stitch/.prettierignore @@ -0,0 +1,4 @@ +node_modules +**/node_modules +**/lib +**/package.json \ No newline at end of file diff --git a/packages/python/stitch/.prettierrc b/packages/python/stitch/.prettierrc new file mode 100644 index 000000000..dc2fb828f --- /dev/null +++ b/packages/python/stitch/.prettierrc @@ -0,0 +1,3 @@ +{ + "singleQuote": true +} \ No newline at end of file diff --git a/packages/python/stitch/.yarnrc.yml b/packages/python/stitch/.yarnrc.yml new file mode 100644 index 000000000..3186f3f07 --- /dev/null +++ b/packages/python/stitch/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/packages/python/stitch/LICENSE.txt b/packages/python/stitch/LICENSE.txt new file mode 100644 index 000000000..be5b7c6c6 --- /dev/null +++ b/packages/python/stitch/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2024 Guidance Contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/python/stitch/MANIFEST.in b/packages/python/stitch/MANIFEST.in new file mode 100644 index 000000000..ef35b9f2d --- /dev/null +++ b/packages/python/stitch/MANIFEST.in @@ -0,0 +1,41 @@ +include LICENSE.txt +include README.md + +include setup.py +include pyproject.toml +include pytest.ini +include .coverage.rc + +include tsconfig.json +include package.json +include webpack.config.js +include stitch/labextension/*.tgz + +# Documentation +graft docs +exclude docs/\#* +prune docs/build +prune docs/gh-pages +prune docs/dist + +# Examples +graft examples + +# Tests +graft tests +prune tests/build + +# Javascript files +graft stitch/nbextension +graft src +graft css +prune **/node_modules +prune coverage +prune lib + +# Patterns to exclude from any directory +global-exclude *~ +global-exclude *.pyc +global-exclude *.pyo +global-exclude .git +global-exclude .ipynb_checkpoints diff --git a/packages/python/stitch/README.md b/packages/python/stitch/README.md new file mode 100644 index 000000000..3267f1986 --- /dev/null +++ b/packages/python/stitch/README.md @@ -0,0 +1,83 @@ + +# stitch + +[](https://travis-ci.org/guidance-ai/stitch) +[](https://codecov.io/gh/guidance-ai/stitch) + + +Bidirectional comms for Jupyter and JavaScript. + +## Installation + +You can install using `pip`: + +```bash +pip install stitch +``` + +If you are using Jupyter Notebook 5.2 or earlier, you may also need to enable +the nbextension: +```bash +jupyter nbextension enable --py [--sys-prefix|--user|--system] stitch +``` + +## Development Installation + +Create a dev environment: +```bash +conda create -n stitch-dev -c conda-forge nodejs python jupyterlab=4.0.11 +conda activate stitch-dev +``` + +Install the python. This will also build the TS package. +```bash +pip install -e ".[test, examples]" +``` + +When developing your extensions, you need to manually enable your extensions with the +notebook / lab frontend. For lab, this is done by the command: + +``` +jupyter labextension develop --overwrite . +jlpm run build +``` + +For classic notebook, you need to run: + +``` +jupyter nbextension install --sys-prefix --symlink --overwrite --py stitch +jupyter nbextension enable --sys-prefix --py stitch +``` + +Note that the `--symlink` flag doesn't work on Windows, so you will here have to run +the `install` command every time that you rebuild your extension. For certain installations +you might also need another flag instead of `--sys-prefix`, but we won't cover the meaning +of those flags here. + +### How to see your changes +#### Typescript: +If you use JupyterLab to develop then you can watch the source directory and run JupyterLab at the same time in different +terminals to watch for changes in the extension's source and automatically rebuild the widget. + +```bash +# Watch the source directory in one terminal, automatically rebuilding when needed +jlpm run watch +# Run JupyterLab in another terminal +jupyter lab +``` + +After a change wait for the build to finish and then refresh your browser and the changes should take effect. + +#### Python: +If you make a change to the python code then you will need to restart the notebook kernel to have it take effect. + +## Updating the version + +To update the version, install tbump and use it to bump the version. +By default it will also create a tag. + +```bash +pip install tbump +tbump
srcdoc should be defined by the user
', + ); + }); + + it('should be createable with a value', () => { + const state = { srcdoc: 'it is alright' }; + const model = createTestModel(StitchModel, state); + expect(model).toBeInstanceOf(StitchModel); + expect(model.get('srcdoc')).toEqual('it is alright'); + }); + }); +}); diff --git a/packages/python/stitch/src/__tests__/utils.ts b/packages/python/stitch/src/__tests__/utils.ts new file mode 100644 index 000000000..0a61d63e9 --- /dev/null +++ b/packages/python/stitch/src/__tests__/utils.ts @@ -0,0 +1,119 @@ +// Copyright (c) Jupyter Development Team. +// Distributed under the terms of the Modified BSD License. + +import * as widgets from '@jupyter-widgets/base'; +import * as baseManager from '@jupyter-widgets/base-manager'; +import * as services from '@jupyterlab/services'; + +let numComms = 0; + +export class MockComm implements widgets.IClassicComm { + constructor() { + this.comm_id = `mock-comm-id-${numComms}`; + numComms += 1; + } + on_close(fn: ((x?: any) => void) | null): void { + this._on_close = fn; + } + on_msg(fn: (x?: any) => void): void { + this._on_msg = fn; + } + _process_msg(msg: services.KernelMessage.ICommMsgMsg): void | Promisesrcdoc should be defined by the user
', + initial_height: '1px', + initial_width: '1px', + initial_border: '0', + }; + } + + static serializers: ISerializers = { + ...DOMWidgetModel.serializers, + // Add any extra serializers here + }; + + static model_name = 'StitchModel'; + static model_module = MODULE_NAME; + static model_module_version = MODULE_VERSION; + static view_name = 'StitchView'; // Set to null if no view + static view_module = MODULE_NAME; // Set to null if no view + static view_module_version = MODULE_VERSION; +} + +export class StitchView extends DOMWidgetView { + private _iframe: HTMLIFrameElement; + + render() { + // Create sandboxed frame + const iframe = document.createElement('iframe'); + iframe.sandbox.add('allow-scripts'); + iframe.srcdoc = this.model.get('srcdoc'); + iframe.style.height = this.model.get('initial_height'); + iframe.style.width = this.model.get('initial_width'); + iframe.style.border = this.model.get('initial_border'); + iframe.style.display = 'block'; + this._iframe = iframe; + + // Send first kernelmsg on load. + const refreshTimeMs = 100; + const sendKernelMsgOnReady = () => { + if (this.model.isNew()) { + window.setTimeout(sendKernelMsgOnReady, refreshTimeMs); + } else { + this.kernelmsg_changed(); + } + }; + window.setTimeout(sendKernelMsgOnReady, refreshTimeMs); + + // Add callback for forwarding messages from client to kernel + const model = this.model; + const recvFromClient = (event: any) => { + const win = iframe.contentWindow; + if (win === event.source && event.data.type === 'clientmsg') { + model.set('clientmsg', event.data.content); + model.save_changes(); + } else if (win === event.source && event.data.type === 'resize') { + iframe.style.height = event.data.content.height; + iframe.style.width = event.data.content.width; + } + }; + window.addEventListener('message', recvFromClient); + + // Add iframe to root element of widget + this.el.appendChild(this._iframe); + + // Connect callbacks for forwarding from kernel to client + this.model.on('change:kernelmsg', this.kernelmsg_changed, this); + + // Connect callback for when kernel changes the srcdoc + this.model.on('change:srcdoc', this.srcdoc_changed, this); + } + + kernelmsg_changed() { + // Forward message from kernel to client + const kernelmsg = this.model.get('kernelmsg'); + const winmsg = { + type: 'kernelmsg', + content: kernelmsg, + }; + this._iframe.contentWindow?.postMessage(winmsg, '*'); + } + + srcdoc_changed() { + // Apply srcdoc provided by client + const srcdoc = this.model.get('srcdoc'); + this._iframe.srcdoc = srcdoc; + + // Push last kernelmsg immediately to iframe + this.kernelmsg_changed(); + } +} diff --git a/packages/python/stitch/stitch.json b/packages/python/stitch/stitch.json new file mode 100644 index 000000000..d18d678e2 --- /dev/null +++ b/packages/python/stitch/stitch.json @@ -0,0 +1,5 @@ +{ + "load_extensions": { + "stitch/extension": true + } +} diff --git a/packages/python/stitch/stitch/__init__.py b/packages/python/stitch/stitch/__init__.py new file mode 100644 index 000000000..e984ee173 --- /dev/null +++ b/packages/python/stitch/stitch/__init__.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# coding: utf-8 + +# Copyright (c) Guidance Contributors. +# Distributed under the terms of the Modified BSD License. + +from .stitch import StitchWidget +from ._version import __version__, version_info + +def _jupyter_labextension_paths(): + """Called by Jupyter Lab Server to detect if it is a valid labextension and + to install the widget + Returns + ======= + src: Source directory name to copy files from. Webpack outputs generated files + into this directory and Jupyter Lab copies from this directory during + widget installation + dest: Destination directory name to install widget files to. Jupyter Lab copies + from `src` directory intosrcdoc should be defined by the user
").tag(sync=True) + initial_height = Unicode("1px").tag(sync=True) + initial_width = Unicode("1px").tag(sync=True) + initial_border = Unicode("0").tag(sync=True) diff --git a/packages/python/stitch/stitch/tests/__init__.py b/packages/python/stitch/stitch/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/python/stitch/stitch/tests/conftest.py b/packages/python/stitch/stitch/tests/conftest.py new file mode 100644 index 000000000..ad3bd1758 --- /dev/null +++ b/packages/python/stitch/stitch/tests/conftest.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# coding: utf-8 + +# Copyright (c) Guidance Contributors. +# Distributed under the terms of the Modified BSD License. + +import pytest + +from ipykernel.comm import Comm +from ipywidgets import Widget + +class MockComm(Comm): + """A mock Comm object. + + Can be used to inspect calls to Comm's open/send/close methods. + """ + comm_id = 'a-b-c-d' + kernel = 'Truthy' + + def __init__(self, *args, **kwargs): + self.log_open = [] + self.log_send = [] + self.log_close = [] + super(MockComm, self).__init__(*args, **kwargs) + + def open(self, *args, **kwargs): + self.log_open.append((args, kwargs)) + + def send(self, *args, **kwargs): + self.log_send.append((args, kwargs)) + + def close(self, *args, **kwargs): + self.log_close.append((args, kwargs)) + +_widget_attrs = {} +undefined = object() + + +@pytest.fixture +def mock_comm(): + _widget_attrs['_comm_default'] = getattr(Widget, '_comm_default', undefined) + Widget._comm_default = lambda self: MockComm() + _widget_attrs['_ipython_display_'] = Widget._ipython_display_ + def raise_not_implemented(*args, **kwargs): + raise NotImplementedError() + Widget._ipython_display_ = raise_not_implemented + + yield MockComm() + + for attr, value in _widget_attrs.items(): + if value is undefined: + delattr(Widget, attr) + else: + setattr(Widget, attr, value) diff --git a/packages/python/stitch/stitch/tests/test_example.py b/packages/python/stitch/stitch/tests/test_example.py new file mode 100644 index 000000000..0d216157a --- /dev/null +++ b/packages/python/stitch/stitch/tests/test_example.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +# coding: utf-8 + +# Copyright (c) Guidance Contributors. +# Distributed under the terms of the Modified BSD License. + +import pytest + +from ..stitch import StitchWidget + + +def test_example_creation_blank(): + w = StitchWidget() + assert w.kernelmsg == "" + assert w.clientmsg == "" + assert w.srcdoc == "srcdoc should be defined by the user
" diff --git a/packages/python/stitch/stitch/tests/test_nbextension_path.py b/packages/python/stitch/stitch/tests/test_nbextension_path.py new file mode 100644 index 000000000..c134480ab --- /dev/null +++ b/packages/python/stitch/stitch/tests/test_nbextension_path.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +# coding: utf-8 + +# Copyright (c) Guidance Contributors. +# Distributed under the terms of the Modified BSD License. + + +def test_nbextension_path(): + # Check that magic function can be imported from package root: + from stitch import _jupyter_nbextension_paths + # Ensure that it can be called without incident: + path = _jupyter_nbextension_paths() + # Some sanity checks: + assert len(path) == 1 + assert isinstance(path[0], dict) diff --git a/packages/python/stitch/tsconfig.eslint.json b/packages/python/stitch/tsconfig.eslint.json new file mode 100644 index 000000000..737e3e680 --- /dev/null +++ b/packages/python/stitch/tsconfig.eslint.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": [] +} \ No newline at end of file diff --git a/packages/python/stitch/tsconfig.json b/packages/python/stitch/tsconfig.json new file mode 100644 index 000000000..f143a554e --- /dev/null +++ b/packages/python/stitch/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "declaration": true, + "esModuleInterop":true, + "lib": ["es2015", "dom"], + "module": "commonjs", + "moduleResolution": "node", + "noEmitOnError": true, + "noUnusedLocals": true, + "outDir": "lib", + "resolveJsonModule": true, + "rootDir": "src", + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "strictPropertyInitialization": false, + "target": "es2015", + "types": ["jest"] + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + ], + "exclude": ["src/**/__tests__"] +} diff --git a/packages/python/stitch/webpack.config.js b/packages/python/stitch/webpack.config.js new file mode 100644 index 000000000..8faaf089b --- /dev/null +++ b/packages/python/stitch/webpack.config.js @@ -0,0 +1,91 @@ +const path = require('path'); +const version = require('./package.json').version; + +// Custom webpack rules +const rules = [ + { test: /\.ts$/, loader: 'ts-loader' }, + { test: /\.js$/, loader: 'source-map-loader' }, + { test: /\.css$/, use: ['style-loader', 'css-loader']} +]; + +// Packages that shouldn't be bundled but loaded at runtime +const externals = ['@jupyter-widgets/base']; + +const resolve = { + // Add '.ts' and '.tsx' as resolvable extensions. + extensions: [".webpack.js", ".web.js", ".ts", ".js"] +}; + +module.exports = [ + /** + * Notebook extension + * + * This bundle only contains the part of the JavaScript that is run on load of + * the notebook. + */ + { + entry: './src/extension.ts', + output: { + filename: 'index.js', + path: path.resolve(__dirname, 'stitch', 'nbextension'), + libraryTarget: 'amd', + publicPath: '', + }, + module: { + rules: rules + }, + devtool: 'source-map', + externals, + resolve, + }, + + /** + * Embeddable stitch bundle + * + * This bundle is almost identical to the notebook extension bundle. The only + * difference is in the configuration of the webpack public path for the + * static assets. + * + * The target bundle is always `dist/index.js`, which is the path required by + * the custom widget embedder. + */ + { + entry: './src/index.ts', + output: { + filename: 'index.js', + path: path.resolve(__dirname, 'dist'), + libraryTarget: 'amd', + library: "stitch", + publicPath: 'https://unpkg.com/stitch@' + version + '/dist/' + }, + devtool: 'source-map', + module: { + rules: rules + }, + externals, + resolve, + }, + + + /** + * Documentation widget bundle + * + * This bundle is used to embed widgets in the package documentation. + */ + { + entry: './src/index.ts', + output: { + filename: 'embed-bundle.js', + path: path.resolve(__dirname, 'docs', 'source', '_static'), + library: "stitch", + libraryTarget: 'amd' + }, + module: { + rules: rules + }, + devtool: 'source-map', + externals, + resolve, + } + +]; diff --git a/packages/python/stitch/yarn.lock b/packages/python/stitch/yarn.lock new file mode 100644 index 000000000..b3e0c518f --- /dev/null +++ b/packages/python/stitch/yarn.lock @@ -0,0 +1,8955 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@ampproject/remapping@npm:^2.2.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: d3ad7b89d973df059c4e8e6d7c972cbeb1bb2f18f002a3bd04ae0707da214cb06cc06929b65aa2313b9347463df2914772298bae8b1d7973f246bb3f2ab3e8f0 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": ^7.25.9 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: db13f5c42d54b76c1480916485e6900748bbcb0014a8aca87f50a091f70ff4e0d0a6db63cade75eb41fcc3d2b6ba0a7f89e343def4f96f00269b41b8ab8dd7b8 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0": + version: 7.26.3 + resolution: "@babel/compat-data@npm:7.26.3" + checksum: 85c5a9fb365231688c7faeb977f1d659da1c039e17b416f8ef11733f7aebe11fe330dce20c1844cacf243766c1d643d011df1d13cac9eda36c46c6c475693d21 + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.7, @babel/core@npm:^7.23.9": + version: 7.26.0 + resolution: "@babel/core@npm:7.26.0" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.26.0 + "@babel/generator": ^7.26.0 + "@babel/helper-compilation-targets": ^7.25.9 + "@babel/helper-module-transforms": ^7.26.0 + "@babel/helpers": ^7.26.0 + "@babel/parser": ^7.26.0 + "@babel/template": ^7.25.9 + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.26.0 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: b296084cfd818bed8079526af93b5dfa0ba70282532d2132caf71d4060ab190ba26d3184832a45accd82c3c54016985a4109ab9118674347a7e5e9bc464894e6 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.3, @babel/generator@npm:^7.7.2": + version: 7.26.3 + resolution: "@babel/generator@npm:7.26.3" + dependencies: + "@babel/parser": ^7.26.3 + "@babel/types": ^7.26.3 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^3.0.2 + checksum: fb09fa55c66f272badf71c20a3a2cee0fa1a447fed32d1b84f16a668a42aff3e5f5ddc6ed5d832dda1e952187c002ca1a5cdd827022efe591b6ac44cada884ea + languageName: node + linkType: hard + +"@babel/helper-annotate-as-pure@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" + dependencies: + "@babel/types": ^7.25.9 + checksum: 41edda10df1ae106a9b4fe617bf7c6df77db992992afd46192534f5cff29f9e49a303231733782dd65c5f9409714a529f215325569f14282046e9d3b7a1ffb6c + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-compilation-targets@npm:7.25.9" + dependencies: + "@babel/compat-data": ^7.25.9 + "@babel/helper-validator-option": ^7.25.9 + browserslist: ^4.24.0 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: 3af536e2db358b38f968abdf7d512d425d1018fef2f485d6f131a57a7bcaed32c606b4e148bb230e1508fa42b5b2ac281855a68eb78270f54698c48a83201b9b + languageName: node + linkType: hard + +"@babel/helper-create-class-features-plugin@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": ^7.25.9 + "@babel/helper-member-expression-to-functions": ^7.25.9 + "@babel/helper-optimise-call-expression": ^7.25.9 + "@babel/helper-replace-supers": ^7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 + "@babel/traverse": ^7.25.9 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 91dd5f203ed04568c70b052e2f26dfaac7c146447196c00b8ecbb6d3d2f3b517abadb985d3321a19d143adaed6fe17f7f79f8f50e0c20e9d8ad83e1027b42424 + languageName: node + linkType: hard + +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": + version: 7.26.3 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.26.3" + dependencies: + "@babel/helper-annotate-as-pure": ^7.25.9 + regexpu-core: ^6.2.0 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 50a27d8ce6da5c2fa0c62c132c4d27cfeb36e3233ff1e5220d643de3dafe49423b507382f0b72a696fce7486014b134c1e742f55438590f9405d26765b009af0 + languageName: node + linkType: hard + +"@babel/helper-define-polyfill-provider@npm:^0.6.2, @babel/helper-define-polyfill-provider@npm:^0.6.3": + version: 0.6.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.3" + dependencies: + "@babel/helper-compilation-targets": ^7.22.6 + "@babel/helper-plugin-utils": ^7.22.5 + debug: ^4.1.1 + lodash.debounce: ^4.0.8 + resolve: ^1.14.2 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 710e6d8a5391736b9f53f09d0494575c2e03de199ad8d1349bc8e514cb85251ea1f1842c2ff44830849d482052ddb42ae931101002a87a263b12f649c2e57c01 + languageName: node + linkType: hard + +"@babel/helper-member-expression-to-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" + dependencies: + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 8e2f1979b6d596ac2a8cbf17f2cf709180fefc274ac3331408b48203fe19134ed87800774ef18838d0275c3965130bae22980d90caed756b7493631d4b2cf961 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 1b411ce4ca825422ef7065dffae7d8acef52023e51ad096351e3e2c05837e9bf9fca2af9ca7f28dc26d596a588863d0fedd40711a88e350b736c619a80e704e6 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" + dependencies: + "@babel/helper-module-imports": ^7.25.9 + "@babel/helper-validator-identifier": ^7.25.9 + "@babel/traverse": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 942eee3adf2b387443c247a2c190c17c4fd45ba92a23087abab4c804f40541790d51ad5277e4b5b1ed8d5ba5b62de73857446b7742f835c18ebd350384e63917 + languageName: node + linkType: hard + +"@babel/helper-optimise-call-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" + dependencies: + "@babel/types": ^7.25.9 + checksum: f09d0ad60c0715b9a60c31841b3246b47d67650c512ce85bbe24a3124f1a4d66377df793af393273bc6e1015b0a9c799626c48e53747581c1582b99167cc65dc + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: e19ec8acf0b696756e6d84531f532c5fe508dce57aa68c75572a77798bd04587a844a9a6c8ea7d62d673e21fdc174d091c9097fb29aea1c1b49f9c6eaa80f022 + languageName: node + linkType: hard + +"@babel/helper-remap-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": ^7.25.9 + "@babel/helper-wrap-function": ^7.25.9 + "@babel/traverse": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: ea37ad9f8f7bcc27c109963b8ebb9d22bac7a5db2a51de199cb560e251d5593fe721e46aab2ca7d3e7a24b0aa4aff0eaf9c7307af9c2fd3a1d84268579073052 + languageName: node + linkType: hard + +"@babel/helper-replace-supers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-replace-supers@npm:7.25.9" + dependencies: + "@babel/helper-member-expression-to-functions": ^7.25.9 + "@babel/helper-optimise-call-expression": ^7.25.9 + "@babel/traverse": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 84f40e12520b7023e52d289bf9d569a06284879fe23bbbacad86bec5d978b2669769f11b073fcfeb1567d8c547168323005fda88607a4681ecaeb4a5cdd48bb9 + languageName: node + linkType: hard + +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" + dependencies: + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: fdbb5248932198bc26daa6abf0d2ac42cab9c2dbb75b7e9f40d425c8f28f09620b886d40e7f9e4e08ffc7aaa2cefe6fc2c44be7c20e81f7526634702fb615bdc + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 6435ee0849e101681c1849868278b5aee82686ba2c1e27280e5e8aca6233af6810d39f8e4e693d2f2a44a3728a6ccfd66f72d71826a94105b86b731697cdfa99 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944 + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d + languageName: node + linkType: hard + +"@babel/helper-wrap-function@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-wrap-function@npm:7.25.9" + dependencies: + "@babel/template": ^7.25.9 + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 8ec1701e60ae004415800c4a7a188f5564c73b4e4f3fdf58dd3f34a3feaa9753173f39bbd6d02e7ecc974f48155efc7940e62584435b3092c07728ee46a604ea + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helpers@npm:7.26.0" + dependencies: + "@babel/template": ^7.25.9 + "@babel/types": ^7.26.0 + checksum: d77fe8d45033d6007eadfa440355c1355eed57902d5a302f450827ad3d530343430a21210584d32eef2f216ae463d4591184c6fc60cf205bbf3a884561469200 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/parser@npm:7.26.3" + dependencies: + "@babel/types": ^7.26.3 + bin: + parser: ./bin/babel-parser.js + checksum: e2bff2e9fa6540ee18fecc058bc74837eda2ddcecbe13454667314a93fc0ba26c1fb862c812d84f6d5f225c3bd8d191c3a42d4296e287a882c4e1f82ff2815ff + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/traverse": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: b33d37dacf98a9c74f53959999adc37a258057668b62dba557e6865689433c53764673109eaba9102bf73b2ac4db162f0d9b89a6cca6f1b71d12f5908ec11da9 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: d3e14ab1cb9cb50246d20cab9539f2fbd1e7ef1ded73980c8ad7c0561b4d5e0b144d362225f0976d47898e04cbd40f2000e208b0913bd788346cf7791b96af91 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: a9d1ee3fd100d3eb6799a2f2bbd785296f356c531d75c9369f71541811fa324270258a374db103ce159156d006da2f33370330558d0133e6f7584152c34997ca + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 + "@babel/plugin-transform-optional-chaining": ^7.25.9 + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 5b298b28e156f64de51cdb03a2c5b80c7f978815ef1026f3ae8b9fc48d28bf0a83817d8fbecb61ef8fb94a7201f62cca5103cc6e7b9e8f28e38f766d7905b378 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/traverse": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: c684593952ab1b40dfa4e64e98a07e7227c6db175c21bd0e6d71d2ad5d240fef4e4a984d56f05a494876542a022244fe1c1098f4116109fd90d06615e8a269b1 + languageName: node + linkType: hard + +"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": + version: 7.21.0-placeholder-for-preset-env.2 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d97745d098b835d55033ff3a7fb2b895b9c5295b08a5759e4f20df325aa385a3e0bc9bd5ad8f2ec554a44d4e6525acfc257b8c5848a1345cb40f26a30e277e91 + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.12.13": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": ^7.12.13 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-assertions@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b58f2306df4a690ca90b763d832ec05202c50af787158ff8b50cdf3354359710bce2e1eb2b5135fcabf284756ac8eadf09ca74764aa7e76d12a5cac5f6b21e67 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c122aa577166c80ee67f75aebebeef4150a132c4d3109d25d7fc058bf802946f883e330f20b78c1d3e3a5ada631c8780c263d2d01b5dbaecc69efefeedd42916 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bb609d1ffb50b58f0c1bac8810d0e46a4f6c922aa171c458f3a19d66ee545d36e782d3bffbbc1fed0dc65a558bdce1caf5279316583c0fff5a2c1658982a8563 + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + languageName: node + linkType: hard + +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0e9821e8ba7d660c36c919654e4144a70546942ae184e85b8102f2322451eae102cbfadbcadd52ce077a2b44b400ee52394c616feab7b5b9f791b910e933fd33 + languageName: node + linkType: hard + +"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.18.6 + "@babel/helper-plugin-utils": ^7.18.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: a651d700fe63ff0ddfd7186f4ebc24447ca734f114433139e3c027bc94a900d013cf1ef2e2db8430425ba542e39ae160c3b05f06b59fd4656273a3df97679e9c + languageName: node + linkType: hard + +"@babel/plugin-transform-arrow-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c29f081224859483accf55fb4d091db2aac0dcd0d7954bac5ca889030cc498d3f771aa20eb2e9cd8310084ec394d85fa084b97faf09298b6bc9541182b3eb5bb + languageName: node + linkType: hard + +"@babel/plugin-transform-async-generator-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-remap-async-to-generator": ^7.25.9 + "@babel/traverse": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 41e02c18c2a57de9f274fa2c5a1bf81a20ab5f321db29cc3051512b9c5bdf3f1a8c42f1fc282cb62343c6d50849f992eede954d5f7fb5e7df48ae0c59ea7e054 + languageName: node + linkType: hard + +"@babel/plugin-transform-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" + dependencies: + "@babel/helper-module-imports": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-remap-async-to-generator": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b3ad50fb93c171644d501864620ed23952a46648c4df10dc9c62cc9ad08031b66bd272cfdd708faeee07c23b6251b16f29ce0350473e4c79f0c32178d38ce3a6 + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoped-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf31896556b33a80f017af3d445ceb532ec0f5ca9d69bc211a963ac92514d172d5c24c5ac319f384d9dfa7f1a4d8dc23032c2fe3e74f98a59467ecd86f7033ae + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoping@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e869500cfb1995e06e64c9608543b56468639809febfcdd6fcf683bc0bf1be2431cacf2981a168a1a14f4766393e37bc9f7c96d25bc5b5f39a64a8a8ad0bf8e0 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a8d69e2c285486b63f49193cbcf7a15e1d3a5f632c1c07d7a97f65306df7f554b30270b7378dde143f8b557d1f8f6336c643377943dec8ec405e4cd11e90b9ea + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.12.0 + checksum: d779d4d3a6f8d363f67fcbd928c15baa72be8d3b86c6d05e0300b50e66e2c4be9e99398b803d13064bc79d90ae36e37a505e3dc8af11904459804dec07660246 + languageName: node + linkType: hard + +"@babel/plugin-transform-classes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-classes@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": ^7.25.9 + "@babel/helper-compilation-targets": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-replace-supers": ^7.25.9 + "@babel/traverse": ^7.25.9 + globals: ^11.1.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d12584f72125314cc0fa8c77586ece2888d677788ac75f7393f5da574dfe4e45a556f7e3488fab29c8777ab3e5856d7a2d79f6df02834083aaa9d766440e3c68 + languageName: node + linkType: hard + +"@babel/plugin-transform-computed-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/template": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f77fa4bc0c1e0031068172df28852388db6b0f91c268d037905f459607cf1e8ebab00015f9f179f4ad96e11c5f381b635cd5dc4e147a48c7ac79d195ae7542de + languageName: node + linkType: hard + +"@babel/plugin-transform-destructuring@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 965f63077a904828f4adee91393f83644098533442b8217d5a135c23a759a4c252c714074c965676a60d2c33f610f579a4eeb59ffd783724393af61c0ca45fef + languageName: node + linkType: hard + +"@babel/plugin-transform-dotall-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8bdf1bb9e6e3a2cc8154ae88a3872faa6dc346d6901994505fb43ac85f858728781f1219f40b67f7bb0687c507450236cb7838ac68d457e65637f98500aa161b + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b553eebc328797ead6be5ba5bdaf2f1222cea8a5bd33fb4ed625975d4f9b510bfb0d688d97e314cd4b4a48b279bea7b3634ad68c1b41ee143c3082db0ae74037 + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: f7233cf596be8c6843d31951afaf2464a62a610cb89c72c818c044765827fab78403ab8a7d3a6386f838c8df574668e2a48f6c206b1d7da965aff9c6886cb8e6 + languageName: node + linkType: hard + +"@babel/plugin-transform-dynamic-import@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: aaca1ccda819be9b2b85af47ba08ddd2210ff2dbea222f26e4cd33f97ab020884bf81a66197e50872721e9daf36ceb5659502c82199884ea74d5d75ecda5c58b + languageName: node + linkType: hard + +"@babel/plugin-transform-exponentiation-operator@npm:^7.25.9": + version: 7.26.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b369ffad07e02e259c43a09d309a5ca86cb9da6b43b1df6256463a810b172cedc4254742605eec0fc2418371c3f7430430f5abd36f21717281e79142308c13ba + languageName: node + linkType: hard + +"@babel/plugin-transform-export-namespace-from@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4dfe8df86c5b1d085d591290874bb2d78a9063090d71567ed657a418010ad333c3f48af2c974b865f53bbb718987a065f89828d43279a7751db1a56c9229078d + languageName: node + linkType: hard + +"@babel/plugin-transform-for-of@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-for-of@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 41b56e70256a29fc26ed7fb95ece062d7ec2f3b6ea8f0686349ffd004cd4816132085ee21165b89c502ee7161cb7cfb12510961638851357945dc7bc546475b7 + languageName: node + linkType: hard + +"@babel/plugin-transform-function-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-function-name@npm:7.25.9" + dependencies: + "@babel/helper-compilation-targets": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/traverse": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a8d7c8d019a6eb57eab5ca1be3e3236f175557d55b1f3b11f8ad7999e3fbb1cf37905fd8cb3a349bffb4163a558e9f33b63f631597fdc97c858757deac1b2fd7 + languageName: node + linkType: hard + +"@babel/plugin-transform-json-strings@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e2498d84761cfd05aaea53799933d55af309c9d6204e66b38778792d171e4d1311ad34f334259a3aa3407dd0446f6bd3e390a1fcb8ce2e42fe5aabed0e41bee1 + languageName: node + linkType: hard + +"@babel/plugin-transform-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3cca75823a38aab599bc151b0fa4d816b5e1b62d6e49c156aa90436deb6e13649f5505973151a10418b64f3f9d1c3da53e38a186402e0ed7ad98e482e70c0c14 + languageName: node + linkType: hard + +"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8c6febb4ac53852314d28b5e2c23d5dbbff7bf1e57d61f9672e0d97531ef7778b3f0ad698dcf1179f5486e626c77127508916a65eb846a89e98a92f70ed3537b + languageName: node + linkType: hard + +"@babel/plugin-transform-member-expression-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: db92041ae87b8f59f98b50359e0bb172480f6ba22e5e76b13bdfe07122cbf0daa9cd8ad2e78dcb47939938fed88ad57ab5989346f64b3a16953fc73dea3a9b1f + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-amd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: baad1f6fd0e0d38e9a9c1086a06abdc014c4c653fd452337cadfe23fb5bd8bf4368d1bc433a5ac8e6421bc0732ebb7c044cf3fb39c1b7ebe967d66e26c4e5cec + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-commonjs@npm:^7.25.9": + version: 7.26.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" + dependencies: + "@babel/helper-module-transforms": ^7.26.0 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0ac9aa4e5fe9fe34b58ee174881631e5e1c89eee5b1ebfd1147934686be92fc5fbfdc11119f0b607b3743d36a1cbcb7c36f18e0dd4424d6d7b749b1b9a18808a + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-validator-identifier": ^7.25.9 + "@babel/traverse": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf446202f372ba92dc0db32b24b56225b6e3ad3b227e31074de8b86fdec01c273ae2536873e38dbe3ceb1cd0894209343adeaa37df208e3fa88c0c7dffec7924 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-umd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 946db66be5f04ab9ee56c424b00257276ec094aa2f148508927e6085239f76b00304fa1e33026d29eccdbe312efea15ca3d92e74a12689d7f0cdd9a7ba1a6c54 + languageName: node + linkType: hard + +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 434346ba05cf74e3f4704b3bdd439287b95cd2a8676afcdc607810b8c38b6f4798cd69c1419726b2e4c7204e62e4a04d31b0360e91ca57a930521c9211e07789 + languageName: node + linkType: hard + +"@babel/plugin-transform-new-target@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-new-target@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f8113539919aafce52f07b2bd182c771a476fe1d5d96d813460b33a16f173f038929369c595572cadc1f7bd8cb816ce89439d056e007770ddd7b7a0878e7895f + languageName: node + linkType: hard + +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 26e03b1c2c0408cc300e46d8f8cb639653ff3a7b03456d0d8afbb53c44f33a89323f51d99991dade3a5676921119bbdf869728bb7911799b5ef99ffafa2cdd24 + languageName: node + linkType: hard + +"@babel/plugin-transform-numeric-separator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0528ef041ed88e8c3f51624ee87b8182a7f246fe4013f0572788e0727d20795b558f2b82e3989b5dd416cbd339500f0d88857de41b6d3b6fdacb1d5344bcc5b1 + languageName: node + linkType: hard + +"@babel/plugin-transform-object-rest-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" + dependencies: + "@babel/helper-compilation-targets": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/plugin-transform-parameters": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a8ff73e1c46a03056b3a2236bafd6b3a4b83da93afe7ee24a50d0a8088150bf85bc5e5977daa04e66ff5fb7613d02d63ad49b91ebb64cf3f3022598d722e3a7a + languageName: node + linkType: hard + +"@babel/plugin-transform-object-super@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-super@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-replace-supers": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1817b5d8b80e451ae1ad9080cca884f4f16df75880a158947df76a2ed8ab404d567a7dce71dd8051ef95f90fbe3513154086a32aba55cc76027f6cbabfbd7f98 + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b46a8d1e91829f3db5c252583eb00d05a779b4660abeea5500fda0f8ffa3584fd18299443c22f7fddf0ed9dfdb73c782c43b445dc468d4f89803f2356963b406 + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f1642a7094456067e82b176e1e9fd426fda7ed9df54cb6d10109fc512b622bf4b3c83acc5875125732b8622565107fdbe2d60fe3ec8685e1d1c22c38c1b57782 + languageName: node + linkType: hard + +"@babel/plugin-transform-parameters@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-parameters@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d7ba2a7d05edbc85aed741289b0ff3d6289a1c25d82ac4be32c565f88a66391f46631aad59ceeed40824037f7eeaa7a0de1998db491f50e65a565cd964f78786 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-methods@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6e3671b352c267847c53a170a1937210fa8151764d70d25005e711ef9b21969aaf422acc14f9f7fb86bc0e4ec43e7aefcc0ad9196ae02d262ec10f509f126a58 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-property-in-object@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": ^7.25.9 + "@babel/helper-create-class-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9ce3e983fea9b9ba677c192aa065c0b42ebdc7774be4c02135df09029ad92a55c35b004650c75952cb64d650872ed18f13ab64422c6fc891d06333762caa8a0a + languageName: node + linkType: hard + +"@babel/plugin-transform-property-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 436046ab07d54a9b44a384eeffec701d4e959a37a7547dda72e069e751ca7ff753d1782a8339e354b97c78a868b49ea97bf41bf5a44c6d7a3c0a05ad40eeb49c + languageName: node + linkType: hard + +"@babel/plugin-transform-regenerator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-regenerator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + regenerator-transform: ^0.15.2 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1c09e8087b476c5967282c9790fb8710e065eda77c60f6cb5da541edd59ded9d003d96f8ef640928faab4a0b35bf997673499a194973da4f0c97f0935807a482 + languageName: node + linkType: hard + +"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 726deca486bbd4b176f8a966eb0f4aabc19d9def3b8dabb8b3a656778eca0df1fda3f3c92b213aa5a184232fdafd5b7bd73b4e24ca4345c498ef6baff2bda4e1 + languageName: node + linkType: hard + +"@babel/plugin-transform-reserved-words@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8beda04481b25767acbd1f6b9ef7b3a9c12fbd9dcb24df45a6ad120e1dc4b247c073db60ac742f9093657d6d8c050501fc0606af042f81a3bb6a3ff862cddc47 + languageName: node + linkType: hard + +"@babel/plugin-transform-shorthand-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f774995d58d4e3a992b732cf3a9b8823552d471040e280264dd15e0735433d51b468fef04d75853d061309389c66bda10ce1b298297ce83999220eb0ad62741d + languageName: node + linkType: hard + +"@babel/plugin-transform-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-spread@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2403a5d49171b7714d5e5ecb1f598c61575a4dbe5e33e5a5f08c0ea990b75e693ca1ea983b6a96b2e3e5e7da48c8238333f525e47498c53b577c5d094d964c06 + languageName: node + linkType: hard + +"@babel/plugin-transform-sticky-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7454b00844dbe924030dd15e2b3615b36e196500c4c47e98dabc6b37a054c5b1038ecd437e910aabf0e43bf56b973cb148d3437d50f6e2332d8309568e3e979b + languageName: node + linkType: hard + +"@babel/plugin-transform-template-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-template-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 92eb1d6e2d95bd24abbb74fa7640d02b66ff6214e0bb616d7fda298a7821ce15132a4265d576a3502a347a3c9e94b6c69ed265bb0784664592fa076785a3d16a + languageName: node + linkType: hard + +"@babel/plugin-transform-typeof-symbol@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3f9458840d96f61502f0e9dfaae3efe8325fa0b2151e24ea0d41307f28cdd166905419f5a43447ce0f1ae4bfd001f3906b658839a60269c254168164090b4c73 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: be067e07488d804e3e82d7771f23666539d2ae5af03bf6eb8480406adf3dabd776e60c1fd5c6078dc5714b73cd80bbaca70e71d4f5d154c5c57200581602ca2f + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 201f6f46c1beb399e79aa208b94c5d54412047511795ce1e790edcd189cef73752e6a099fdfc01b3ad12205f139ae344143b62f21f44bbe02338a95e8506a911 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e8baae867526e179467c6ef5280d70390fa7388f8763a19a27c21302dd59b121032568be080749514b097097ceb9af716bf4b90638f1b3cf689aa837ba20150f + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 4445ef20de687cb4dcc95169742a8d9013d680aa5eee9186d8e25875bbfa7ee5e2de26a91177ccf70b1db518e36886abcd44750d28db5d7a9539f0efa6839f4b + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.23.8": + version: 7.26.0 + resolution: "@babel/preset-env@npm:7.26.0" + dependencies: + "@babel/compat-data": ^7.26.0 + "@babel/helper-compilation-targets": ^7.25.9 + "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-validator-option": ^7.25.9 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.25.9 + "@babel/plugin-bugfix-safari-class-field-initializer-scope": ^7.25.9 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.25.9 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.25.9 + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.25.9 + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 + "@babel/plugin-syntax-import-assertions": ^7.26.0 + "@babel/plugin-syntax-import-attributes": ^7.26.0 + "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 + "@babel/plugin-transform-arrow-functions": ^7.25.9 + "@babel/plugin-transform-async-generator-functions": ^7.25.9 + "@babel/plugin-transform-async-to-generator": ^7.25.9 + "@babel/plugin-transform-block-scoped-functions": ^7.25.9 + "@babel/plugin-transform-block-scoping": ^7.25.9 + "@babel/plugin-transform-class-properties": ^7.25.9 + "@babel/plugin-transform-class-static-block": ^7.26.0 + "@babel/plugin-transform-classes": ^7.25.9 + "@babel/plugin-transform-computed-properties": ^7.25.9 + "@babel/plugin-transform-destructuring": ^7.25.9 + "@babel/plugin-transform-dotall-regex": ^7.25.9 + "@babel/plugin-transform-duplicate-keys": ^7.25.9 + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ^7.25.9 + "@babel/plugin-transform-dynamic-import": ^7.25.9 + "@babel/plugin-transform-exponentiation-operator": ^7.25.9 + "@babel/plugin-transform-export-namespace-from": ^7.25.9 + "@babel/plugin-transform-for-of": ^7.25.9 + "@babel/plugin-transform-function-name": ^7.25.9 + "@babel/plugin-transform-json-strings": ^7.25.9 + "@babel/plugin-transform-literals": ^7.25.9 + "@babel/plugin-transform-logical-assignment-operators": ^7.25.9 + "@babel/plugin-transform-member-expression-literals": ^7.25.9 + "@babel/plugin-transform-modules-amd": ^7.25.9 + "@babel/plugin-transform-modules-commonjs": ^7.25.9 + "@babel/plugin-transform-modules-systemjs": ^7.25.9 + "@babel/plugin-transform-modules-umd": ^7.25.9 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.25.9 + "@babel/plugin-transform-new-target": ^7.25.9 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.25.9 + "@babel/plugin-transform-numeric-separator": ^7.25.9 + "@babel/plugin-transform-object-rest-spread": ^7.25.9 + "@babel/plugin-transform-object-super": ^7.25.9 + "@babel/plugin-transform-optional-catch-binding": ^7.25.9 + "@babel/plugin-transform-optional-chaining": ^7.25.9 + "@babel/plugin-transform-parameters": ^7.25.9 + "@babel/plugin-transform-private-methods": ^7.25.9 + "@babel/plugin-transform-private-property-in-object": ^7.25.9 + "@babel/plugin-transform-property-literals": ^7.25.9 + "@babel/plugin-transform-regenerator": ^7.25.9 + "@babel/plugin-transform-regexp-modifiers": ^7.26.0 + "@babel/plugin-transform-reserved-words": ^7.25.9 + "@babel/plugin-transform-shorthand-properties": ^7.25.9 + "@babel/plugin-transform-spread": ^7.25.9 + "@babel/plugin-transform-sticky-regex": ^7.25.9 + "@babel/plugin-transform-template-literals": ^7.25.9 + "@babel/plugin-transform-typeof-symbol": ^7.25.9 + "@babel/plugin-transform-unicode-escapes": ^7.25.9 + "@babel/plugin-transform-unicode-property-regex": ^7.25.9 + "@babel/plugin-transform-unicode-regex": ^7.25.9 + "@babel/plugin-transform-unicode-sets-regex": ^7.25.9 + "@babel/preset-modules": 0.1.6-no-external-plugins + babel-plugin-polyfill-corejs2: ^0.4.10 + babel-plugin-polyfill-corejs3: ^0.10.6 + babel-plugin-polyfill-regenerator: ^0.6.1 + core-js-compat: ^3.38.1 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0c3e2b3758cc0347dcf5551b5209db702764183dce66ff20bffceff6486c090bef9175f5f7d1e68cfe5584f0d817b2aab25ab5992058a7998f061f244c8caf5f + languageName: node + linkType: hard + +"@babel/preset-modules@npm:0.1.6-no-external-plugins": + version: 0.1.6-no-external-plugins + resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" + dependencies: + "@babel/helper-plugin-utils": ^7.0.0 + "@babel/types": ^7.4.4 + esutils: ^2.0.2 + peerDependencies: + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 4855e799bc50f2449fb5210f78ea9e8fd46cf4f242243f1e2ed838e2bd702e25e73e822e7f8447722a5f4baa5e67a8f7a0e403f3e7ce04540ff743a9c411c375 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.8.4": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: c8e2c0504ab271b3467a261a8f119bf2603eb857a0d71e37791f4e3fae00f681365073cc79f141ddaa90c6077c60ba56448004ad5429d07ac73532be9f7cf28a + languageName: node + linkType: hard + +"@babel/template@npm:^7.25.9, @babel/template@npm:^7.3.3": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" + dependencies: + "@babel/code-frame": ^7.25.9 + "@babel/parser": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 103641fea19c7f4e82dc913aa6b6ac157112a96d7c724d513288f538b84bae04fb87b1f1e495ac1736367b1bc30e10f058b30208fb25f66038e1f1eb4e426472 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.25.9": + version: 7.26.4 + resolution: "@babel/traverse@npm:7.26.4" + dependencies: + "@babel/code-frame": ^7.26.2 + "@babel/generator": ^7.26.3 + "@babel/parser": ^7.26.3 + "@babel/template": ^7.25.9 + "@babel/types": ^7.26.3 + debug: ^4.3.1 + globals: ^11.1.0 + checksum: dcdf51b27ab640291f968e4477933465c2910bfdcbcff8f5315d1f29b8ff861864f363e84a71fb489f5e9708e8b36b7540608ce019aa5e57ef7a4ba537e62700 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.3, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.26.3 + resolution: "@babel/types@npm:7.26.3" + dependencies: + "@babel/helper-string-parser": ^7.25.9 + "@babel/helper-validator-identifier": ^7.25.9 + checksum: 195f428080dcaadbcecc9445df7f91063beeaa91b49ccd78f38a5af6b75a6a58391d0c6614edb1ea322e57889a1684a0aab8e667951f820196901dd341f931e9 + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 + languageName: node + linkType: hard + +"@discoveryjs/json-ext@npm:^0.5.0": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" + dependencies: + eslint-visitor-keys: ^3.4.3 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: a7ffc838eb6a9ef594cda348458ccf38f34439ac77dc090fa1c120024bcd4eb911dfd74d5ef44d42063e7949fa7c5123ce714a015c4abb917d4124be1bd32bfe + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.6.0 + globals: ^13.19.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 2afb77454c06e8316793d2e8e79a0154854d35e6782a1217da274ca60b5044d2c69d6091155234ed0551a1e408f86f09dd4ece02752c59568fa403e60611e880 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": ^2.0.3 + debug: ^4.3.1 + minimatch: ^3.0.5 + checksum: eae69ff9134025dd2924f0b430eb324981494be26f0fddd267a33c28711c4db643242cf9fddf7dadb9d16c96b54b2d2c073e60a56477df86e0173149313bd5d6 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: ^7.0.4 + checksum: 5d36d289960e886484362d9eb6a51d1ea28baed5f5d0140bbe62b99bac52eaf06cc01c2bc0d3575977962f84f6b2c4387b043ee632216643d4787b0999465bf2 + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: ^5.3.1 + find-up: ^4.1.0 + get-package-type: ^0.1.0 + js-yaml: ^3.13.1 + resolve-from: ^5.0.0 + checksum: d578da5e2e804d5c93228450a1380e1a3c691de4953acc162f387b717258512a3e07b83510a936d9fab03eac90817473917e24f5d16297af3867f59328d58568 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 + languageName: node + linkType: hard + +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 + slash: ^3.0.0 + checksum: 0e3624e32c5a8e7361e889db70b170876401b7d70f509a2538c31d5cd50deb0c1ae4b92dc63fe18a0902e0a48c590c21d53787a0df41a52b34fa7cab96c384d6 + languageName: node + linkType: hard + +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": ^29.7.0 + "@jest/reporters": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^29.7.0 + jest-config: ^29.7.0 + jest-haste-map: ^29.7.0 + jest-message-util: ^29.7.0 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.7.0 + jest-resolve-dependencies: ^29.7.0 + jest-runner: ^29.7.0 + jest-runtime: ^29.7.0 + jest-snapshot: ^29.7.0 + jest-util: ^29.7.0 + jest-validate: ^29.7.0 + jest-watcher: ^29.7.0 + micromatch: ^4.0.4 + pretty-format: ^29.7.0 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: af759c9781cfc914553320446ce4e47775ae42779e73621c438feb1e4231a5d4862f84b1d8565926f2d1aab29b3ec3dcfdc84db28608bdf5f29867124ebcfc0d + languageName: node + linkType: hard + +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 + "@types/node": "*" + jest-mock: ^29.7.0 + checksum: 6fb398143b2543d4b9b8d1c6dbce83fa5247f84f550330604be744e24c2bd2178bb893657d62d1b97cf2f24baf85c450223f8237cccb71192c36a38ea2272934 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: ^29.6.3 + checksum: 75eb177f3d00b6331bcaa057e07c0ccb0733a1d0a1943e1d8db346779039cb7f103789f16e502f888a3096fb58c2300c38d1f3748b36a7fa762eb6f6d1b160ed + languageName: node + linkType: hard + +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: ^29.7.0 + jest-snapshot: ^29.7.0 + checksum: a01cb85fd9401bab3370618f4b9013b90c93536562222d920e702a0b575d239d74cecfe98010aaec7ad464f67cf534a353d92d181646a4b792acaa7e912ae55e + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + "@sinonjs/fake-timers": ^10.0.2 + "@types/node": "*" + jest-message-util: ^29.7.0 + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + checksum: caf2bbd11f71c9241b458d1b5a66cbe95debc5a15d96442444b5d5c7ba774f523c76627c6931cca5e10e76f0d08761f6f1f01a608898f4751a0eee54fc3d8d00 + languageName: node + linkType: hard + +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" + dependencies: + "@jest/environment": ^29.7.0 + "@jest/expect": ^29.7.0 + "@jest/types": ^29.6.3 + jest-mock: ^29.7.0 + checksum: 97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 + "@jridgewell/trace-mapping": ^0.3.18 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^6.0.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 + jest-worker: ^29.7.0 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 7eadabd62cc344f629024b8a268ecc8367dba756152b761bdcb7b7e570a3864fc51b2a9810cd310d85e0a0173ef002ba4528d5ea0329fbf66ee2a3ada9c40455 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": ^0.27.8 + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": ^0.3.18 + callsites: ^3.0.0 + graceful-fs: ^4.2.9 + checksum: bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": ^29.7.0 + "@jest/types": ^29.6.3 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: 67b6317d526e335212e5da0e768e3b8ab8a53df110361b80761353ad23b6aea4432b7c5665bdeb87658ea373b90fb1afe02ed3611ef6c858c7fba377505057fa + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" + dependencies: + "@jest/test-result": ^29.7.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.7.0 + slash: ^3.0.0 + checksum: 73f43599017946be85c0b6357993b038f875b796e2f0950487a82f4ebcb115fa12131932dd9904026b4ad8be131fe6e28bd8d0aa93b1563705185f9804bff8bd + languageName: node + linkType: hard + +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^29.6.3 + "@jridgewell/trace-mapping": ^0.3.18 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^2.0.0 + fast-json-stable-stringify: ^2.1.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.7.0 + jest-regex-util: ^29.6.3 + jest-util: ^29.7.0 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.2 + checksum: 0f8ac9f413903b3cb6d240102db848f2a354f63971ab885833799a9964999dd51c388162106a807f810071f864302cdd8e3f0c241c29ce02d85a36f18f3f40ab + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": ^29.6.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" + dependencies: + "@jridgewell/set-array": ^1.2.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: c0687b5227461717aa537fe71a42e356bcd1c43293b3353796a148bf3b0d6f59109def46c22f05b60e29a46f19b2e4676d027959a7c53a6c92b9d5b0d87d0420 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" + dependencies: + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + checksum: c9dc7d899397df95e3c9ec287b93c0b56f8e4453cd20743e2b9c8e779b1949bc3cccf6c01bb302779e46560eb45f62ea38d19fedd25370d814734268450a9f30 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 + languageName: node + linkType: hard + +"@jupyter-widgets/base-manager@npm:^1.0.7": + version: 1.0.11 + resolution: "@jupyter-widgets/base-manager@npm:1.0.11" + dependencies: + "@jupyter-widgets/base": ^6.0.10 + "@jupyterlab/services": ^6.0.0 || ^7.0.0 + "@lumino/coreutils": ^1.11.1 || ^2 + base64-js: ^1.2.1 + sanitize-html: ^2.3 + checksum: 04ef40b05f38ac081cae63c5201a09c30c587df8039671e4d11b16fd911171bd3507deb7b2bc7d7f0e7805bfedb7fee77ebd2560606d6570659c669abc19e374 + languageName: node + linkType: hard + +"@jupyter-widgets/base@npm:^1.1.10 || ^2 || ^3 || ^4 || ^5 || ^6, @jupyter-widgets/base@npm:^6.0.10": + version: 6.0.10 + resolution: "@jupyter-widgets/base@npm:6.0.10" + dependencies: + "@jupyterlab/services": ^6.0.0 || ^7.0.0 + "@lumino/coreutils": ^1.11.1 || ^2.1 + "@lumino/messaging": ^1.10.1 || ^2.1 + "@lumino/widgets": ^1.30.0 || ^2.1 + "@types/backbone": 1.4.14 + "@types/lodash": ^4.14.134 + backbone: 1.4.0 + jquery: ^3.1.1 + lodash: ^4.17.4 + checksum: 423f96bf6bee953f9347e7fb85a89bbae5f4040a91ab6d6769bc72b1f9752b388cb3b9ede68032133c4c567fc411d06ced290e0bfb80d3c348caa0eaf81cab9b + languageName: node + linkType: hard + +"@jupyter/ydoc@npm:^3.0.0": + version: 3.0.2 + resolution: "@jupyter/ydoc@npm:3.0.2" + dependencies: + "@jupyterlab/nbformat": ^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0 + "@lumino/coreutils": ^1.11.0 || ^2.0.0 + "@lumino/disposable": ^1.10.0 || ^2.0.0 + "@lumino/signaling": ^1.10.0 || ^2.0.0 + y-protocols: ^1.0.5 + yjs: ^13.5.40 + checksum: 770f73459635c74bd0e5cacdca1ea1f77ee8efd6e7cd58f0ccbb167ae8374e73118620f4f3628646281160a7bc7389f374bd2106f1e799bdc8f78cad0ce05b28 + languageName: node + linkType: hard + +"@jupyterlab/builder@npm:^4.0.11": + version: 4.3.4 + resolution: "@jupyterlab/builder@npm:4.3.4" + dependencies: + "@lumino/algorithm": ^2.0.2 + "@lumino/application": ^2.4.1 + "@lumino/commands": ^2.3.1 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/domutils": ^2.0.2 + "@lumino/dragdrop": ^2.1.5 + "@lumino/messaging": ^2.0.2 + "@lumino/properties": ^2.0.2 + "@lumino/signaling": ^2.1.3 + "@lumino/virtualdom": ^2.0.2 + "@lumino/widgets": ^2.5.0 + ajv: ^8.12.0 + commander: ^9.4.1 + css-loader: ^6.7.1 + duplicate-package-checker-webpack-plugin: ^3.0.0 + fs-extra: ^10.1.0 + glob: ~7.1.6 + license-webpack-plugin: ^2.3.14 + mini-css-extract-plugin: ^2.7.0 + mini-svg-data-uri: ^1.4.4 + path-browserify: ^1.0.0 + process: ^0.11.10 + source-map-loader: ~1.0.2 + style-loader: ~3.3.1 + supports-color: ^7.2.0 + terser-webpack-plugin: ^5.3.7 + webpack: ^5.76.1 + webpack-cli: ^5.0.1 + webpack-merge: ^5.8.0 + worker-loader: ^3.0.2 + bin: + build-labextension: lib/build-labextension.js + checksum: fd495abe59afb1ad52f83e97cd79870dc6d5f879f706f02c6746e7a37e6f00af3a5d2fdc879a384048fa966d0160831369b3ae91115dcf903474709064046026 + languageName: node + linkType: hard + +"@jupyterlab/coreutils@npm:^6.3.4": + version: 6.3.4 + resolution: "@jupyterlab/coreutils@npm:6.3.4" + dependencies: + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/signaling": ^2.1.3 + minimist: ~1.2.0 + path-browserify: ^1.0.0 + url-parse: ~1.5.4 + checksum: 3db39307315acb29dd606d02d5fcc6c09a57556aa0d41ba439a0577cf69c7338a90ae99e1106ebd20d842861ebda39266a910644e5a41301f62a03bb33cc4555 + languageName: node + linkType: hard + +"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.3.4": + version: 4.3.4 + resolution: "@jupyterlab/nbformat@npm:4.3.4" + dependencies: + "@lumino/coreutils": ^2.2.0 + checksum: 7c2b2bf9ce1632b8d4b0aa415e19c5b25e0fb155457cdd9fed9d7a162e477e728fefdef07d18ac25aa8ac1223534615abbc0e1f7d58c0607dc66326d694a8823 + languageName: node + linkType: hard + +"@jupyterlab/services@npm:^6.0.0 || ^7.0.0": + version: 7.3.4 + resolution: "@jupyterlab/services@npm:7.3.4" + dependencies: + "@jupyter/ydoc": ^3.0.0 + "@jupyterlab/coreutils": ^6.3.4 + "@jupyterlab/nbformat": ^4.3.4 + "@jupyterlab/settingregistry": ^4.3.4 + "@jupyterlab/statedb": ^4.3.4 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/polling": ^2.1.3 + "@lumino/properties": ^2.0.2 + "@lumino/signaling": ^2.1.3 + ws: ^8.11.0 + checksum: e962b30171ce94c6d9e60d8d06169fd6e7aa9178804b8e14e539dabac6bc04ac29a257be7b8a82c3b479291659738a55da73e2080c6dea3d986bbcc6f4e00850 + languageName: node + linkType: hard + +"@jupyterlab/settingregistry@npm:^4.3.4": + version: 4.3.4 + resolution: "@jupyterlab/settingregistry@npm:4.3.4" + dependencies: + "@jupyterlab/nbformat": ^4.3.4 + "@jupyterlab/statedb": ^4.3.4 + "@lumino/commands": ^2.3.1 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/signaling": ^2.1.3 + "@rjsf/utils": ^5.13.4 + ajv: ^8.12.0 + json5: ^2.2.3 + peerDependencies: + react: ">=16" + checksum: e6e89174535d10268d70f9c5731bbb1ee6614d8cf87a73d5c4c3b40e6d051ecebb03ec23c508132fe3714473a0667b337674db07759d487b2fb679ca99fd8f35 + languageName: node + linkType: hard + +"@jupyterlab/statedb@npm:^4.3.4": + version: 4.3.4 + resolution: "@jupyterlab/statedb@npm:4.3.4" + dependencies: + "@lumino/commands": ^2.3.1 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/properties": ^2.0.2 + "@lumino/signaling": ^2.1.3 + checksum: dfb6e3904ca8898bf69d188448559b7356fdac8e579f8214779be7ba709db82372dc2836f245ff3f9c3ff8e382fa82abd354613e5cd89c60348b3d4f7597bf1c + languageName: node + linkType: hard + +"@lumino/algorithm@npm:^1.9.2": + version: 1.9.2 + resolution: "@lumino/algorithm@npm:1.9.2" + checksum: a89e7c63504236119634858e271db1cc649684d30ced5a6ebe2788af7c0837f1e05a6fd3047d8525eb756c42ce137f76b3688f75fd3ef915b71cd4f213dfbb96 + languageName: node + linkType: hard + +"@lumino/algorithm@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/algorithm@npm:2.0.2" + checksum: 34b25684b845f1bdbf78ca45ebd99a97b67b2992440c9643aafe5fc5a99fae1ddafa9e5890b246b233dc3a12d9f66aa84afe4a2aac44cf31071348ed217740db + languageName: node + linkType: hard + +"@lumino/application@npm:^2.3.0, @lumino/application@npm:^2.4.1": + version: 2.4.1 + resolution: "@lumino/application@npm:2.4.1" + dependencies: + "@lumino/commands": ^2.3.1 + "@lumino/coreutils": ^2.2.0 + "@lumino/widgets": ^2.5.0 + checksum: b7166d1bf4f0e3cc945d984b4057a4cd106d38df6cb4c6f1259c75484e2b976018aca55f169fa4af7dd174ce7117be1920966bef0fb7cba756f503f0df1d211e + languageName: node + linkType: hard + +"@lumino/collections@npm:^1.9.3": + version: 1.9.3 + resolution: "@lumino/collections@npm:1.9.3" + dependencies: + "@lumino/algorithm": ^1.9.2 + checksum: 1c87a12743eddd6f6b593e47945a5645e2f99ad61c5192499b0745e48ee9aff263c7145541e77dfeea4c9f50bdd017fddfa47bfc60e718de4f28533ce45bf8c3 + languageName: node + linkType: hard + +"@lumino/collections@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/collections@npm:2.0.2" + dependencies: + "@lumino/algorithm": ^2.0.2 + checksum: e8bb2068a3741940e0dd396fa729c3c9d12458b41b7c2a9d171c5c034e69fb5834116a824094a8aa4182397e13abace06025ed5032a755ea85b976eae74ee9a9 + languageName: node + linkType: hard + +"@lumino/commands@npm:^2.3.1": + version: 2.3.1 + resolution: "@lumino/commands@npm:2.3.1" + dependencies: + "@lumino/algorithm": ^2.0.2 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/domutils": ^2.0.2 + "@lumino/keyboard": ^2.0.2 + "@lumino/signaling": ^2.1.3 + "@lumino/virtualdom": ^2.0.2 + checksum: 83bc6d66de37e58582b00f70ce66e797c9fcf84e36041c6881631ed0d281305e2a49927f5b2fe6c5c965733f3cd6fb4a233c7b7967fc050497024a941659bd65 + languageName: node + linkType: hard + +"@lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.1 || ^2, @lumino/coreutils@npm:^1.11.1 || ^2.1, @lumino/coreutils@npm:^2.2.0": + version: 2.2.0 + resolution: "@lumino/coreutils@npm:2.2.0" + dependencies: + "@lumino/algorithm": ^2.0.2 + checksum: 345fcd5d7493d745831dd944edfbd8eda06cc59a117e71023fc97ce53badd697be2bd51671f071f5ff0064f75f104575d9695f116a07517bafbedd38e5c7a785 + languageName: node + linkType: hard + +"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^2.1.3": + version: 2.1.3 + resolution: "@lumino/disposable@npm:2.1.3" + dependencies: + "@lumino/signaling": ^2.1.3 + checksum: b9a346fa2752b3cd1b053cb637ee173501d33082a73423429070e8acc508b034ea0babdae0549b923cbdd287ee1fc7f6159f0539c9fff7574393a214eef07c57 + languageName: node + linkType: hard + +"@lumino/domutils@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/domutils@npm:2.0.2" + checksum: 037b8d0b62af43887fd7edd506fa551e2af104a4b46d62e6fef256e16754dba40d351513beb5083834d468b2c7806aae0fe205fd6aac8ef24759451ee998bbd9 + languageName: node + linkType: hard + +"@lumino/dragdrop@npm:^2.1.5": + version: 2.1.5 + resolution: "@lumino/dragdrop@npm:2.1.5" + dependencies: + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + checksum: 48e34bea73186dcde4565fa68cd25067b7f5fe910813d28da9ab3c5392bfaa0b26aab1290635dc953d85bbb139da7ac1ffc040a5d5777d58fd087975dd4b5ef7 + languageName: node + linkType: hard + +"@lumino/keyboard@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/keyboard@npm:2.0.2" + checksum: 198e8c17825c9a831fa0770f58a71574b936acb0f0bbbe7f8feb73d89686dda7ff41fcb02d12b401f5d462b45fe0bba24f7f38befb7cefe0826576559f0bee6d + languageName: node + linkType: hard + +"@lumino/messaging@npm:^1.10.1 || ^2.1": + version: 1.10.3 + resolution: "@lumino/messaging@npm:1.10.3" + dependencies: + "@lumino/algorithm": ^1.9.2 + "@lumino/collections": ^1.9.3 + checksum: 1131e80379fa9b8a9b5d3418c90e25d4be48e2c92ec711518190772f9e8845a695bef45daddd06a129168cf6f158c8ad80ae86cb245f566e9195bbd9a0843b7a + languageName: node + linkType: hard + +"@lumino/messaging@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/messaging@npm:2.0.2" + dependencies: + "@lumino/algorithm": ^2.0.2 + "@lumino/collections": ^2.0.2 + checksum: 66abd8c473026123589dc22f2ce8f85da10e0b1a05c05ed9b2011035721da5f751cc7ef63b628877f446a78a4287e26ad1450efbeaf0c2e03b1d08be9abaca4d + languageName: node + linkType: hard + +"@lumino/polling@npm:^2.1.3": + version: 2.1.3 + resolution: "@lumino/polling@npm:2.1.3" + dependencies: + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/signaling": ^2.1.3 + checksum: 2c94dbc2339dd06b3b89a3a690d23576ce095f92bf1f614557dcaeb1c1a8a707b2a18d78c03e5fd7376a43e3f393cc4fec42a65580ae4b67c6630ea86cecbac6 + languageName: node + linkType: hard + +"@lumino/properties@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/properties@npm:2.0.2" + checksum: cbe802bd49ced7e13e50b1d89b82e0f03fb44a590c704e6b9343226498b21d8abfe119b024209e79876b4fc0938dbf85e964c6c4cd5bbdd4d7ba41ce0fb69f3f + languageName: node + linkType: hard + +"@lumino/signaling@npm:^1.10.0 || ^2.0.0, @lumino/signaling@npm:^2.1.3": + version: 2.1.3 + resolution: "@lumino/signaling@npm:2.1.3" + dependencies: + "@lumino/algorithm": ^2.0.2 + "@lumino/coreutils": ^2.2.0 + checksum: ce59383bd75fe30df5800e0442dbc4193cc6778e2530b9be0f484d159f1d8668be5c6ee92cee9df36d5a0c3dbd9126d0479a82581dee1df889d5c9f922d3328d + languageName: node + linkType: hard + +"@lumino/virtualdom@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/virtualdom@npm:2.0.2" + dependencies: + "@lumino/algorithm": ^2.0.2 + checksum: 0e1220d5b3b2441e7668f3542a6341e015bdbea0c8bd6d4be962009386c034336540732596d5dedcd54ca57fbde61c2942549129a3e1b0fccb1aa143685fcd15 + languageName: node + linkType: hard + +"@lumino/widgets@npm:^1.30.0 || ^2.1, @lumino/widgets@npm:^2.3.1, @lumino/widgets@npm:^2.5.0": + version: 2.5.0 + resolution: "@lumino/widgets@npm:2.5.0" + dependencies: + "@lumino/algorithm": ^2.0.2 + "@lumino/commands": ^2.3.1 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/domutils": ^2.0.2 + "@lumino/dragdrop": ^2.1.5 + "@lumino/keyboard": ^2.0.2 + "@lumino/messaging": ^2.0.2 + "@lumino/properties": ^2.0.2 + "@lumino/signaling": ^2.1.3 + "@lumino/virtualdom": ^2.0.2 + checksum: c5055e42b0b7d5d9a0c29d14c7053478cbdef057525e262ccd59c987971364d5462ed1a59d5008b889cf5ecc6810e90c681364239500b9c8ee0ae4624d60df84 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.3 + checksum: e8fc25d536250ed3e669813b36e8c6d805628b472353c57afd8c4fde0fcfcf3dda4ffe22f7af8c9070812ec2e7a03fb41d7151547cef3508efe661a5a3add20f + languageName: node + linkType: hard + +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: ^7.3.5 + checksum: 68951c589e9a4328698a35fd82fe71909a257d6f2ede0434d236fa55634f0fbcad9bb8755553ce5849bd25ee6f019f4d435921ac715c853582c4a7f5983c8d4a + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + languageName: node + linkType: hard + +"@pkgr/core@npm:^0.1.0": + version: 0.1.1 + resolution: "@pkgr/core@npm:0.1.1" + checksum: 6f25fd2e3008f259c77207ac9915b02f1628420403b2630c92a07ff963129238c9262afc9e84344c7a23b5cc1f3965e2cd17e3798219f5fd78a63d144d3cceba + languageName: node + linkType: hard + +"@rjsf/utils@npm:^5.13.4": + version: 5.23.2 + resolution: "@rjsf/utils@npm:5.23.2" + dependencies: + json-schema-merge-allof: ^0.8.1 + jsonpointer: ^5.0.1 + lodash: ^4.17.21 + lodash-es: ^4.17.21 + react-is: ^18.2.0 + peerDependencies: + react: ^16.14.0 || >=17 + checksum: 16980013258bab7accaff961c533e4bb8e3326c37a84670a7667b2a10c1ca395451eb51a6cf819ccbafb1aa8838df325ff1f314b410bb186fef98856135e1a06 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 00bd7362a3439021aa1ea51b0e0d0a0e8ca1351a3d54c606b115fdcc49b51b16db6e5f43b4fe7a28c38688523e22a94d49dd31168868b655f0d4d50f032d07a1 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" + dependencies: + type-detect: 4.0.8 + checksum: a7c3e7cc612352f4004873747d9d8b2d4d90b13a6d483f685598c945a70e734e255f1ca5dc49702515533c403b32725defff148177453b3f3915bcb60e9d4601 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": ^3.0.0 + checksum: 614d30cb4d5201550c940945d44c9e0b6d64a888ff2cd5b357f95ad6721070d6b8839cd10e15b76bf5e14af0bcc1d8f9ec00d49a46318f1f669a4bec1d7f3148 + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": ^7.20.7 + "@babel/types": ^7.20.7 + "@types/babel__generator": "*" + "@types/babel__template": "*" + "@types/babel__traverse": "*" + checksum: a3226f7930b635ee7a5e72c8d51a357e799d19cbf9d445710fa39ab13804f79ab1a54b72ea7d8e504659c7dfc50675db974b526142c754398d7413aa4bc30845 + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": ^7.0.0 + checksum: 5b332ea336a2efffbdeedb92b6781949b73498606ddd4205462f7d96dafd45ff3618770b41de04c4881e333dd84388bfb8afbdf6f2764cbd98be550d85c6bb48 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + checksum: d7a02d2a9b67e822694d8e6a7ddb8f2b71a1d6962dfd266554d2513eefbb205b33ca71a0d163b1caea3981ccf849211f9964d8bd0727124d18ace45aa6c9ae29 + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" + dependencies: + "@babel/types": ^7.20.7 + checksum: 2bdc65eb62232c2d5c1086adeb0c31e7980e6fd7e50a3483b4a724a1a1029c84d9cb59749cf8de612f9afa2bc14c85b8f50e64e21f8a4398fa77eb9059a4283c + languageName: node + linkType: hard + +"@types/backbone@npm:1.4.14": + version: 1.4.14 + resolution: "@types/backbone@npm:1.4.14" + dependencies: + "@types/jquery": "*" + "@types/underscore": "*" + checksum: 4f44bfb71d75332b5de610be7687f4ae523ad4ef02da844a828403b534b6a94a6288b32cab64371d0ad526e35cfed511652ac53af22d0b9caaac3f4cfb4375dd + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "*" + "@types/estree": "*" + checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" + dependencies: + "@types/estree": "*" + "@types/json-schema": "*" + checksum: c286e79707ab604b577cf8ce51d9bbb9780e3d6a68b38a83febe13fa05b8012c92de17c28532fac2b03d3c460123f5055d603a579685325246ca1c86828223e0 + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" + dependencies: + "@types/node": "*" + checksum: 79d746a8f053954bba36bd3d94a90c78de995d126289d656fb3271dd9f1229d33f678da04d10bce6be440494a5a73438e2e363e92802d16b8315b051036c5256 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "*" + checksum: b91e9b60f865ff08cb35667a427b70f6c2c63e88105eadd29a112582942af47ed99c60610180aa8dcc22382fa405033f141c119c69b95db78c4c709fbadfeeb4 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "*" + checksum: 93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 + languageName: node + linkType: hard + +"@types/jest@npm:^29.5.11": + version: 29.5.14 + resolution: "@types/jest@npm:29.5.14" + dependencies: + expect: ^29.0.0 + pretty-format: ^29.0.0 + checksum: 18dba4623f26661641d757c63da2db45e9524c9be96a29ef713c703a9a53792df9ecee9f7365a0858ddbd6440d98fe6b65ca67895ca5884b73cbc7ffc11f3838 + languageName: node + linkType: hard + +"@types/jquery@npm:*": + version: 3.5.32 + resolution: "@types/jquery@npm:3.5.32" + dependencies: + "@types/sizzle": "*" + checksum: 7fe7251bda3fc9d80417ef7c88ad963ccb591706bca2fb84ea5d9600498a8f9911c32302f28fd1910bb212c34193f38f63818757a9833b70e1f46c3a98a17625 + languageName: node + linkType: hard + +"@types/jsdom@npm:^20.0.0": + version: 20.0.1 + resolution: "@types/jsdom@npm:20.0.1" + dependencies: + "@types/node": "*" + "@types/tough-cookie": "*" + parse5: ^7.0.0 + checksum: d55402c5256ef451f93a6e3d3881f98339fe73a5ac2030588df056d6835df8367b5a857b48d27528289057e26dcdd3f502edc00cb877c79174cb3a4c7f2198c1 + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 + languageName: node + linkType: hard + +"@types/lodash@npm:^4.14.134": + version: 4.17.13 + resolution: "@types/lodash@npm:4.17.13" + checksum: d0bf8fbd950be71946e0076b30fd40d492293baea75f05931b6b5b906fd62583708c6229abdb95b30205ad24ce1ed2f48bc9d419364f682320edd03405cc0c7e + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 22.10.2 + resolution: "@types/node@npm:22.10.2" + dependencies: + undici-types: ~6.20.0 + checksum: b22401e6e7d1484e437d802c72f5560e18100b1257b9ad0574d6fe05bebe4dbcb620ea68627d1f1406775070d29ace8b6b51f57e7b1c7b8bafafe6da7f29c843 + languageName: node + linkType: hard + +"@types/semver@npm:^7.5.0": + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 + languageName: node + linkType: hard + +"@types/sizzle@npm:*": + version: 2.3.9 + resolution: "@types/sizzle@npm:2.3.9" + checksum: 413811a79e7e9f1d8f47e6047ae0aea1530449d612304cdda1c30018e3d053b8544861ec2c70bdeca75a0a010192e6bb78efc6fb4caaafdd65c4eee90066686a + languageName: node + linkType: hard + +"@types/source-list-map@npm:*": + version: 0.1.6 + resolution: "@types/source-list-map@npm:0.1.6" + checksum: 9cd294c121f1562062de5d241fe4d10780b1131b01c57434845fe50968e9dcf67ede444591c2b1ad6d3f9b6bc646ac02cc8f51a3577c795f9c64cf4573dcc6b1 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 72576cc1522090fe497337c2b99d9838e320659ac57fa5560fcbdcbafcf5d0216c6b3a0a8a4ee4fdb3b1f5e3420aa4f6223ab57b82fef3578bec3206425c6cf5 + languageName: node + linkType: hard + +"@types/tough-cookie@npm:*": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: f19409d0190b179331586365912920d192733112a195e870c7f18d20ac8adb7ad0b0ff69dad430dba8bc2be09593453a719cfea92dc3bda19748fd158fe1498d + languageName: node + linkType: hard + +"@types/underscore@npm:*": + version: 1.13.0 + resolution: "@types/underscore@npm:1.13.0" + checksum: 1411cbeb1b743629d504fcb2037b393d11eb207459b9d560f71304183115e30ba145f83b819ffcc8a0d5d4eccfb76bebb0ef7aab8f96a04d88d99ff9dfe503c6 + languageName: node + linkType: hard + +"@types/webpack-env@npm:^1.18.4": + version: 1.18.5 + resolution: "@types/webpack-env@npm:1.18.5" + checksum: 4ca8eb4c44e1e1807c3e245442fce7aaf2816a163056de9436bbac44cc47c8bc5b1c9a330dc05748d6616431b1fb5bd5379733fb1da0b78d03c59f4ec824c184 + languageName: node + linkType: hard + +"@types/webpack-sources@npm:^0.1.5": + version: 0.1.12 + resolution: "@types/webpack-sources@npm:0.1.12" + dependencies: + "@types/node": "*" + "@types/source-list-map": "*" + source-map: ^0.6.1 + checksum: 75342659a9889478969f7bb7360b998aa084ba11ab523c172ded6a807dac43ab2a9e1212078ef8bbf0f33e4fadd2c8a91b75d38184d8030d96a32fe819c9bb57 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: ef236c27f9432983e91432d974243e6c4cdae227cb673740320eff32d04d853eed59c92ca6f1142a335cfdc0e17cccafa62e95886a8154ca8891cc2dec4ee6fc + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" + dependencies: + "@types/yargs-parser": "*" + checksum: ee013f257472ab643cb0584cf3e1ff9b0c44bca1c9ba662395300a7f1a6c55fa9d41bd40ddff42d99f5d95febb3907c9ff600fbcb92dadbec22c6a76de7e1236 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.19.1": + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/type-utils": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.19.1": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" + dependencies: + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" + dependencies: + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + minimatch: 9.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + eslint-visitor-keys: ^3.4.1 + checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.1 + resolution: "@ungap/structured-clone@npm:1.2.1" + checksum: 1e3b9fef293118861f0b2159b3695fc7f3793c0707095888ebb3ac7183f78c390e68f04cd4b4cf9ac979ae0da454505e08b3aae887cdd639609a3fe529e19e59 + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" + dependencies: + "@webassemblyjs/helper-numbers": 1.13.2 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + checksum: f9154ad9ea14f6f2374ebe918c221fd69a4d4514126a1acc6fa4966e8d27ab28cb550a5e6880032cf620e19640578658a7e5a55bd2aad1e3db4e9d598b8f2099 + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: e866ec8433f4a70baa511df5e8f2ebcd6c24f4e2cc6274c7c5aabe2bcce3459ea4680e0f35d450e1f3602acf3913b6b8e4f15069c8cfd34ae8609fb9a7d01795 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 48b5df7fd3095bb252f59a139fe2cbd999a62ac9b488123e9a0da3906ad8a2f2da7b2eb21d328c01a90da987380928706395c2897d1f3ed9e2125b6d75a920d0 + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: b611e981dfd6a797c3d8fc3a772de29a6e55033737c2c09c31bb66c613bdbb2d25f915df1dee62a602c6acc057ca71128432fa8c3e22a893e1219dc454f14ede + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" + dependencies: + "@webassemblyjs/floating-point-hex-parser": 1.13.2 + "@webassemblyjs/helper-api-error": 1.13.2 + "@xtuc/long": 4.2.2 + checksum: 49e2c9bf9b66997e480f6b44d80f895b3cde4de52ac135921d28e144565edca6903a519f627f4089b5509de1d7f9e5023f0e1a94ff78a36c9e2eb30e7c18ffd2 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: 8e059e1c1f0294f4fc3df8e4eaff3c5ef6e2e1358f34ebc118eaf5070ed59e56ed7fc92b28be734ebde17c8d662d5d27e06ade686c282445135da083ae11c128 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/wasm-gen": 1.14.1 + checksum: 0a08d454a63192cd66abf91b6f060ac4b466cef341262246e9dcc828dd4c8536195dea9b46a1244b1eac65b59b8b502164a771a190052a92ff0a0a2ded0f8f53 + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" + dependencies: + "@xtuc/ieee754": ^1.2.0 + checksum: d7e3520baa37a7309fa7db4d73d69fb869878853b1ebd4b168821bd03fcc4c0e1669c06231315b0039035d9a7a462e53de3ad982da4a426a4b0743b5888e8673 + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" + dependencies: + "@xtuc/long": 4.2.2 + checksum: 64083507f7cff477a6d71a9e325d95665cea78ec8df99ca7c050e1cfbe300fbcf0842ca3dcf3b4fa55028350135588a4f879398d3dd2b6a8de9913ce7faf5333 + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: 95ec6052f30eefa8d50c9b2a3394d08b17d53a4aa52821451d41d774c126fa8f39b988fbf5bff56da86852a87c16d676e576775a4071e5e5ccf020cc85a4b281 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/helper-wasm-section": 1.14.1 + "@webassemblyjs/wasm-gen": 1.14.1 + "@webassemblyjs/wasm-opt": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 + "@webassemblyjs/wast-printer": 1.14.1 + checksum: 9341c3146bb1b7863f03d6050c2a66990f20384ca137388047bbe1feffacb599e94fca7b7c18287d17e2449ffb4005fdc7f41f674a6975af9ad8522756f8ffff + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/ieee754": 1.13.2 + "@webassemblyjs/leb128": 1.13.2 + "@webassemblyjs/utf8": 1.13.2 + checksum: 401b12bec7431c4fc29d9414bbe40d3c6dc5be04d25a116657c42329f5481f0129f3b5834c293f26f0e42681ceac9157bf078ce9bdb6a7f78037c650373f98b2 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/wasm-gen": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 + checksum: 60c697a9e9129d8d23573856df0791ba33cea4a3bc2339044cae73128c0983802e5e50a42157b990eeafe1237eb8e7653db6de5f02b54a0ae7b81b02dcdf2ae9 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-api-error": 1.13.2 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/ieee754": 1.13.2 + "@webassemblyjs/leb128": 1.13.2 + "@webassemblyjs/utf8": 1.13.2 + checksum: 93f1fe2676da465b4e824419d9812a3d7218de4c3addd4e916c04bc86055fa134416c1b67e4b7cbde8d728c0dce2721d06cc0bfe7a7db7c093a0898009937405 + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" + dependencies: + "@webassemblyjs/ast": 1.14.1 + "@xtuc/long": 4.2.2 + checksum: 517881a0554debe6945de719d100b2d8883a2d24ddf47552cdeda866341e2bb153cd824a864bc7e2a61190a4b66b18f9899907e0074e9e820d2912ac0789ea60 + languageName: node + linkType: hard + +"@webpack-cli/configtest@npm:^2.1.1": + version: 2.1.1 + resolution: "@webpack-cli/configtest@npm:2.1.1" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 9f9f9145c2d05471fc83d426db1df85cf49f329836b0c4b9f46b6948bed4b013464c00622b136d2a0a26993ce2306976682592245b08ee717500b1db45009a72 + languageName: node + linkType: hard + +"@webpack-cli/info@npm:^2.0.2": + version: 2.0.2 + resolution: "@webpack-cli/info@npm:2.0.2" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 8f9a178afca5c82e113aed1efa552d64ee5ae4fdff63fe747c096a981ec74f18a5d07bd6e89bbe6715c3e57d96eea024a410e58977169489fe1df044c10dd94e + languageName: node + linkType: hard + +"@webpack-cli/serve@npm:^2.0.5": + version: 2.0.5 + resolution: "@webpack-cli/serve@npm:2.0.5" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: 75f0e54681796d567a71ac3e2781d2901a8d8cf1cdfc82f261034dddac59a8343e8c3bc5e32b4bb9d6766759ba49fb29a5cd86ef1701d79c506fe886bb63ac75 + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec + languageName: node + linkType: hard + +"abab@npm:^2.0.3, abab@npm:^2.0.6": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 + languageName: node + linkType: hard + +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: ^8.1.0 + acorn-walk: ^8.0.2 + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.0.2": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: ^8.11.0 + checksum: 4ff03f42323e7cf90f1683e08606b0f460e1e6ac263d2730e3df91c7665b6f64e696db6ea27ee4bed18c2599569be61f28a8399fa170c611161a348c402ca19c + languageName: node + linkType: hard + +"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.14.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4 + languageName: node + linkType: hard + +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 87bb7ee54f5ecf0ccbfcba0b07473885c43ecd76cb29a8db17d6137a19d9f9cd443a2a7c5fd8a3f24d58ad8145f9eb49116344a66b107e1aeab82cf2383f4753 + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 + languageName: node + linkType: hard + +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: ^3.1.3 + peerDependencies: + ajv: ^8.8.2 + checksum: c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4, ajv@npm:^6.12.5": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.12.0, ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: ^3.1.3 + fast-uri: ^3.0.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + checksum: 1797bf242cfffbaf3b870d13565bd1716b73f214bb7ada9a497063aada210200da36e3ed40237285f3255acc4feeae91b1fb183625331bad27da95973f7253d9 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: ^0.21.3 + checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.5 + is-array-buffer: ^3.0.4 + checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: ^1.0.1 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + is-array-buffer: ^3.0.4 + checksum: b1d1fd20be4e972a3779b1569226f6740170dca10f07aa4421d42cefeec61391e79c557cda8e771f5baefe47d878178cd4438f60916ce831813c08132bced765 + languageName: node + linkType: hard + +"async@npm:^3.2.3": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: ee6eb8cd8a0ab1b58bd2a3ed6c415e93e773573a91d31df9d5ef559baafa9dab37d3b096fa7993e84585cac3697b2af6ddb9086f45d3ac8cae821bb2aab65682 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 + languageName: node + linkType: hard + +"babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" + dependencies: + "@jest/transform": ^29.7.0 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^29.6.3 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: ee6f8e0495afee07cac5e4ee167be705c711a8cc8a737e05a587a131fdae2b3c8f9aa55dfd4d9c03009ac2d27f2de63d8ba96d3e8460da4d00e8af19ef9a83f7 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": ^7.0.0 + "@istanbuljs/load-nyc-config": ^1.0.0 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-instrument: ^5.0.4 + test-exclude: ^6.0.0 + checksum: cb4fd95738219f232f0aece1116628cccff16db891713c4ccb501cddbbf9272951a5df81f2f2658dfdf4b3e7b236a9d5cbcf04d5d8c07dd5077297339598061a + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 51250f22815a7318f17214a9d44650ba89551e6d4f47a2dc259128428324b52f5a73979d010cefd921fd5a720d8c1d55ad74ff601cd94c7bd44d5f6292fde2d1 + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.12 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.12" + dependencies: + "@babel/compat-data": ^7.22.6 + "@babel/helper-define-polyfill-provider": ^0.6.3 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 6e6e6a8b85fec80a310ded2f5c151385e4ac59118909dd6a952e1025e4a478eb79dda45a5a6322cc2e598fd696eb07d4e2fa52418b4101f3dc370bdf8c8939ba + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs3@npm:^0.10.6": + version: 0.10.6 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.6.2 + core-js-compat: ^3.38.0 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: f762f29f7acca576897c63149c850f0a72babd3fb9ea436a2e36f0c339161c4b912a77828541d8188ce8a91e50965c6687120cf36071eabb1b7aa92f279e2164 + languageName: node + linkType: hard + +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.3 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.3" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.6.3 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: d12696e6b3f280eb78fac551619ca4389262db62c7352cd54bf679d830df8b35596eef2de77cf00db6648eada1c99d49c4f40636dbc9c335a1e5420cfef96750 + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.1.0 + resolution: "babel-preset-current-node-syntax@npm:1.1.0" + dependencies: + "@babel/plugin-syntax-async-generators": ^7.8.4 + "@babel/plugin-syntax-bigint": ^7.8.3 + "@babel/plugin-syntax-class-properties": ^7.12.13 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + "@babel/plugin-syntax-import-attributes": ^7.24.7 + "@babel/plugin-syntax-import-meta": ^7.10.4 + "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + "@babel/plugin-syntax-top-level-await": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 9f93fac975eaba296c436feeca1031ca0539143c4066eaf5d1ba23525a31850f03b651a1049caea7287df837a409588c8252c15627ad3903f17864c8e25ed64b + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" + dependencies: + babel-plugin-jest-hoist: ^29.6.3 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb + languageName: node + linkType: hard + +"backbone@npm:1.4.0": + version: 1.4.0 + resolution: "backbone@npm:1.4.0" + dependencies: + underscore: ">=1.8.3" + checksum: 09abdf184c485a4cd2c68218298cf772fbefeaa166ef8eb795cdb0159b4ad1d2f6823dde089352eaf0be929e5bbef67c57555722f4d1886f969d954f77814870 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"base64-js@npm:^1.2.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 + languageName: node + linkType: hard + +"browserslist@npm:^4.24.0, browserslist@npm:^4.24.2": + version: 4.24.3 + resolution: "browserslist@npm:4.24.3" + dependencies: + caniuse-lite: ^1.0.30001688 + electron-to-chromium: ^1.5.73 + node-releases: ^2.0.19 + update-browserslist-db: ^1.1.1 + bin: + browserslist: cli.js + checksum: 016efc9953350e3a7212edcfdd72210cb33b339c1a974a77c0715eb67d23d7e5cd0a073ce1c801ab09235d8c213425ca51b92d41bbb829b833872b45f885fe7c + languageName: node + linkType: hard + +"bs-logger@npm:^0.2.6": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: 2.x + checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: ^0.4.0 + checksum: 9ba4dc58ce86300c862bffc3ae91f00b2a03b01ee07f3564beeeaf82aa243b8b03ba53f123b0b842c190d4399b94697970c8e7cf7b1ea44b61aa28c3526a4449 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": ^4.0.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^10.0.1 + minipass: ^7.0.3 + minipass-collect: ^2.0.1 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^7.0.2 + ssri: ^12.0.0 + tar: ^7.4.3 + unique-filename: ^4.0.0 + checksum: e95684717de6881b4cdaa949fa7574e3171946421cd8291769dd3d2417dbf7abf4aa557d1f968cca83dcbc95bed2a281072b09abfc977c942413146ef7ed4525 + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": + version: 1.0.1 + resolution: "call-bind-apply-helpers@npm:1.0.1" + dependencies: + es-errors: ^1.3.0 + function-bind: ^1.1.2 + checksum: 3c55343261bb387c58a4762d15ad9d42053659a62681ec5eb50690c6b52a4a666302a01d557133ce6533e8bd04530ee3b209f23dd06c9577a1925556f8fcccdf + languageName: node + linkType: hard + +"call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: ^1.0.0 + es-define-property: ^1.0.0 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.2 + checksum: aa2899bce917a5392fd73bd32e71799c37c0b7ab454e0ed13af7f6727549091182aade8bbb7b55f304a5bc436d543241c14090fb8a3137e9875e23f444f4f5a9 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": + version: 1.0.3 + resolution: "call-bound@npm:1.0.3" + dependencies: + call-bind-apply-helpers: ^1.0.1 + get-intrinsic: ^1.2.6 + checksum: a93bbe0f2d0a2d6c144a4349ccd0593d5d0d5d9309b69101710644af8964286420062f2cc3114dca120b9bc8cc07507952d4b1b3ea7672e0d7f6f1675efedb32 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001689 + resolution: "caniuse-lite@npm:1.0.30001689" + checksum: 8d4152076517ac1dfd6d6733ecc8055f3cd3a8b679af8f5858e731312f03967f6a2184553636696e44cee39abdd9ccccc914716235791b0c25f68ef8dea4e24a + languageName: node + linkType: hard + +"chalk@npm:^2.3.0, chalk@npm:^2.4.1": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: fd73a4bab48b79e66903fe1cafbdc208956f41ea4f856df883d0c7277b7ab29fd33ee65f93b2ec9192fc0169238f2f8307b7735d27c155821d886b84aa97aa8d + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.4 + resolution: "chrome-trace-event@npm:1.0.4" + checksum: fcbbd9dd0cd5b48444319007cc0c15870fd8612cc0df320908aa9d5e8a244084d48571eb28bf3c58c19327d2c5838f354c2d89fac3956d8e992273437401ac19 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 2556807a99aec1f9daac60741af96cd613a707f343174ae7967da46402c91dced411bf830d209f2e93be4cecea46fc75cecf1f17c799d7d8a9e1dd6204bfcd22 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: ^2.0.4 + kind-of: ^6.0.2 + shallow-clone: ^3.0.0 + checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.2 + resolution: "collect-v8-coverage@npm:1.0.2" + checksum: c10f41c39ab84629d16f9f6137bc8a63d332244383fc368caf2d2052b5e04c20cd1fd70f66fcf4e2422b84c8226598b776d39d5f2d2a51867cc1ed5d1982b4da + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"colorette@npm:^2.0.14": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + +"commander@npm:^10.0.1": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + languageName: node + linkType: hard + +"commander@npm:^9.4.1": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + languageName: node + linkType: hard + +"compute-gcd@npm:^1.2.1": + version: 1.2.1 + resolution: "compute-gcd@npm:1.2.1" + dependencies: + validate.io-array: ^1.0.3 + validate.io-function: ^1.0.2 + validate.io-integer-array: ^1.0.0 + checksum: 51cf33b75f7c8db5142fcb99a9d84a40260993fed8e02a7ab443834186c3ab99b3fd20b30ad9075a6a9d959d69df6da74dd3be8a59c78d9f2fe780ebda8242e1 + languageName: node + linkType: hard + +"compute-lcm@npm:^1.1.2": + version: 1.1.2 + resolution: "compute-lcm@npm:1.1.2" + dependencies: + compute-gcd: ^1.2.1 + validate.io-array: ^1.0.3 + validate.io-function: ^1.0.2 + validate.io-integer-array: ^1.0.0 + checksum: d499ab57dcb48e8d0fd233b99844a06d1cc56115602c920c586e998ebba60293731f5b6976e8a1e83ae6cbfe86716f62d9432e8d94913fed8bd8352f447dc917 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 + languageName: node + linkType: hard + +"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1": + version: 3.39.0 + resolution: "core-js-compat@npm:3.39.0" + dependencies: + browserslist: ^4.24.2 + checksum: 2d7d087c3271d711d03a55203d4756f6288317a1ce35cdc8bafaf1833ef21fd67a92a50cff8dcf7df1325ac63720906ab3cf514c85b238c95f65fca1040f6ad6 + languageName: node + linkType: hard + +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-config: ^29.7.0 + jest-util: ^29.7.0 + prompts: ^2.0.1 + bin: + create-jest: bin/create-jest.js + checksum: 1427d49458adcd88547ef6fa39041e1fe9033a661293aa8d2c3aa1b4967cb5bf4f0c00436c7a61816558f28ba2ba81a94d5c962e8022ea9a883978fc8e1f2945 + languageName: node + linkType: hard + +"cross-spawn@npm:^6.0.5": + version: 6.0.6 + resolution: "cross-spawn@npm:6.0.6" + dependencies: + nice-try: ^1.0.4 + path-key: ^2.0.1 + semver: ^5.5.0 + shebang-command: ^1.2.0 + which: ^1.2.9 + checksum: a6e2e5b04a0e0f806c1df45f92cd079b65f95fbe5a7650ee1ab60318c33a6c156a8a2f8b6898f57764f7363ec599a0625e9855dfa78d52d2d73dbd32eb11c25e + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b + languageName: node + linkType: hard + +"css-loader@npm:^6.7.1, css-loader@npm:^6.9.1": + version: 6.11.0 + resolution: "css-loader@npm:6.11.0" + dependencies: + icss-utils: ^5.1.0 + postcss: ^8.4.33 + postcss-modules-extract-imports: ^3.1.0 + postcss-modules-local-by-default: ^4.0.5 + postcss-modules-scope: ^3.2.0 + postcss-modules-values: ^4.0.0 + postcss-value-parser: ^4.2.0 + semver: ^7.5.4 + peerDependencies: + "@rspack/core": 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 5c8d35975a7121334905394e88e28f05df72f037dbed2fb8fec4be5f0b313ae73a13894ba791867d4a4190c35896da84a7fd0c54fb426db55d85ba5e714edbe3 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 + languageName: node + linkType: hard + +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: 823471aa30091c59e0a305927c30e7768939b6af70405808f8d2ce1ca778cddcb24722717392438329d1691f9a87cb0183b64b8d779b56a961546d54854fde01 + languageName: node + linkType: hard + +"cssom@npm:~0.3.6": + version: 0.3.8 + resolution: "cssom@npm:0.3.8" + checksum: 24beb3087c76c0d52dd458be9ee1fbc80ac771478a9baef35dd258cdeb527c68eb43204dd439692bb2b1ae5272fa5f2946d10946edab0d04f1078f85e06bc7f6 + languageName: node + linkType: hard + +"cssstyle@npm:^2.3.0": + version: 2.3.0 + resolution: "cssstyle@npm:2.3.0" + dependencies: + cssom: ~0.3.6 + checksum: 5f05e6fd2e3df0b44695c2f08b9ef38b011862b274e320665176467c0725e44a53e341bc4959a41176e83b66064ab786262e7380fd1cabeae6efee0d255bb4e3 + languageName: node + linkType: hard + +"data-urls@npm:^2.0.0": + version: 2.0.0 + resolution: "data-urls@npm:2.0.0" + dependencies: + abab: ^2.0.3 + whatwg-mimetype: ^2.3.0 + whatwg-url: ^8.0.0 + checksum: 97caf828aac25e25e04ba6869db0f99c75e6859bb5b424ada28d3e7841941ebf08ddff3c1b1bb4585986bd507a5d54c2a716853ea6cb98af877400e637393e71 + languageName: node + linkType: hard + +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: ^2.0.6 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "data-view-byte-offset@npm:1.0.0" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: fb42df878dd0e22816fc56e1fdca9da73caa85212fbe40c868b1295a6878f9101ae684f4eeef516c13acfc700f5ea07f1136954f43d4cd2d477a811144136479 + languageName: node + linkType: hard + +"decimal.js@npm:^10.4.2": + version: 10.4.3 + resolution: "decimal.js@npm:10.4.3" + checksum: 796404dcfa9d1dbfdc48870229d57f788b48c21c603c3f6554a1c17c10195fc1024de338b0cf9e1efe0c7c167eeb18f04548979bcc5fdfabebb7cc0ae3287bae + languageName: node + linkType: hard + +"dedent@npm:^1.0.0": + version: 1.5.3 + resolution: "dedent@npm:1.5.3" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 045b595557b2a8ea2eb9b0b4623d764e9a87326486fe2b61191b4342ed93dc01245644d8a09f3108a50c0ee7965f1eedd92e4a3a503ed89ea8e810566ea27f9a + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + +"define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: ^1.0.1 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 + languageName: node + linkType: hard + +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: f4914158e1f2276343d98ff5b31fc004e7304f5470bf0f1adb2ac6955d85a531a6458d33e87667f98f6ae52ebd3891bb47d420bb48a5bd8b7a27ee25b20e33aa + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: ^2.3.0 + domhandler: ^5.0.2 + entities: ^4.2.0 + checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 + languageName: node + linkType: hard + +"domelementtype@npm:^2.3.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 + languageName: node + linkType: hard + +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: ^7.0.0 + checksum: ddbc1268edf33a8ba02ccc596735ede80375ee0cf124b30d2f05df5b464ba78ef4f49889b6391df4a04954e63d42d5631c7fcf8b1c4f12bc531252977a5f13d5 + languageName: node + linkType: hard + +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" + dependencies: + domelementtype: ^2.3.0 + checksum: 0f58f4a6af63e6f3a4320aa446d28b5790a009018707bce2859dcb1d21144c7876482b5188395a188dfa974238c019e0a1e610d2fc269a12b2c192ea2b0b131c + languageName: node + linkType: hard + +"domutils@npm:^3.0.1": + version: 3.1.0 + resolution: "domutils@npm:3.1.0" + dependencies: + dom-serializer: ^2.0.0 + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + checksum: e5757456ddd173caa411cfc02c2bb64133c65546d2c4081381a3bafc8a57411a41eed70494551aa58030be9e58574fcc489828bebd673863d39924fb4878f416 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: ^1.0.1 + es-errors: ^1.3.0 + gopd: ^1.2.0 + checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 + languageName: node + linkType: hard + +"duplicate-package-checker-webpack-plugin@npm:^3.0.0": + version: 3.0.0 + resolution: "duplicate-package-checker-webpack-plugin@npm:3.0.0" + dependencies: + chalk: ^2.3.0 + find-root: ^1.0.0 + lodash: ^4.17.4 + semver: ^5.4.1 + checksum: d77be45cb72d79a429c64d8f8f7603fea681d182fb795459a3d4afa608faad9a923378a7e80c6855f465263e1983140b6fc3682bd0213228b8cd7906ab4b934d + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"ejs@npm:^3.1.10": + version: 3.1.10 + resolution: "ejs@npm:3.1.10" + dependencies: + jake: ^10.8.5 + bin: + ejs: bin/cli.js + checksum: ce90637e9c7538663ae023b8a7a380b2ef7cc4096de70be85abf5a3b9641912dde65353211d05e24d56b1f242d71185c6d00e02cb8860701d571786d92c71f05 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.73": + version: 1.5.74 + resolution: "electron-to-chromium@npm:1.5.74" + checksum: e93db5fdfafe927dcefe2ffef5b8670ae0c340eb8a4fe176918ec8efa53c37aff0ba4c3649c234950af2809d16a186ffead64dd921c9021d629658bf6d17c21f + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: ddaaa02542e1e9436c03970eeed445f4ed29a5337dfba0fe0c38dfdd2af5da2429c2a0821304e8a8d1cadf27fdd5b22ff793571fa803ae16852a6975c65e8e70 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.17.1": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: 4bc38cf1cea96456f97503db7280394177d1bc46f8f87c267297d04f795ac5efa81e48115a2f5b6273c781027b5b6bfc5f62b54df629e4d25fa7001a86624f59 + languageName: node + linkType: hard + +"entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"envinfo@npm:^7.7.3": + version: 7.14.0 + resolution: "envinfo@npm:7.14.0" + bin: + envinfo: dist/cli.js + checksum: 137c1dd9a4d5781c4a6cdc6b695454ba3c4ba1829f73927198aa4122f11b35b59d7b2cb7e1ceea1364925a30278897548511d22f860c14253a33797d0bebd551 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6": + version: 1.23.6 + resolution: "es-abstract@npm:1.23.6" + dependencies: + array-buffer-byte-length: ^1.0.1 + arraybuffer.prototype.slice: ^1.0.4 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + data-view-buffer: ^1.0.1 + data-view-byte-length: ^1.0.1 + data-view-byte-offset: ^1.0.0 + es-define-property: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-set-tostringtag: ^2.0.3 + es-to-primitive: ^1.3.0 + function.prototype.name: ^1.1.7 + get-intrinsic: ^1.2.6 + get-symbol-description: ^1.0.2 + globalthis: ^1.0.4 + gopd: ^1.2.0 + has-property-descriptors: ^1.0.2 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + internal-slot: ^1.1.0 + is-array-buffer: ^3.0.4 + is-callable: ^1.2.7 + is-data-view: ^1.0.2 + is-negative-zero: ^2.0.3 + is-regex: ^1.2.1 + is-shared-array-buffer: ^1.0.3 + is-string: ^1.1.1 + is-typed-array: ^1.1.13 + is-weakref: ^1.1.0 + math-intrinsics: ^1.0.0 + object-inspect: ^1.13.3 + object-keys: ^1.1.1 + object.assign: ^4.1.5 + regexp.prototype.flags: ^1.5.3 + safe-array-concat: ^1.1.3 + safe-regex-test: ^1.1.0 + string.prototype.trim: ^1.2.10 + string.prototype.trimend: ^1.0.9 + string.prototype.trimstart: ^1.0.8 + typed-array-buffer: ^1.0.2 + typed-array-byte-length: ^1.0.1 + typed-array-byte-offset: ^1.0.3 + typed-array-length: ^1.0.7 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.16 + checksum: bc1b5a78ca243a9abd00e30aa84d644957878980e8bad961c9362a58e7790b56f54e146fc1871b15eed406fcd495cf2296a8ffb261370878f36316b62a67bbb4 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.2.1": + version: 1.5.4 + resolution: "es-module-lexer@npm:1.5.4" + checksum: a0cf04fb92d052647ac7d818d1913b98d3d3d0f5b9d88f0eafb993436e4c3e2c958599db68839d57f2dfa281fdf0f60e18d448eb78fc292c33c0f25635b6854f + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" + dependencies: + get-intrinsic: ^1.2.4 + has-tostringtag: ^1.0.2 + hasown: ^2.0.1 + checksum: 7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: ^1.2.7 + is-date-object: ^1.0.5 + is-symbol: ^1.0.4 + checksum: 966965880356486cd4d1fe9a523deda2084c81b3702d951212c098f5f2ee93605d1b7c1840062efb48a07d892641c7ed1bc194db563645c0dd2b919cb6d65b93 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"escodegen@npm:^2.0.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: ^4.0.1 + estraverse: ^5.2.0 + esutils: ^2.0.2 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 096696407e161305cd05aebb95134ad176708bc5cb13d0dcc89a5fcbb959b8ed757e7f2591a5f8036f8f4952d4a724de0df14cd419e29212729fa6df5ce16bf6 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 9229b768c879f500ee54ca05925f31b0c0bafff3d9f5521f98ff05127356de78c81deb9365c86a5ec4efa990cb72b74df8612ae15965b14136044c73e1f6a907 + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^5.1.3": + version: 5.2.1 + resolution: "eslint-plugin-prettier@npm:5.2.1" + dependencies: + prettier-linter-helpers: ^1.0.0 + synckit: ^0.9.1 + peerDependencies: + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: "*" + prettier: ">=3.0.0" + peerDependenciesMeta: + "@types/eslint": + optional: true + eslint-config-prettier: + optional: true + checksum: 812f4d1596dcd3a55963212dfbd818a4b38f880741aac75f6869aa740dc5d934060674d3b85d10ff9fec424defa61967dbdef26b8a893a92c9b51880264ed0d9 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 + languageName: node + linkType: hard + +"eslint@npm:^8.56.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.4 + "@eslint/js": 8.57.1 + "@humanwhocodes/config-array": ^0.13.0 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + "@ungap/structured-clone": ^1.2.0 + ajv: ^6.12.4 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.2.2 + eslint-visitor-keys: ^3.4.3 + espree: ^9.6.1 + esquery: ^1.4.2 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + graphemer: ^1.4.0 + ignore: ^5.2.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.3 + strip-ansi: ^6.0.1 + text-table: ^0.2.0 + bin: + eslint: bin/eslint.js + checksum: e2489bb7f86dd2011967759a09164e65744ef7688c310bc990612fc26953f34cc391872807486b15c06833bdff737726a23e9b4cdba5de144c311377dc41d91b + languageName: node + linkType: hard + +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + +"esquery@npm:^1.4.2": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: ^5.1.0 + checksum: 08ec4fe446d9ab27186da274d979558557fbdbbd10968fa9758552482720c54152a5640e08b9009e5a30706b66aba510692054d4129d32d0e12e05bbc0b96fb2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.0 + human-signals: ^2.1.0 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.1 + onetime: ^5.1.2 + signal-exit: ^3.0.3 + strip-final-newline: ^2.0.0 + checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3 + languageName: node + linkType: hard + +"expect@npm:^29.0.0, expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": ^29.7.0 + jest-get-type: ^29.6.3 + jest-matcher-utils: ^29.7.0 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 + checksum: 9257f10288e149b81254a0fda8ffe8d54a7061cd61d7515779998b012579d2b8c22354b0eb901daf0145f347403da582f75f359f4810c007182ad3fb318b5c0c + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: d22d371b994fdc8cce9ff510d7b8dc4da70ac327bcba20df607dd5b9cae9f908f4d1028f5fe467650f058d1e7270235ae0b8230809a262b4df587a3b3aa216c3 + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: c52e6c86465f5c240e84a4485fb001088cc743d261a4b54b0050ce4758b1648bdbe53da1328ef9620149dca1435e3de64184f226d7c0a3656cb5837b3491e149 + languageName: node + linkType: hard + +"fastest-levenshtein@npm:^1.0.12": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: a78d44285c9e2ae2c25f3ef0f8a73f332c1247b7ea7fb4a191e6bb51aa6ee1ef0dfb3ed113616dcdc7023e18e35a8db41f61c8d88988e877cf510df8edafbc71 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: ^1.0.4 + checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: 2.1.1 + checksum: b15a124cef28916fe07b400eb87cbc73ca082c142abf7ca8e8de6af43eca79ca7bd13eb4d4d48240b3bd3136eaac40d16e42d6edf87a8e5d1dd8070626860c78 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"filelist@npm:^1.0.4": + version: 1.0.4 + resolution: "filelist@npm:1.0.4" + dependencies: + minimatch: ^5.0.1 + checksum: a303573b0821e17f2d5e9783688ab6fbfce5d52aaac842790ae85e704a6f5e4e3538660a63183d6453834dedf1e0f19a9dadcebfa3e926c72397694ea11f5160 + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 + languageName: node + linkType: hard + +"find-root@npm:^1.0.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: ^3.2.9 + keyv: ^4.5.3 + rimraf: ^3.0.2 + checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: ac3c159742e01d0e860a861164bcfd35bb567ccbebb8a0dd041e61cf3c64a435b917dd1e7ed1c380c2ebca85735fb16644485ec33665bc6aafc3b316aa1eed44 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: ^1.1.3 + checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 1989698488f725b05b26bc9afc8a08f08ec41807cd7b92ad85d96004ddf8243fd3e79486b8348c64a3011ae5cc2c9f0936af989e1f28339805d8bc178a75b451 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.1 + resolution: "form-data@npm:4.0.1" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: ccee458cd5baf234d6b57f349fe9cc5f9a2ea8fd1af5ecda501a18fd1572a6dd3bf08a49f00568afd995b6a65af34cb8dec083cf9d582c4e621836499498dd84 + languageName: node + linkType: hard + +"fs-extra@npm:^10.1.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + languageName: node + linkType: hard + +"fs-extra@npm:^11.2.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: b12e42fa40ba47104202f57b8480dd098aa931c2724565e5e70779ab87605665594e76ee5fb00545f772ab9ace167fe06d2ab009c416dc8c842c5ae6df7aa7e8 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: latest + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@^2.3.2#~builtin