From fdec01f09121f2583e33c0d4b013e610a6c51bbd Mon Sep 17 00:00:00 2001 From: Yonah Aviv Date: Thu, 8 Aug 2024 11:32:02 -0400 Subject: [PATCH 01/97] transfered changes of InteractionsView from repos branch to main repos branch, added Interactions View icon --- Eplant/config.ts | 2 + .../views/InteractionsViewer/GeneDialog.tsx | 77 ++ .../InteractionsViewer/InteractionsView.tsx | 21 - Eplant/views/InteractionsViewer/icon.tsx | 41 + Eplant/views/InteractionsViewer/index.tsx | 307 ++++++++ .../scripts/eventHandlers.ts | 215 +++++ .../InteractionsViewer/scripts/layout.ts | 289 +++++++ .../scripts/loadInteractions.ts | 740 ++++++++++++++++++ .../scripts/loadSublocalizations.ts | 215 +++++ Eplant/views/InteractionsViewer/types.ts | 103 +++ package-lock.json | 69 +- package.json | 10 +- vite.config.ts | 2 +- 13 files changed, 2066 insertions(+), 25 deletions(-) create mode 100644 Eplant/views/InteractionsViewer/GeneDialog.tsx delete mode 100644 Eplant/views/InteractionsViewer/InteractionsView.tsx create mode 100644 Eplant/views/InteractionsViewer/icon.tsx create mode 100644 Eplant/views/InteractionsViewer/index.tsx create mode 100644 Eplant/views/InteractionsViewer/scripts/eventHandlers.ts create mode 100644 Eplant/views/InteractionsViewer/scripts/layout.ts create mode 100644 Eplant/views/InteractionsViewer/scripts/loadInteractions.ts create mode 100644 Eplant/views/InteractionsViewer/scripts/loadSublocalizations.ts create mode 100644 Eplant/views/InteractionsViewer/types.ts diff --git a/Eplant/config.ts b/Eplant/config.ts index 8ef5012c..fdcae45d 100644 --- a/Eplant/config.ts +++ b/Eplant/config.ts @@ -7,6 +7,7 @@ import ExperimentEFP from './views/ExperimentEFP' import FallbackView from './views/FallbackView' import GeneInfoView from './views/GeneInfoView' import GetStartedView from './views/GetStartedView' +import InteractionsViewer from './views/InteractionsViewer' import PlantEFP from './views/PlantEFP' import PublicationViewer from './views/PublicationViewer' import { type View } from './View' @@ -33,6 +34,7 @@ const userViews = [ CellEFP, ExperimentEFP, ChromosomeViewer, + InteractionsViewer ] // List of views that are used to lookup a view by id diff --git a/Eplant/views/InteractionsViewer/GeneDialog.tsx b/Eplant/views/InteractionsViewer/GeneDialog.tsx new file mode 100644 index 00000000..2bcf0949 --- /dev/null +++ b/Eplant/views/InteractionsViewer/GeneDialog.tsx @@ -0,0 +1,77 @@ +/// YET TO IMPLEMENT + +import React, { FC, useEffect, useState } from 'react' + +import GeneticElement from '@eplant/GeneticElement' +import arabidopsis from '@eplant/Species/arabidopsis' +import { + useActiveGeneId, + useGeneticElements, + useSetGeneticElements, +} from '@eplant/state' +import { Typography } from '@mui/material' +import Box from '@mui/material/Box' +import useTheme from '@mui/material/styles/useTheme' +import Table from '@mui/material/Table' +import TableBody from '@mui/material/TableBody' +import TableCell from '@mui/material/TableCell' +import TableRow from '@mui/material/TableRow' + +import { GeneItem } from '../ChromosomeViewer/types' +interface GeneDialogProps { + gene: GeneItem +} +const GeneDialog: FC = ({ gene }) => { + // Global State + const [activeGeneId, setActiveGeneId] = useActiveGeneId() + const geneticElements = useGeneticElements() + const setGeneticElements = useSetGeneticElements() + const theme = useTheme() + + const handleLoadGeneClick = (event: React.MouseEvent) => { + if (gene != null) { + const geneticElement = new GeneticElement( + gene.id, + gene.annotation, + arabidopsis, + gene.aliases + ) + + setGeneticElements([...geneticElements[0], geneticElement]) + setActiveGeneId(gene.id) + } + } + + return ( +
+ {/* GENE INFO TABLE */} + + + + + + + + + + + + + +
Identifier{gene.id}
Aliases{gene.aliases.length > 0 ? gene.aliases : 'N/A'}
Annotation{gene.annotation != '' ? gene.annotation : 'N/A'}
+
+ ) +} + +export default GeneDialog diff --git a/Eplant/views/InteractionsViewer/InteractionsView.tsx b/Eplant/views/InteractionsViewer/InteractionsView.tsx deleted file mode 100644 index 2e133847..00000000 --- a/Eplant/views/InteractionsViewer/InteractionsView.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react' - -import ThumbnailLight from '../../../thumbnails/plant-efp-light.png' -import { View } from '../../View' -import PublicationViewerIcon from '../PublicationViewer/icon' - -const InteractionsViewer: View = { - name: 'Interactions Viewer', - id: 'interactions-viewer', - component() { - return
This is not implemented yet!
- }, - icon: () => <>, - description: 'Interactions Viewer.', - citation() { - return
- }, - async getInitialData() { - return - }, -} diff --git a/Eplant/views/InteractionsViewer/icon.tsx b/Eplant/views/InteractionsViewer/icon.tsx new file mode 100644 index 00000000..83822d8b --- /dev/null +++ b/Eplant/views/InteractionsViewer/icon.tsx @@ -0,0 +1,41 @@ +import { FC } from 'react' + +interface IconProps { + width?: number + height?: number + fill?: string + stroke?: string + strokeWidth?: number +} +export const InteractionsIcon: FC = ({ + width = 24, + height = 24, + fill = 'none', + stroke = 'currentColor', + strokeWidth = 2, +}) => { + return ( + // IconChartDots3 - Tabler Icons + + + + + + + + + + + ) +} diff --git a/Eplant/views/InteractionsViewer/index.tsx b/Eplant/views/InteractionsViewer/index.tsx new file mode 100644 index 00000000..05dee5bc --- /dev/null +++ b/Eplant/views/InteractionsViewer/index.tsx @@ -0,0 +1,307 @@ +import React, { useEffect, useRef } from 'react' +import cytoscape, { Core } from 'cytoscape' +import automove from 'cytoscape-automove' +import coseBilkent from 'cytoscape-cose-bilkent' +import popper from 'cytoscape-popper' +import tippy from 'tippy.js' + +import GeneticElement from '@eplant/GeneticElement' +import { ViewDataError } from '@eplant/View/viewData' + +import { View, ViewProps } from '../../View' + +import { addEdgeListener, addNodeListener } from './scripts/eventHandlers' +import setLayout from './scripts/layout' +import loadViewData from './scripts/loadInteractions' +import { InteractionsIcon } from './icon' +// import GeneDialog from './GeneDialog' +import { + Interaction, + InteractionsViewAction, + InteractionsViewData, + InteractionsViewState, + ViewData, +} from './types' + +function tippyFactory(ref: { getBoundingClientRect: any }, content: any) { + // Since tippy constructor requires DOM element/elements, create a placeholder + const dummyDomEle = document.createElement('div') + + const tip = tippy(dummyDomEle, { + getReferenceClientRect: ref.getBoundingClientRect, + trigger: 'manual', // mandatory + // dom element inside the tippy: + content: content, + // your own preferences: + arrow: true, + placement: 'bottom', + hideOnClick: false, + sticky: 'reference', + + // if interactive: + interactive: true, + appendTo: document.body, // or append dummyDomEle to document.body + }) + return tip +} + +cytoscape.use(popper(tippyFactory)) +cytoscape.use(automove) +cytoscape.use(coseBilkent) + +const InteractionsViewer: View = { + name: 'Interactions Viewer', + id: 'interactions-viewer', + + icon: () => , + description: 'Interactions Viewer.', + citation() { + return
+ }, + async getInitialData( + gene: GeneticElement | null, + loadEvent: (progress: number) => void + ) { + let data: ViewData + if (gene) { + const query = gene.id.toUpperCase() + const url = + 'https://bar.utoronto.ca/eplant/cgi-bin/get_interactions_dapseq.py?locus=' + + query + loadEvent(0) + loadEvent(20) + loadEvent(40) + // Fetch interaction data + let recursive: string = '' + const interactions = await fetch(url) + .then((response) => response.json()) + .then((json) => json[query]) + .then((interactions: []) => { + recursive = interactions[interactions.length - 1] + return interactions.slice(0, interactions.length - 1) + }) + data = loadViewData(gene, interactions, recursive) + loadEvent(100) + } else { + throw ViewDataError.UNSUPPORTED_GENE + } + return { + activeView: InteractionsViewer.id, + viewData: data, + } + }, + component({ + activeData, + state, + dispatch, + geneticElement, + }: ViewProps< + InteractionsViewData, + InteractionsViewState, + InteractionsViewAction + >) { + const cyRef = useRef(null) + console.log(activeData) + const viewData = activeData.viewData + const interactions = [...viewData.nodes, ...viewData.edges] + const styles: any = [ + { + selector: 'node', + style: { + 'text-background-shape': 'roundrectangle', + 'text-background-color': 'white', + 'text-background-opacity': 0.9, + 'background-color': '#f4f4f4', + 'font-size': '11px', + //'font-weight': 'bold', + 'text-halign': 'center', + 'border-width': '0px', + //'width': 'auto', + 'text-background-padding': '2px', + }, + }, + { + selector: '.compound-top', + style: { + shape: 'roundrectangle', + 'background-color': '#F3F3F3', + 'text-background-color': 'white', + 'text-wrap': 'wrap', + width: '300px', + color: '#000', + 'font-size': '10px', + 'font-weight': 'bold', + 'text-outline-width': '0px', + 'text-valign': 'top', + }, + }, + { + selector: '#COMPOUND_DNA', + style: { + 'background-opacity': '0', + 'text-background-opacity': '1', + label: 'Protein-DNA\nInteractions', + }, + }, + { + selector: '#COMPOUND_PROTEIN', + style: { + 'background-opacity': '0', + 'text-background-opacity': '1', + label: 'Protein-Protein\nInteractions', + }, + }, + { + selector: '.protein-compound', + style: { + 'background-opacity': 0, + events: 'no', + }, + }, + { + selector: '.protein-back[borderWidth]', + style: { + height: 'data(height)', + width: 'data(width)', + 'pie-size': '100%', + 'pie-1-background-color': 'data(pie1Colour)', + 'pie-1-background-size': 'data(pie1Size)', + 'pie-1-background-opacity': 1, + 'pie-2-background-color': 'data(pie2Colour)', + 'pie-2-background-size': 'data(pie2Size)', + 'pie-2-background-opacity': 1, + 'pie-3-background-color': 'data(pie3Colour)', + 'pie-3-background-size': 'data(pie3Size)', + 'pie-3-background-opacity': 1, + 'pie-4-background-color': 'data(pie4Colour)', + 'pie-4-background-size': 'data(pie4Size)', + 'pie-4-background-opacity': 1, + 'border-width': 'data(borderWidth)', + 'border-color': '#99CC00', + events: 'no', + }, + }, + { + selector: '.protein-node', + style: { + height: '36px', + width: '36px', + padding: '3px 3px 3px 3px', + 'text-valign': 'center', + content: 'data(content)', + events: 'yes', + 'z-index': 10, + }, + }, + { + selector: '[id $= "QUERY_BACK"]', + style: { + height: '60px', + width: '60px', + }, + }, + { + selector: '[id $= "QUERY_NODE"]', + style: { + height: '48px', + width: '48px', + 'font-size': '11px', + 'z-index': 10000000, + }, + }, + { + selector: '.dna-node', + style: { + shape: 'square', + width: '34px', + height: '34px', + 'border-width': '4px', + padding: '3px 3px 3px 3px', + 'border-color': '#030303', + 'text-valign': 'center', + content: 'data(content)', + 'z-index': 10, + }, + }, + { + selector: 'edge', + style: { + width: 'data(size)', + 'line-style': 'data(lineStyle)', + 'line-color': 'data(lineColor)', + 'control-point-distance': '50px', + 'control-point-weight': '0.5', + }, + }, + { + selector: '.protein-edge', + style: { + 'curve-style': 'bezier', + 'mid-target-arrow-shape': 'none', + }, + }, + { + selector: '.dna-edge', + style: { + 'curve-style': 'unbundled-bezier', + 'mid-target-arrow-shape': 'triangle', + 'mid-target-arrow-color': 'data(lineColor)', + }, + }, + { + selector: '.chr-edge', + style: { + 'curve-style': 'unbundled-bezier', + 'mid-target-arrow-shape': 'triangle', + 'mid-target-arrow-color': 'data(arrowColor)', + 'control-point-distance': '50px', + 'control-point-weight': '0.5', + }, + }, + { + selector: '.loaded', + style: { + 'background-color': '#3C3C3C', + 'text-background-color': '#3C3C3C', + color: '#FFFFFF', + }, + }, + { + selector: '#noInteractionLabel', + style: { + shape: 'circle', + content: 'No interactions found for this gene.', + width: '1px', + height: '1px', + color: '#000', + 'text-background-opacity': '0', + 'font-size': 15, + }, + }, + ] + + useEffect(() => { + const cy: Core = cytoscape({ + container: document.getElementById('cy'), // container to render in + elements: interactions, + style: styles, + }) + setLayout(cy, viewData.loadFlags) + // Listen for mouseover events on nodes + addNodeListener(cy) + // Listen for mouseover events on edges + addEdgeListener(cy) + }, []) + + return ( +
+
+
+ ) + }, +} +export default InteractionsViewer diff --git a/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts b/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts new file mode 100644 index 00000000..de6cb999 --- /dev/null +++ b/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts @@ -0,0 +1,215 @@ +// -------------- +// Event Listeners +// -------------- +export const addNodeListener = (cy) => { + cy.on('mouseover', 'node', (event) => { + const nodeId = event.target.data('id') + // Check that the node is not a compound node + if (nodeId !== 'COMPOUND_DNA' && nodeId !== 'COMPOUND_PROTEIN') { + if (nodeId.substring(0, 3) === 'chr') { + chrNodeMouseOverHandler(cy, event) + } else { + nodeMouseOverHandler(cy, event) + } + } + }) +} + +export const addEdgeListener = (cy) => { + // Listen for pointer events on edges + cy.on('mouseover', 'edge', (event) => { + // No tooltip on chr edges + if (event.target._private.classes.values().next().value == 'chr-edge') { + return false + } + edgeMouseOverHandler(cy, event) + }) +} + +// -------------- +// Event Handlers +// -------------- +// Handle edge hover +const edgeMouseOverHandler = (cy, event) => { + const edge = event.target + const data = edge._private.data + const references = + data.reference != 'None' + ? generateLinks(data.reference).map((link, i) => `${link}\n`) + : 'N/A' + + const tip = edge.popper({ + content: () => { + const content = document.createElement('div') + + content.innerHTML = ` + +
+

${data.tooltip}

+

Reference: \n${references}

+ +
` + return content + }, + }) + tip.show() + + destroyTip(cy, tip) +} + +// Handler chr node hover +const chrNodeMouseOverHandler = (cy, event) => { + const node = event.target + const chrNum = node._private.data.id.substring(3, 4) + const genes = node._private.data.genes + const tip = node.popper({ + content: () => { + const content = document.createElement('div') + + content.innerHTML = ` + +
+ + + + + + + + + +
${genes.length} Protein-DNA Interactions.
${genes.join(', ')}
+
` + return content + }, + }) + tip.show() + + destroyTip(cy, tip) +} + + +// Handle regular node hover +const nodeMouseOverHandler = (cy, event) => { + const node = event.target + const id = node._private.data.content + fetch( + 'https://bar.utoronto.ca/eplant/cgi-bin/querygene.cgi?species=Arabidopsis_thaliana&term=' + + id + ) + .then((response) => response.json()) + .then((gene) => { + const tip = node.popper({ + content: () => { + const content = document.createElement('div') + + content.innerHTML = ` + +
+ + + + + + + + + + + + + +
${gene.id}
+ ${gene.aliases.length > 0 ? gene.aliases.slice(0, 3) : 'N/A'} +
+ ${gene.annotation != '' ? gene.annotation : 'N/A'} +
+
` + + return content + }, + }) + + tip.show() + destroyTip(cy, tip) + }) +} +const destroyTip = (cy, tip) => { + // add handler to node for mouse leave + cy.on('mouseout', 'node', (event) => { + const nodeID = event.target.data('id') + if (nodeID !== 'COMPOUND_DNA' && nodeID !== 'COMPOUND_PROTEIN') { + tip.destroy() + } + }) + // add handler to edge for mouse leave + cy.on('mouseout', 'edge', (event) => { + tip.destroy() + }) +} + +// Helpers +const generateLinks = (reference: string): string[] => { + const AL1_HYPERLINK = 'http://interactome.dfci.harvard.edu/A_thaliana/' + + // Sanitize the reference + const sanitizedReference = reference.split('\n') + const hyperlinks = [] + + for (let i = 0; i < sanitizedReference.length; i = i + 1) { + // Processes links by reference type + if (sanitizedReference[i].search('PubMed') !== -1) { + // Append PubMed link to array + const subReference = sanitizedReference[i].replace('PubMed', '') + hyperlinks.push('http://www.ncbi.nlm.nih.gov/pubmed/' + subReference) + } else if (sanitizedReference[i].search('doi:') !== -1) { + // Append doi link to array + const subReference = sanitizedReference[i].replace('doi:', '') + hyperlinks.push('http://dx.doi.org/' + subReference) + } else if (sanitizedReference[i].search('AI-1') !== -1) { + // Append static AL1 link to array + hyperlinks.push(AL1_HYPERLINK) + } + } + return hyperlinks +} diff --git a/Eplant/views/InteractionsViewer/scripts/layout.ts b/Eplant/views/InteractionsViewer/scripts/layout.ts new file mode 100644 index 00000000..866392f5 --- /dev/null +++ b/Eplant/views/InteractionsViewer/scripts/layout.ts @@ -0,0 +1,289 @@ +/** @format */ + +import { Core } from 'cytoscape' + +import { LoadFlags } from '../types' +/** + * Used to lay out nodes. DNA nodes are positioned in alignment, while + * protein nodes are positioned by layout. + * @returns {void} + */ +let cy: Core; +let loadFlags: LoadFlags; + +const setLayout = (cytoscape, flags: LoadFlags) => { + cy = cytoscape + loadFlags = flags + if (!loadFlags.empty && cy != null) { + if (cy.nodes('[id $= "PROTEIN_NODE"]').length > 0) { + positionProtein() + } //else {cb();} ?? dont know what this does + if (loadFlags.existsPDI) { + //this.positionDNA(); + positionChr() + } + } + // Use Cytoscape Automove to make protein compounds move in sync + cy.automove({ + nodesMatching: node => { + const type = node._private.data.id.substring(9) + return type === 'PROTEIN_NODE' || type === 'QUERY_NODE' + }, + reposition: node => { + const pos = node.position() + // Set the back node to have the same position + const backNode = node.siblings() + backNode.position(pos) + return pos + }, + when: 'matching' + }) + cy.minZoom(0.5) + cy.fit() +} +export default setLayout + +/** + * Calls layout on protein nodes. + * @returns {void} + */ +const positionProtein = () => { + // get nodes + const proteinNodes = cy.nodes('[id $= "PROTEIN_NODE"]') + if (loadFlags.existsPDI || proteinNodes.length < 100) { + // Layout proteins for PDI + const layout = proteinNodes + .layout({ + name: 'cose-bilkent', + // Whether to fit the network view after when done + fit: false, + // Node repulsion (non overlapping) multiplier + nodeRepulsion: 5000, + // Maximum number of iterations to perform + numIter: 7500, + // For enabling tiling (Must be false, or error occurs) + tile: false, + // Type of layout animation. The option set is {'during', 'end', false} + animate: false, + randomize: true, + // Stop callback + stop: function () { + transformAverage(proteinNodes, loadFlags.existsPDI) + positionProteinBack(proteinNodes) + // cb(); ?? + } + }) + .run() + } else { + const layout = proteinNodes + .layout({ + name: 'cose-bilkent', + fit: true, + randomize: true, + stop: function () { + transformAverage(proteinNodes, false) + positionProteinBack(proteinNodes) + // cb() ?? + } + }) + .run() + } +} + +/** + * Updates the position of protein back nodes to be the same as protein node bodies. + * @param {Collection} nodes The collection of node bodies + * @return {void} + */ +const positionProteinBack = nodes => { + for (let i = 0; i < nodes.length; i++) { + const position = nodes[i]._private.position + const id = nodes[i]._private.data.id.substring(0, 9) + cy.$('#' + id + 'PROTEIN_BACK').position(position) + } +} +/** + * Positions Chr nodes + * @return {void} + */ +const positionChr = () => { + // Get DNA nodes + const chrNodes = cy.$('[id ^= "chr"]') + // Get DNA node positions + const chrPositions = positionDNALinear(chrNodes.length) + // Update position + for (let i = 0; i < chrNodes.length; i++) { + const x = chrPositions[i][0] + const y = chrPositions[i][1] + const id = '#' + chrNodes[i]._private.data.id + cy.$(id).position({ x: x, y: y }) + } +} + + + + + +// ---------------- +// Helper functions +// ---------------- +/** + * Transform the collection of protein nodes to an area to the average right of the query node. + * + * @param {Array} nodes The array of nodes to transform + * @param {Boolean} offset Controls whether nodes are offset off query x position + * @return {void} + */ +const transformAverage = (nodes, offset) => { + let minX = 10000 + let maxY = -10000 + let minY = 10000 + + let avgX = 0 + let avgY = 0 + + // Get range and average of values + for (let n = 0; n < nodes.length; n++) { + const posX = nodes[n].position('x') + const posY = nodes[n].position('y') + minX = posX < minX ? posX : minX + minY = posY < minY ? posY : minY + maxY = posY > maxY ? posY : maxY + + avgX += posX + avgY += posY + } + + const shiftX = 100 > minX ? 100 - minX : 0 + avgX = offset ? shiftX : avgX / nodes.length + avgY = avgY / nodes.length + + //BEN CHANGED + // Transform positions + //nodes.positions(function (i, node) { + nodes.positions(function (node, i) { + const curX = node.position('x') + const curY = node.position('y') + return { + x: offset ? curX + avgX : curX - avgX, + y: curY - avgY + } + }) +} +/** + * Determines Y coordinate for individual nodes with even spacing + * + * @param {Number} numNodes The amount of nodes to be positioned + * @return {List} coordinates The calculated (x, y) coordinates + */ +const positionDNALinear = (numNodes) => { + const x = -350 + const midpoint = 0 + let coordinates: Array> = [] + const increment = 100 + // Assign values to coordinates + if (numNodes <= 0) { + // Return empty coords + coordinates = [] + } else if (numNodes === 1) { + // Return midpoint + coordinates.push([x, midpoint]) + } else if (numNodes % 2 === 0) { + // Adds coordinates symmetrically from the midpoint. + // The midpoint is placed between the two middle coordinates. + for (let n = 0; n < numNodes / 2; n++) { + coordinates.push([x, 50 + n * increment]) + coordinates.unshift([x, -50 - n * increment]) + } + } else { + // Add aligned center node + coordinates.push([x, midpoint]) + // Adds coordinates symmetrically from the midpoint. + for (let k = 1; k <= Math.floor(numNodes / 2); k++) { + coordinates.push([x, midpoint + k * increment]) + coordinates.unshift([x, midpoint - k * increment]) + } + } + return coordinates +} + +/** + * Generates the coordinates to lay out DNA nodes in a semicircle + * @param {Number} numNodes The number of nodes to lay out + * @returns {Array} The computed coordinate array [(x,y)..] in a semi-circle + */ +const positionDNACircular = (numNodes) => { + // Set bounds for semi-circle (in radians) + let topLimit + let bottomLimit + if (numNodes > 80) { + // Increase arc size past vertical if many nodes + topLimit = Math.PI / 2 - Math.PI / 8 + bottomLimit = Math.PI * 1.5 + Math.PI / 8 + } else { + topLimit = Math.PI / 2 + bottomLimit = Math.PI * 1.5 + } + + // Angle in radians between nodes + const increment = (bottomLimit - topLimit) / numNodes + + // Rows of nodes to stagger + let rows = 2 + if (numNodes > 75) { + rows += 1 + Math.floor(numNodes / 80) + } + // Counter to track current row + let j = 1 + + // Final array of x,y coordinates of nodes + const coordArray: Array> = [] + + for (let i = topLimit; i < bottomLimit; i += increment) { + // Determine radius and distance between nodes + let radius + let separationWeight + if (numNodes > 400) { + radius = (10 - rows) * numNodes + separationWeight = 1 + rows * 0.1 + } else if (numNodes > 100) { + radius = (10 - 1.1 * rows) * numNodes + separationWeight = 1 + rows * 0.1 + } else { + radius = 7.5 * numNodes + separationWeight = 1 + rows * 0.3 + } + // Stagger rows, weight radius by number of nodes + // NOTE: can implement switch case here + if (j % rows === 7) { + radius += separationWeight * 315 + } else if (j % rows === 6) { + radius += separationWeight * 270 + } else if (j % rows === 5) { + radius += separationWeight * 225 + } else if (j % rows === 4) { + radius += separationWeight * 180 + } else if (j % rows === 3) { + radius += separationWeight * 135 + } else if (j % rows === 2) { + radius += separationWeight * 90 + } else if (j % rows === 1) { + radius += separationWeight * 45 + } + j++ + coordArray.unshift(trigCalculator(radius, i)) + } + return coordArray +} + +/** + * Generates the x-y coordinates of nodes using trigonometry + * @param {Number} radius The radius of the interaction edge + * @param {Number} angle The angle of the interaction edge in radians + * @returns {Tuple} Returns a tuple of (x, y) + */ +const trigCalculator = (radius: number, angle: number) => { + const xCoord = radius * Math.cos(angle) + const yCoord = radius * Math.sin(angle) + return [xCoord, yCoord] +} diff --git a/Eplant/views/InteractionsViewer/scripts/loadInteractions.ts b/Eplant/views/InteractionsViewer/scripts/loadInteractions.ts new file mode 100644 index 00000000..b0882c38 --- /dev/null +++ b/Eplant/views/InteractionsViewer/scripts/loadInteractions.ts @@ -0,0 +1,740 @@ +/** @format */ +import GeneticElement, { Species } from '@eplant/GeneticElement' + +import { Edge, Interaction, LoadFlags, NodeItem } from '../types' + +import loadSublocalizations from './loadSublocalizations' +let query = '' +let geneticElement: GeneticElement; +let loadFlags: LoadFlags = { + empty: true, + existsPDI: false, + existsPPI: false, + recursive: false +} +let nodes: NodeItem[]; +let edges: Edge[]; + +/* Main function */ +const loadViewData = (gene: GeneticElement, data: Interaction[], recursive: string) => { + nodes = [] + edges = [] + query = gene.id.toUpperCase() + geneticElement = gene + getLoadFlags(data, recursive) + loadInteractions(data) + nodes = loadSublocalizations(nodes) + + return { + nodes: nodes, + edges: edges, + loadFlags: loadFlags + } +} +export default loadViewData + +// ----------------- +// Level 1 functions +// ----------------- +/** + * Get flags used in futher loading + * * empty{boolean}: Whether interactions exist in data + * * existsPDI{boolean}: Whether protein-dna interactions exist in data + * * existsPPI{boolean}: Whether protein-protein interactions exist in data + * * recursive{boolean}: Whether data includes recursive interactions + * @param {Object} data JSON format interaction data + * @return {Object} flags + * + */ +const getLoadFlags = (data: Interaction[], recursive: string) => { + const flags = { + empty: checkEmpty(data), + existsPDI: checkExistsPDI(data), + existsPPI: checkExistsPPI(data), + recursive: checkRecursive(data, recursive) + } + loadFlags = flags +} +/** + * Convert interactions from JSON to cytoscape node/edges without PDIs + * @param {Object} data Interaction data from JSON + * @return {void} + */ +const loadInteractions = (data: Interaction[]) => { + if (!loadFlags?.recursive) { + createRecursiveLabel() + } + if (!loadFlags.empty) { + // Create top level compound nodes + if (loadFlags.existsPDI) { + createCompoundDNA() + if (loadFlags.existsPPI) { + createCompoundProtein() + } + } + + // Load interactions + if (loadFlags.existsPDI) { + loadInteractionsChr(data) + } else { + loadInteractionsNoDNA(data) + } + } else { + createQueryNode(query) + createNoInteractionNode() + } +} +const loadInteractionsChr = (data: Interaction[]) => { + createQueryNode(query) + createChromosomes(data) + const createFunctions = [createSelfQPI, createQPI, createPPI, createChr] + createInteractions(createFunctions, data) +} +/** + * Convert interactions from JSON to cytoscape node/edges without PDIs + * @return {void} + */ +const loadInteractionsNoDNA = (data: Interaction[]) => { + createQueryNode(query) + const createFunctions = [createSelfQPI, createQPI, createPPI] + + createInteractions(createFunctions, data) +} + +// ------------------------------------ +// Helper functions for State +// ------------------------------------ +/* const nodesPush = (node: NodeItem) => { + const newNodes = nodes + newNodes.push(node) + setNodes(newNodes) +} +const edgesPush = (edge: Edge) => { + const newEdges = edges + newEdges.push(edge) + setEdges(newEdges) +} +*/ +// ------------------------------------ +// Level 2 Functions +// ------------------------------------ +/** + * Creates interactions using creation functions + * @param {Array} funcArr Array of functions which to call to construct graph + * @return {void} + */ +const createInteractions = (funcArray: Array<(data: Interaction) => boolean>, data: Interaction[]) => { + data = data.slice() + for (let n = 0; n < funcArray.length; n++) { + const addedIndices = [] + for (let i = 0; i < data.length - 1; i++) { + const re = /^At[\dCM]g\d{5}$/i + if (re.test(data[i].source) && re.test(data[i].target) && funcArray[n](data[i])) { + addedIndices.unshift(i) + } + } + + for (let k = 0; k < addedIndices.length; k++) { + data.splice(addedIndices[k], 1) + } + } + + if (data.length > 1) { + console.log(data) + console.error('Error: ' + data.length + ' interactions not processed.') + } +} +/** + * Create nodes for chromosomal nodes + * @return {void} + */ +const createChromosomes = (data: Interaction[]) => { + const chrs: string[] = [] + const chrNums: Record = { '1': 0, '2': 0, '3': 0, '4': 0, '5': 0 } + const methods: Record = { '1': 'P', '2': 'P', '3': 'P', '4': 'P', '5': 'P', 'C': 'P', 'M': 'P' } + for (let k = 0; k < data.length - 1; k++) { + const chr = data[k].target.substring(2, 3) + if (data[k].index === '2') { + chrNums[chr]++ + if (!chrs.includes(chr)) { + chrs.push(chr) + } + } + // Method + if (data[k].index === '2' && data[k].published == true) { + methods[chr] = 'E' + } + } + for (const chr in chrNums) { + if (chrNums[chr] === 0) delete chrNums[chr] + } + + let i = 0 + for (const c in chrNums) { + createChromosomeNode(chrs[i], chrNums[c]) + createChromosomeEdge(chrs[i], methods[c]) + i++ + } +} + +// ++++++++++++++++++++++++++++++++++++++++++++++++ +// Node creators +// ------------ +/** + * Creates top level dna compound node + * @return {void} + */ +const createCompoundDNA = () => { + const dnaCompound = { + group: 'nodes', + data: { + id: 'COMPOUND_DNA' + }, + classes: 'compound-top' + } + //nodesPush(dnaCompound) + nodes.push(dnaCompound) +} + +/** + * Creates top level protein compound node + * @return {void} + */ +const createCompoundProtein = () => { + const proteinCompound = { + group: 'nodes', + data: { + id: 'COMPOUND_PROTEIN' + }, + classes: 'compound-top' + } + //nodesPush(proteinCompound) + nodes.push(proteinCompound) +} + +/** + * Create the query node; the one which user has entered + * @param {String} query ID of query gene + * @return {void} + */ +const createQueryNode = (query: string) => { + const compound = { + group: 'nodes', + data: { + id: query + 'QUERY_COMPOUND' + }, + classes: 'protein-compound' + } + + const border = { + group: 'nodes', + data: { + id: query + 'QUERY_BACK', + parent: query + 'QUERY_COMPOUND' + }, + classes: 'protein-back' + } + + const node = { + group: 'nodes', + data: { + id: query + 'QUERY_NODE', + content: query, + geneticElement: geneticElement, + parent: query + 'QUERY_COMPOUND' + }, + classes: 'protein-node loaded' + } + //nodesPush(compound) + //nodesPush(border) + //nodesPush(node) + nodes.push(compound, border, node) +} +/** + * Create Protein Nodes. Consists of three nodes: regular protein body, a pie node for border, + * and a compound container to keep nodes together. + * @param {String} id ID of gene to represent + * @return {Object} Node object + */ +const createProteinNode = (id: string) => { + id = id.toUpperCase() + const newGeneticElement = geneticElement + // let newGeneticElement = geneticElement.species.api.searchGene(id) + const compound = { + group: 'nodes', + data: { + id: id + 'PROTEIN_COMPOUND', + parent: '' + }, + classes: 'protein-compound' + } + + const border = { + group: 'nodes', + data: { + id: id + 'PROTEIN_BACK', + parent: id + 'PROTEIN_COMPOUND' + }, + classes: 'protein-back' + } + + const node = { + group: 'nodes', + data: { + id: id + 'PROTEIN_NODE', + content: id, + geneticElement: newGeneticElement, + parent: id + 'PROTEIN_COMPOUND' + }, + classes: 'protein-node' + } + + if (loadFlags.existsPDI) { + compound.data.parent = 'COMPOUND_PROTEIN' + } + // if (gene && gene.isLoadedViews) { + // node.classes = 'protein-node loaded' + // } + /* nodesPush(compound) + nodesPush(border) + nodesPush(node) + */ + nodes.push(compound, border, node) + return { compound: compound, border: border, node: node } +} + +/** + * Create no interactions node + * @return {void} Node object + */ +const createNoInteractionNode = () => { + const noInteractionNode = { + group: 'nodes', + data: { + id: 'noInteractionLabel' + }, + position: { + x: 0, + y: 400 + } + } + //nodesPush(noInteractionNode) + nodes.push(noInteractionNode) +} + +/** + * Create chromosomal node + * @param {Number} id Chromosomal number + * @param {Number} n Protein DNA interactions number + * @return {Object} Node object + */ +const createChromosomeNode = (id: string, n: number) => { + const node = { + data: { + id: 'chr' + id, + content: 'Chr ' + id + ': ' + n + ' PDIs', + parent: 'COMPOUND_DNA', + genes: [] + }, + classes: 'dna-node' + } + //nodesPush(node) + nodes.push(node) + return { node: node } +} + +// +++++++++++++++++++++++++++++++++++ +// Edge Creators and Helper Functions +//------------ + +// Creators +/** + * Create edges representing PPIs + * @param {Object} data JSON interaction data + * @return {void} + */ +const createProteinEdge = (data: Interaction) => { + // Gets method used to determine interaction + const method = data.reference === 'None' ? 'P' : 'E' + + let source = data.source.toUpperCase() + let target = data.target.toUpperCase() + + source = source === query ? source + 'QUERY_NODE' : source + 'PROTEIN_NODE' + target = target === query ? target + 'QUERY_NODE' : target + 'PROTEIN_NODE' + + let edge = { + data: { + source: source, + target: target, + tooltip: '', + type: 'PPI', + method: method, + correlation: data.correlation_coefficient, + interolog_conf: 0.0, + reference: 'None', + // css styles + size: 0, + lineStyle: '', + lineColor: '' + }, + classes: 'protein-edge' + } + + if (method === 'P') { + edge.data.interolog_conf = data.interolog_confidence + } + + if (data.reference !== 'None') { + edge.data.reference = data.reference + } + + edge = setProteinEdgeStyles(edge) + edge.data.tooltip = setEdgeTooltipContent(edge) + // edgesPush(edge) + edges.push(edge) +} + +/** + * Create interaction to chromosomal node + * Asher: Old function not used anymore + * @param {Number} id Chromosomal number + * @param {String} method 'P' | 'E' -> method used to determine interaction + * @return {void} + */ +const createChromosomeEdge = (id: string, method: string) => { + let source = geneticElement.id.toUpperCase() + source = source === query ? source + 'QUERY_NODE' : source + 'PROTEIN_NODE' + let edge: Edge = { + data: { + source: source, + target: 'chr' + id, + tooltip: '', + type: 'PDI', + method: method, + // css styles + size: 0, + lineStyle: '', + lineColor: '', + arrowColor: '' + }, + classes: 'chr-edge' + } + edge = setDNAEdgeStyles(edge) + edge.data.tooltip = setEdgeTooltipContent(edge) + // edgesPush(edge) + edges.push(edge) +} + +// Helpers +/** + * Sets edge styles for protein edges + * @param {Object} edge The edge object with completed data entry + * @return {Object} Edge object with styles + */ +const setProteinEdgeStyles = (edge: { data: any; classes: string }) => { + // Set edge style and size based on confidence + edge.data.lineStyle = 'solid' + if (edge.data.method === 'E') { + edge.data.size = 6 + } else if (edge.data.interolog_conf > 10) { + edge.data.size = 6 + } else if (edge.data.interolog_conf > 5) { + edge.data.size = 4 + } else if (edge.data.interolog_conf > 2) { + edge.data.size = 1 + } else { + edge.data.lineStyle = 'dashed' + edge.data.size = 1 + } + + if (edge.data.method === 'E') { + edge.data.lineColor = '#99CC00' + } else if (edge.data.correlation > 0.8) { + edge.data.lineColor = '#B1171D' + } else if (edge.data.correlation > 0.7) { + edge.data.lineColor = '#D32E09' + } else if (edge.data.correlation > 0.6) { + edge.data.lineColor = '#E97911' + } else if (edge.data.correlation > 0.5) { + edge.data.lineColor = '#EEB807' + } else { + edge.data.lineColor = '#A0A0A0' + } + + return edge +} + +/** + * Sets edge styles for DNA edges + * @param {Object} edge The edge object with completed data entry + * @return {Object} Edge object with styles + */ +const setDNAEdgeStyles = (edge: Edge) => { + // Set edge defaults + + if (edge.data.method == 'E') { + edge.data.lineStyle = 'solid' + edge.data.size = 6 + edge.data.lineColor = '#669900' // Green + edge.data.arrowColor = '#669900' + } else { + edge.data.lineStyle = 'dashed' + edge.data.size = 1 + edge.data.lineColor = '#A0A0A0' // Grey + edge.data.arrowColor = '#A0A0A0' + } + + return edge +} +/** + * Generate the tooltip associated with an edge from interaction data + * @param {Object} edge The cyConf edge object + * @return {void} + */ +const setEdgeTooltipContent = (edge: Edge) => { + // First line declaring type + const typeString = edge.data.type === 'PDI' ? 'DNA' : 'Protein' + let firstLine = 'Protein-' + typeString + ' Interaction' + // Add method of determination + if (edge.data.method === 'E') { + firstLine += ' (E)' + } else { + firstLine += ' (P)' + } + // Remaining lines containing data + let dataLines = '' + if (edge.data.type !== 'PDI') { + if (edge.data.method === 'P') { + dataLines += 'Confidence(Interolog): ' + edge.data.interolog_conf + '
' + } + dataLines += 'Co-expression coefficient: ' + edge.data.correlation + '
' + } + + const final = firstLine + '
' + dataLines + return final +} +//+++++++++++++++++++++++++++++++++++++ +// Create Functions +//---------------- +/** + * Check if a node already exists in the collection of all nodes + * @param {String} searchID The ID of the element to be compared against the collection + * @return {Boolean} Returns true if a node with the same id already exists + */ +const checkNodeExists = (searchID: string) => { + // Checks if current interaction source exists as a node + for (let n = 0; n < nodes.length; n++) { + // Compares interaction with existing node elements + if (nodes[n].data.id.toUpperCase() === searchID) { + return true + } + } + return false +} +/** + * Create interaction from query node to itself. + * @param {Object} data Object containing interaction data + * @return {Boolean} Whether an interaction was created + */ +const createSelfQPI = (data: Interaction) => { + // Verify that the inputted index is correct + const index = Number(data.index) + const sourceID = data.source.toUpperCase() + const targetID = data.target.toUpperCase() + + // Check if the source and target nodes are the query node + const isQuerySource = sourceID === query + const isQueryTarget = targetID === query + if (index < 2 && isQuerySource && isQueryTarget) { + createProteinEdge(data) + return true + } + return false +} + +/** + * Create interactions from Query to Proteins. + * + * @param {Object} data The object which contains data for this interaction + * @return {Boolean} Whether a QPI was created + */ +const createQPI = (data: Interaction) => { + const index = Number(data.index) + // Store interaction data + const sourceID = data.source.toUpperCase() + const targetID = data.target.toUpperCase() + + // Checks if the source node is the query node + const isQuerySource = sourceID === query + // Checks if the target node is the query node + const isQueryTarget = targetID === query + + // Create interaction if above conditions are met. Interaction must be PPI, and source and + // target must be different, as self interctions should not be handled. + if (index < 2 && sourceID !== targetID && (isQuerySource || isQueryTarget)) { + // Add appropriate identifier tag to source + let existsSource + let existsTarget + if (isQuerySource) { + existsSource = true + existsTarget = checkNodeExists(data.target + 'PROTEIN_NODE') + } else { + existsSource = checkNodeExists(data.source + 'PROTEIN_NODE') + existsTarget = true + } + + // Create source node if not pre-existing + if (!existsSource) { + createProteinNode(data.source.toUpperCase()) + } + + // Create target node if not pre-existing + if (!existsTarget) { + createProteinNode(data.target.toUpperCase()) + } + + // Create an interaction if not pre-existing + if (!existsTarget || !existsSource) { + createProteinEdge(data) + return true + } + } + return false +} + +/** + * Creates protein-protein interactions which do not include the query node. + * Must be executed after the createQPI method has run. + * This ensures that all PPIs will have an origin from a query node rooted protein. + * This method will include the creation of self PPIs. + * + * @param {Object} data Object containing interaction data + * @return {Boolean} Whether an interaction was created + */ +const createPPI = (data: Interaction) => { + const index = Number(data.index) + // Store interaction data + const sourceID = data.source.toUpperCase() + const targetID = data.target.toUpperCase() + + // Checks that both the source and target nodes are pre-existing + const existsProteinSource = checkNodeExists(sourceID + 'PROTEIN_NODE') + const existsProteinTarget = checkNodeExists(targetID + 'PROTEIN_NODE') + + // Check that source and target nodes are not the query node + const existsQuerySource = checkNodeExists(sourceID + 'QUERY_NODE') + const existsQueryTarget = checkNodeExists(targetID + 'QUERY_NODE') + + const existsQuery = existsQuerySource || existsQueryTarget + + if (index < 2 && (existsProteinSource || existsProteinTarget) && !existsQuery) { + // Create source node if not pre-existing + if (!existsProteinSource) { + createProteinNode(data.source.toUpperCase()) + } + + // Create target node if not pre-existing + if (!existsProteinTarget) { + // Create target node + createProteinNode(data.target.toUpperCase()) + } + + createProteinEdge(data) + + return true + } + return false +} + +/** + * Creates DNA interactions assigned to chromosomal nodes + * @param {Object} JSON data object + * @return Whether an interaction was created + */ +const createChr = (data: Interaction) => { + if (data.index !== '2') { + return false + } + const chr = data.target.substring(2, 3) + const chrNode = nodes.filter(function (item) { + return item.data.id === 'chr' + chr + })[0] + + // Predicted DNA + // Asher + if (data.published == false && data.index === '2') { + chrNode.data.genes?.push('' + data.target + '') + } else { + chrNode.data.genes?.push('' + data.target + '') + } + return true +} +//++++++++++++++++++++++++++++++++++++++ +const createRecursiveLabel = () => { } + +// ------------------------------------ +// Helper functions for getLoadFlags() +// ------------------------------------ + +/** + * Returns if protein-dna interactions exists in data + * @param {Object} data JSON format interaction data + * @return {Boolean} Whether PDIs exist in data + */ +const checkExistsPDI = (data: Interaction[]) => { + if (typeof data == 'undefined') { + return false + } + for (let n = 0; n < data.length - 1; n++) { + // Checks for PDI interactions, which have an index > 1 + if (Number(data[n].index) > 1) { + return true + } + } + return false +} + +/** + * Returns if protein-protein interactions exists in data + * @param {Object} data JSON format interaction data + * @return {Boolean} Whether PDIs exist in data + */ +const checkExistsPPI = (data: Interaction[]) => { + if (typeof data == 'undefined') { + return false + } + for (let n = 0; n < data.length - 1; n++) { + // Checks for PPI interactions, which have an index < 1 + if (Number(data[n].index) < 2) { + return true + } + } + return false +} + +/** + * Check if JSON data includes recursive interactions + * @param {Array} data Last object contains recursive data + * @param {string} recursive 'yes' or 'no' is data recursive + * @return {Boolean} Whether data includes recursive interactions + */ +const checkRecursive = (data: string | any[], recursive: string) => { + if (typeof data == 'undefined') { + return false + } + return recursive === 'true' +} + +/** + * Checks if any interactions exist in data + * @param {Object} data JSON format interaction data + * @return {Boolean} Whether interactions exist + */ +const checkEmpty = (data: Interaction[]) => { + // check for undefined + if (typeof data == 'undefined') { + return true + } + return data.length < 2 +} diff --git a/Eplant/views/InteractionsViewer/scripts/loadSublocalizations.ts b/Eplant/views/InteractionsViewer/scripts/loadSublocalizations.ts new file mode 100644 index 00000000..f1e51f8e --- /dev/null +++ b/Eplant/views/InteractionsViewer/scripts/loadSublocalizations.ts @@ -0,0 +1,215 @@ +/** @format */ + +import { NodeItem, Sublocalization } from '../types' + +let nodes: NodeItem[] = [] + +/* Main function */ +const loadSublocalizations = (cyConfNodes: NodeItem[]) => { + nodes = cyConfNodes + let data = [] + loadData().then((expData) => { + data = expData + nodes = setSublocalizations(data) + + }) + return nodes + +} +export default loadSublocalizations +/** + * Set the sublocalization for each pie node + * @param {Object} data JSON sublocalization object from webservice + * @return {void} + */ +const setSublocalizations = (data: Sublocalization[]) => { + const newNodes = [] + const backNodes = [] + for (let i = 0; i < nodes.length; i++) { + if (nodes[i].data.id.includes('BACK')) { + backNodes.push(nodes[i]) + } else { + newNodes.push(nodes[i]) + } + } + + for (let n = 0; n < backNodes.length; n++) { + const id = backNodes[n].data.id.substring(0, 9) + const sublocData = data.filter(item => { + return item.id === id + })[0] + const topLocals = sublocData ? getTopSublocals(sublocData) : [] + const predicted = sublocData ? sublocData.includes_predicted : true + // @ts-ignore + const node = setSublocalizationStyle(topLocals, predicted === 'yes', backNodes[n]) + newNodes.push(node) + } + return newNodes +} + +/** + * Gets sublocalization data from webservice + * @param {Function} resolve Promise resolve function + * @return {void} + */ +const loadData = async () => { + // Get all protein ids + const ids = [] + for (let n = 0; n < nodes.length; n++) { + const id = nodes[n].data.id.substring(0, 9) + const type = nodes[n].data.id.substring(9) + + if (type === 'PROTEIN_NODE' || type === 'QUERY_NODE') { + ids.push(id) + } + } + + let expData: Sublocalization[] = [] + // URL for sublocalization webservices + const urlSUBA = 'https://bar.utoronto.ca/eplant/cgi-bin/groupsuba4.php' + // fetch sublocalizations, do not include predicted + await fetch(urlSUBA, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + + body: JSON.stringify({ + AGI_IDs: ids, + include_predicted: false + }) + }).then(response => response.json()).then(async (json) => { + expData = json + const predIds = [] // ids of genes without experimental data + for (let i = 0; i < expData.length; i++) { + // Get genes without experimental data to re-query + if (expData[i].includes_experimental === 'no') { + predIds.push(expData[i].id) + } + } + if (predIds.length === 0) { + return expData + } + + let predictedData: Sublocalization[] | [] = [] + // fetch sublocalizations, include predicted + await fetch(urlSUBA, { + method: 'post', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + AGI_IDs: predIds, + include_predicted: true + }) + }).then(response => response.json()).then((json) => { + predictedData = json + for (let k = 0; k < expData.length; k++) { + const subLoc = expData[k] + + // Use predicted data for genes without experimental data + if (subLoc.includes_experimental === 'no') { + const predicted = predictedData.filter(function (item) { + return item.id === subLoc.id + })[0] + subLoc.data = predicted.data + subLoc.includes_predicted = 'yes' + } + } + }) + }) + return expData +} + +/** + * Return the top 4 sublocalizations of each node + * @param {Object} data The sublocalization data for one gene + * @return {Array} Array of sublocalizations and score + */ +const getTopSublocals = (subLoc: Sublocalization) => { + const locals = subLoc.data + // Get the score of sublocalizations + const arrayLocalization = [] + for (const local in locals) { + arrayLocalization.push([local, locals[local]]) + } + + // Return top sublocalizations, up to 4 + if (arrayLocalization.length < 5) { + return arrayLocalization + } + // Sort to get largest 4th keys + arrayLocalization.sort((a, b) => { + return a[1] - b[1] + }) + return arrayLocalization.slice(-4) +} + +/** + * Set the cytoscape styles for pie nodes + * @param {Array} sublocalizations Array of top 4 sublocalizations and score + * @param {Boolean} pred Whether sublocalizations are predicted + * @param {Object} node Pie protein node + * @return {Object} The update pie node + */ +const setSublocalizationStyle = (sublocalizations: [], predicted: boolean, node: NodeItem) => { + // Calculate total sum of scores + let total = 0 + for (let n = 0; n < sublocalizations.length; n++) { + total += sublocalizations[n][1] + } + // Calculate pie size and colours + const percentages = [100, 0, 0, 0] + const colour = ['#787878', '#787878', '#787878', '#787878'] + for (let i = 0; i < sublocalizations.length; i++) { + percentages[i] = (sublocalizations[i][1] * 100) / total + colour[i] = getColour(sublocalizations[i][0]) + } + + // Set styles + node.data.pie1Size = percentages[0] + node.data.pie2Size = percentages[1] + node.data.pie3Size = percentages[2] + node.data.pie4Size = percentages[3] + node.data.pie1Colour = colour[0] + node.data.pie2Colour = colour[1] + node.data.pie3Colour = colour[2] + node.data.pie4Colour = colour[3] + node.data.height = predicted ? '46px' : '50px' + node.data.width = predicted ? '46px' : '50px' + node.data.borderWidth = predicted ? 0 : 4 + + return node +} + +/** + * Return a hex colour code representing a compartment + * @param {String} compartment The compartment to represent + * @return {String} The hex colour code + */ +const getColour = (compartment: string): string => { + // Define color map + const map: Record = { + 'cytoskeleton': '#FF2200', + 'cytosol': '#E04889', + 'endoplasmic reticulum': '#D0101A', + 'extracellular': '#6D3F1F', + 'golgi': '#A5A417', + 'mitochondrion': '#41ABF9', + 'nucleus': '#0032FF', + 'peroxisome': '#660066', + 'plasma membrane': '#ECA926', + 'plastid': '#179718', + 'vacuole': '#F6EE3C' + } + + // Get color + let color = map[compartment] + if (!color) { + color = '#787878' + } + + // Return color + return color +} diff --git a/Eplant/views/InteractionsViewer/types.ts b/Eplant/views/InteractionsViewer/types.ts new file mode 100644 index 00000000..a7c0ccb2 --- /dev/null +++ b/Eplant/views/InteractionsViewer/types.ts @@ -0,0 +1,103 @@ +import GeneticElement from "@eplant/GeneticElement" + +/* Level 1 - API results */ +export interface Interaction { + source: string + target: string + index: string + interolog_confidence: number + correlation_coefficient: number + published: boolean + reference: string + recursive?: string +} +export interface SublocalizationData { + 'unclear'?: number, + 'cytosol'?: number, + 'mitochondrion'?: number, + 'plastid'?: number, + 'vacuole'?: number, + 'nucleus'?: number, + 'endoplasmic reticulum'?: number, + 'extracellular'?: number, + 'golgi'?: number, + 'plasma membrane'?: number, + 'peroxisome'?: number +} +export interface Sublocalization { + id: string + includes_predicted: string + includes_experimental: string + data?: any +} +/* Level 2 - Nodes and Edges */ +export interface NodeItem { + data: NodeData + group?: string + classes?: string + position?: { + x: number + y: number + } +} +export interface Edge { + data: EdgeData + classes: string +} + +export interface NodeData { + id: string + parent?: string + content?: string + geneticElement?: GeneticElement + genes?: string[] + pie1Size?: number + pie2Size?: number + pie3Size?: number + pie4Size?: number + pie1Colour?: string + pie2Colour?: string + pie3Colour?: string + pie4Colour?: string + height?: string + width?: string + borderWidth?: number +} + +export interface EdgeData { + source: string + target: string + tooltip: string + type: string + method: string + correlation?: number + interolog_conf?: number + reference?: string + size?: number + lineStyle?: string + lineColor?: string + arrowColor?: string +} + +/* Cytoscape */ +export interface ViewData { + nodes: NodeItem[] + edges: Edge[] + loadFlags: LoadFlags +} +export type CyInteraction = NodeItem | Edge + +export interface LoadFlags { + empty: boolean + existsPDI: boolean + existsPPI: boolean + recursive: boolean +} + + +// InteractionsViewer component +export type InteractionsViewData = { + viewData: ViewData +} +export type InteractionsViewState = null +export type InteractionsViewAction = null \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 819c43db..08f7c115 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,9 +22,14 @@ "@mui/x-data-grid": "^6.15.0", "@mui/x-tree-view": "^7.5.1", "@popperjs/core": "^2.11.8", + "@types/cytoscape": "^3.21.5", "@types/react-router-dom": "^5.3.3", "axios": "^1.5.1", "color2k": "^2.0.2", + "cytoscape": "^3.30.1", + "cytoscape-automove": "^1.10.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-popper": "^4.0.0", "dompurify": "^3.0.6", "flexlayout-react": "^0.7.11", "idb": "^7.1.1", @@ -33,7 +38,8 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.16.0", - "react-window": "^1.8.9" + "react-window": "^1.8.9", + "tippy.js": "^6.3.7" }, "devDependencies": { "@eslint/js": "^9.3.0", @@ -3260,6 +3266,11 @@ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, + "node_modules/@types/cytoscape": { + "version": "3.21.5", + "resolved": "https://registry.npmjs.org/@types/cytoscape/-/cytoscape-3.21.5.tgz", + "integrity": "sha512-fzYT3vqY5J4gxVXDOsCgDpm0ZdU8bQq+wCv0ucS0MSTtvQdjs3lcb2VetJiUSAd4WBgouqizI+JT1f8Yc6eY7Q==" + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -5183,6 +5194,14 @@ "node": ">= 0.6" } }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -5338,6 +5357,41 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/cytoscape": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", + "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-automove": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/cytoscape-automove/-/cytoscape-automove-1.10.3.tgz", + "integrity": "sha512-Byj9RkFolphbSoZ/XAse3ch3i/5mDEwaYAy+s8iEJzbzDsnakxQ4BgaHNm9ydUqq38I3vtM6NSmRMTV2DK9QaA==", + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-popper": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cytoscape-popper/-/cytoscape-popper-4.0.0.tgz", + "integrity": "sha512-M4q2YeIhZvRDslMLzVuGZKb6HAU3O6M51NAaRc0hr3KubQabiK2c9dEGwfVIBPcDnxr9u/oFAMhAU7DEf2EHaA==", + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -10141,6 +10195,11 @@ "node": ">=6" } }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -12756,6 +12815,14 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, + "node_modules/tippy.js": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", diff --git a/package.json b/package.json index 31965b27..84ad9d72 100644 --- a/package.json +++ b/package.json @@ -28,9 +28,14 @@ "@mui/x-data-grid": "^6.15.0", "@mui/x-tree-view": "^7.5.1", "@popperjs/core": "^2.11.8", + "@types/cytoscape": "^3.21.5", "@types/react-router-dom": "^5.3.3", "axios": "^1.5.1", "color2k": "^2.0.2", + "cytoscape": "^3.30.1", + "cytoscape-automove": "^1.10.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-popper": "^4.0.0", "dompurify": "^3.0.6", "flexlayout-react": "^0.7.11", "idb": "^7.1.1", @@ -39,7 +44,8 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.16.0", - "react-window": "^1.8.9" + "react-window": "^1.8.9", + "tippy.js": "^6.3.7" }, "devDependencies": { "@eslint/js": "^9.3.0", @@ -82,4 +88,4 @@ "vite-plugin-eslint": "^1.8.1", "vite-tsconfig-paths": "^4.2.1" } -} \ No newline at end of file +} diff --git a/vite.config.ts b/vite.config.ts index e350b67e..7787d8fe 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -7,7 +7,7 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [ - eslint(), + // eslint(), tsconfigPaths(), react()], base: process.env.BASE_URL ?? '/', build: { From 5c1da39ff7e6baa170eb06ef3f3ae5cfcbc8d8b5 Mon Sep 17 00:00:00 2001 From: Yonah Aviv Date: Wed, 21 Aug 2024 13:49:18 -0400 Subject: [PATCH 02/97] Added topbar, added functionality for showing query gene when no gene interactions are found --- Eplant/views/InteractionsViewer/Topbar.tsx | 79 ++++ Eplant/views/InteractionsViewer/index.tsx | 53 ++- .../scripts/eventHandlers.ts | 345 +++++++++--------- .../InteractionsViewer/scripts/layout.ts | 4 +- .../scripts/loadInteractions.ts | 6 +- 5 files changed, 296 insertions(+), 191 deletions(-) create mode 100644 Eplant/views/InteractionsViewer/Topbar.tsx diff --git a/Eplant/views/InteractionsViewer/Topbar.tsx b/Eplant/views/InteractionsViewer/Topbar.tsx new file mode 100644 index 00000000..0dbffec9 --- /dev/null +++ b/Eplant/views/InteractionsViewer/Topbar.tsx @@ -0,0 +1,79 @@ +import React, { useEffect, useRef } from 'react' +import { Core } from 'cytoscape' + +import Add from '@mui/icons-material/Add' +import Remove from '@mui/icons-material/Remove' +import AppBar from '@mui/material/AppBar' +import Button from '@mui/material/Button' +import ButtonGroup from '@mui/material/ButtonGroup' +import Toolbar from '@mui/material/Toolbar' +import Typography from '@mui/material/Typography' + +const Topbar = () => { + + const zoomValue = 1000.0 + return ( + + + {/* VIEW TITLE */} + + Interactions Viewer + + {/* ZOOM CONTROLS */} + + {/* (zoom value).toFixed(0) */} + + + + + + + + + ) +} + +export default Topbar diff --git a/Eplant/views/InteractionsViewer/index.tsx b/Eplant/views/InteractionsViewer/index.tsx index 05dee5bc..828e197d 100644 --- a/Eplant/views/InteractionsViewer/index.tsx +++ b/Eplant/views/InteractionsViewer/index.tsx @@ -1,9 +1,13 @@ -import React, { useEffect, useRef } from 'react' -import cytoscape, { Core } from 'cytoscape' +import React, { useEffect, useRef, useState } from 'react' +import cytoscape, { + Core, + ElementDefinition, + ElementsDefinition, +} from 'cytoscape' import automove from 'cytoscape-automove' import coseBilkent from 'cytoscape-cose-bilkent' import popper from 'cytoscape-popper' -import tippy from 'tippy.js' +import tippy, { Instance as TippyInstance, Props as TProps } from 'tippy.js' import GeneticElement from '@eplant/GeneticElement' import { ViewDataError } from '@eplant/View/viewData' @@ -12,7 +16,8 @@ import { View, ViewProps } from '../../View' import { addEdgeListener, addNodeListener } from './scripts/eventHandlers' import setLayout from './scripts/layout' -import loadViewData from './scripts/loadInteractions' +import loadInteractions from './scripts/loadInteractions' +import loadSublocalizations from './scripts/loadSublocalizations' import { InteractionsIcon } from './icon' // import GeneDialog from './GeneDialog' import { @@ -22,12 +27,20 @@ import { InteractionsViewState, ViewData, } from './types' +import Topbar from './Topbar' + +/*-------------------- +CYTOSCAPE PLUGIN SETUP +---------------------- */ +declare module 'cytoscape-popper' { + interface PopperOptions extends Partial {} + interface PopperInstance extends TippyInstance {} +} function tippyFactory(ref: { getBoundingClientRect: any }, content: any) { // Since tippy constructor requires DOM element/elements, create a placeholder const dummyDomEle = document.createElement('div') - - const tip = tippy(dummyDomEle, { + const config: Partial = { getReferenceClientRect: ref.getBoundingClientRect, trigger: 'manual', // mandatory // dom element inside the tippy: @@ -41,13 +54,15 @@ function tippyFactory(ref: { getBoundingClientRect: any }, content: any) { // if interactive: interactive: true, appendTo: document.body, // or append dummyDomEle to document.body - }) + } + const tip = tippy(dummyDomEle, config) return tip } cytoscape.use(popper(tippyFactory)) cytoscape.use(automove) cytoscape.use(coseBilkent) +/* -------------------------------- */ const InteractionsViewer: View = { name: 'Interactions Viewer', @@ -62,6 +77,7 @@ const InteractionsViewer: View = { gene: GeneticElement | null, loadEvent: (progress: number) => void ) { + console.log('eeee') let data: ViewData if (gene) { const query = gene.id.toUpperCase() @@ -76,11 +92,17 @@ const InteractionsViewer: View = { const interactions = await fetch(url) .then((response) => response.json()) .then((json) => json[query]) - .then((interactions: []) => { + .then((interactions: [] | undefined) => { + console.log(interactions) + if (interactions === undefined) { + recursive = 'false' + return [] + } recursive = interactions[interactions.length - 1] return interactions.slice(0, interactions.length - 1) }) - data = loadViewData(gene, interactions, recursive) + data = loadInteractions(gene, interactions, recursive) + data.nodes = loadSublocalizations(data.nodes) loadEvent(100) } else { throw ViewDataError.UNSUPPORTED_GENE @@ -100,10 +122,11 @@ const InteractionsViewer: View = { InteractionsViewState, InteractionsViewAction >) { + // const [cy, setCy] = useState(cytoscape()) const cyRef = useRef(null) console.log(activeData) const viewData = activeData.viewData - const interactions = [...viewData.nodes, ...viewData.edges] + const elements: any = [...viewData.nodes, ...viewData.edges] const styles: any = [ { selector: 'node', @@ -282,10 +305,11 @@ const InteractionsViewer: View = { useEffect(() => { const cy: Core = cytoscape({ - container: document.getElementById('cy'), // container to render in - elements: interactions, - style: styles, - }) + container: document.getElementById('cy'), // container to render in + elements: elements, + style: styles, + }) + setLayout(cy, viewData.loadFlags) // Listen for mouseover events on nodes addNodeListener(cy) @@ -295,6 +319,7 @@ const InteractionsViewer: View = { return (
+
{ - cy.on('mouseover', 'node', (event) => { - const nodeId = event.target.data('id') - // Check that the node is not a compound node - if (nodeId !== 'COMPOUND_DNA' && nodeId !== 'COMPOUND_PROTEIN') { - if (nodeId.substring(0, 3) === 'chr') { - chrNodeMouseOverHandler(cy, event) - } else { - nodeMouseOverHandler(cy, event) - } - } - }) +export const addNodeListener = (cy: Core) => { + cy.on('mouseover', 'node', (event) => { + const nodeId = event.target.data('id') + // Check that the node is not a compound node + if (nodeId !== 'COMPOUND_DNA' && nodeId !== 'COMPOUND_PROTEIN') { + if (nodeId.substring(0, 3) === 'chr') { + chrNodeMouseOverHandler(cy, event) + } else { + nodeMouseOverHandler(cy, event) + } + } + }) } -export const addEdgeListener = (cy) => { - // Listen for pointer events on edges - cy.on('mouseover', 'edge', (event) => { - // No tooltip on chr edges - if (event.target._private.classes.values().next().value == 'chr-edge') { - return false - } - edgeMouseOverHandler(cy, event) - }) +export const addEdgeListener = (cy: Core) => { + // Listen for pointer events on edges + cy.on('mouseover', 'edge', (event) => { + // No tooltip on chr edges + if (event.target._private.classes.values().next().value == 'chr-edge') { + return false + } + edgeMouseOverHandler(cy, event) + }) } // -------------- // Event Handlers // -------------- // Handle edge hover -const edgeMouseOverHandler = (cy, event) => { - const edge = event.target - const data = edge._private.data - const references = - data.reference != 'None' - ? generateLinks(data.reference).map((link, i) => `${link}\n`) - : 'N/A' - - const tip = edge.popper({ - content: () => { - const content = document.createElement('div') - - content.innerHTML = ` +const edgeMouseOverHandler = (cy: Core, event) => { + const edge = event.target + const data = edge._private.data + const references = + data.reference != 'None' + ? generateLinks(data.reference).map((link, i) => `${link}\n`) + : 'N/A' + + const tip = edge.popper({ + content: () => { + const content = document.createElement('div') + + content.innerHTML = ` -
- - - - - - - - - -
${genes.length} Protein-DNA Interactions.
${genes.join(', ')}
-
` - return content - }, - }) - tip.show() - - destroyTip(cy, tip) +const chrNodeMouseOverHandler = (cy: Core, event) => { + const node = event.target + const chrNum = node._private.data.id.substring(3, 4) + const genes = node._private.data.genes + const tip: PopperInstance = node.popper({ + content: () => { + const content = document.createElement('div') + + content.innerHTML = ` + +
+ + + + + + + + + +
${genes.length} Protein-DNA Interactions.
${genes.join(', ')}
+
+ ` + return content + }, + }) + tip.show() + + destroyTip(cy, tip) } // Handle regular node hover -const nodeMouseOverHandler = (cy, event) => { - const node = event.target - const id = node._private.data.content - fetch( - 'https://bar.utoronto.ca/eplant/cgi-bin/querygene.cgi?species=Arabidopsis_thaliana&term=' + - id - ) - .then((response) => response.json()) - .then((gene) => { - const tip = node.popper({ - content: () => { - const content = document.createElement('div') - - content.innerHTML = ` - -
- - - - - - - - - - - - - -
${gene.id}
- ${gene.aliases.length > 0 ? gene.aliases.slice(0, 3) : 'N/A'} -
- ${gene.annotation != '' ? gene.annotation : 'N/A'} -
-
` - - return content - }, - }) - - tip.show() - destroyTip(cy, tip) - }) +const nodeMouseOverHandler = (cy: Core, event) => { + const node = event.target + const id = node._private.data.content + fetch( + 'https://bar.utoronto.ca/eplant/cgi-bin/querygene.cgi?species=Arabidopsis_thaliana&term=' + + id + ) + .then((response) => response.json()) + .then((gene) => { + const tip: PopperInstance = node.popper({ + content: () => { + const content = document.createElement('div') + + content.innerHTML = ` +
+ + + + + + + + + + + + + +
${gene.id}
+ ${gene.aliases.length > 0 ? gene.aliases.slice(0, 3) : 'N/A'} +
+ ${gene.annotation != '' ? gene.annotation : 'N/A'} +
+
` + return content + }, + }) + + tip.show() + destroyTip(cy, tip) + }) } -const destroyTip = (cy, tip) => { - // add handler to node for mouse leave - cy.on('mouseout', 'node', (event) => { - const nodeID = event.target.data('id') - if (nodeID !== 'COMPOUND_DNA' && nodeID !== 'COMPOUND_PROTEIN') { - tip.destroy() - } - }) - // add handler to edge for mouse leave - cy.on('mouseout', 'edge', (event) => { - tip.destroy() - }) +const destroyTip = (cy: Core, tip: PopperInstance) => { + // add handler to node for mouse leave + cy.on('mouseout', 'node', (event) => { + const nodeID = event.target.data('id') + if (nodeID !== 'COMPOUND_DNA' && nodeID !== 'COMPOUND_PROTEIN') { + tip.destroy() + } + }) + // add handler to edge for mouse leave + cy.on('mouseout', 'edge', (event) => { + tip.destroy() + }) } // Helpers const generateLinks = (reference: string): string[] => { - const AL1_HYPERLINK = 'http://interactome.dfci.harvard.edu/A_thaliana/' - - // Sanitize the reference - const sanitizedReference = reference.split('\n') - const hyperlinks = [] - - for (let i = 0; i < sanitizedReference.length; i = i + 1) { - // Processes links by reference type - if (sanitizedReference[i].search('PubMed') !== -1) { - // Append PubMed link to array - const subReference = sanitizedReference[i].replace('PubMed', '') - hyperlinks.push('http://www.ncbi.nlm.nih.gov/pubmed/' + subReference) - } else if (sanitizedReference[i].search('doi:') !== -1) { - // Append doi link to array - const subReference = sanitizedReference[i].replace('doi:', '') - hyperlinks.push('http://dx.doi.org/' + subReference) - } else if (sanitizedReference[i].search('AI-1') !== -1) { - // Append static AL1 link to array - hyperlinks.push(AL1_HYPERLINK) - } - } - return hyperlinks + const AL1_HYPERLINK = 'http://interactome.dfci.harvard.edu/A_thaliana/' + + // Sanitize the reference + const sanitizedReference = reference.split('\n') + const hyperlinks = [] + + for (let i = 0; i < sanitizedReference.length; i = i + 1) { + // Processes links by reference type + if (sanitizedReference[i].search('PubMed') !== -1) { + // Append PubMed link to array + const subReference = sanitizedReference[i].replace('PubMed', '') + hyperlinks.push('http://www.ncbi.nlm.nih.gov/pubmed/' + subReference) + } else if (sanitizedReference[i].search('doi:') !== -1) { + // Append doi link to array + const subReference = sanitizedReference[i].replace('doi:', '') + hyperlinks.push('http://dx.doi.org/' + subReference) + } else if (sanitizedReference[i].search('AI-1') !== -1) { + // Append static AL1 link to array + hyperlinks.push(AL1_HYPERLINK) + } + } + return hyperlinks } diff --git a/Eplant/views/InteractionsViewer/scripts/layout.ts b/Eplant/views/InteractionsViewer/scripts/layout.ts index 866392f5..5d7b65ae 100644 --- a/Eplant/views/InteractionsViewer/scripts/layout.ts +++ b/Eplant/views/InteractionsViewer/scripts/layout.ts @@ -11,7 +11,7 @@ import { LoadFlags } from '../types' let cy: Core; let loadFlags: LoadFlags; -const setLayout = (cytoscape, flags: LoadFlags) => { +const setLayout = (cytoscape: Core, flags: LoadFlags) => { cy = cytoscape loadFlags = flags if (!loadFlags.empty && cy != null) { @@ -38,7 +38,7 @@ const setLayout = (cytoscape, flags: LoadFlags) => { }, when: 'matching' }) - cy.minZoom(0.5) + cy.minZoom(0.2) cy.fit() } export default setLayout diff --git a/Eplant/views/InteractionsViewer/scripts/loadInteractions.ts b/Eplant/views/InteractionsViewer/scripts/loadInteractions.ts index b0882c38..1d103988 100644 --- a/Eplant/views/InteractionsViewer/scripts/loadInteractions.ts +++ b/Eplant/views/InteractionsViewer/scripts/loadInteractions.ts @@ -1,9 +1,11 @@ /** @format */ + import GeneticElement, { Species } from '@eplant/GeneticElement' import { Edge, Interaction, LoadFlags, NodeItem } from '../types' import loadSublocalizations from './loadSublocalizations' + let query = '' let geneticElement: GeneticElement; let loadFlags: LoadFlags = { @@ -23,8 +25,6 @@ const loadViewData = (gene: GeneticElement, data: Interaction[], recursive: stri geneticElement = gene getLoadFlags(data, recursive) loadInteractions(data) - nodes = loadSublocalizations(nodes) - return { nodes: nodes, edges: edges, @@ -733,7 +733,7 @@ const checkRecursive = (data: string | any[], recursive: string) => { */ const checkEmpty = (data: Interaction[]) => { // check for undefined - if (typeof data == 'undefined') { + if (data.length === 0) { return true } return data.length < 2 From 5b235f908e3e73c084113a4d57b917ab20aa2ae6 Mon Sep 17 00:00:00 2001 From: Yonah Aviv Date: Mon, 26 Aug 2024 11:31:51 -0400 Subject: [PATCH 03/97] topbar modified --- Eplant/views/InteractionsViewer/Topbar.tsx | 18 ++++++++---------- Eplant/views/InteractionsViewer/index.tsx | 14 ++++++++------ package-lock.json | 9 +++++++++ package.json | 1 + 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/Eplant/views/InteractionsViewer/Topbar.tsx b/Eplant/views/InteractionsViewer/Topbar.tsx index 0dbffec9..03d20e14 100644 --- a/Eplant/views/InteractionsViewer/Topbar.tsx +++ b/Eplant/views/InteractionsViewer/Topbar.tsx @@ -1,5 +1,4 @@ -import React, { useEffect, useRef } from 'react' -import { Core } from 'cytoscape' +import { FC } from 'react' import Add from '@mui/icons-material/Add' import Remove from '@mui/icons-material/Remove' @@ -9,15 +8,17 @@ import ButtonGroup from '@mui/material/ButtonGroup' import Toolbar from '@mui/material/Toolbar' import Typography from '@mui/material/Typography' -const Topbar = () => { - - const zoomValue = 1000.0 +interface TopbarProps { + gene: string +} +const Topbar: FC = ({ gene }) => { + const zoomValue = 1000 return ( {/* VIEW TITLE */} - Interactions Viewer + Interactions Viewer: {gene} {/* ZOOM CONTROLS */} { minWidth: '25px', padding: '2px', }} - onClick={ - () => {} - // zoom in - } + onClick={() => {}} > diff --git a/Eplant/views/InteractionsViewer/index.tsx b/Eplant/views/InteractionsViewer/index.tsx index 828e197d..394a93a7 100644 --- a/Eplant/views/InteractionsViewer/index.tsx +++ b/Eplant/views/InteractionsViewer/index.tsx @@ -19,6 +19,7 @@ import setLayout from './scripts/layout' import loadInteractions from './scripts/loadInteractions' import loadSublocalizations from './scripts/loadSublocalizations' import { InteractionsIcon } from './icon' +import Topbar from './Topbar' // import GeneDialog from './GeneDialog' import { Interaction, @@ -27,7 +28,6 @@ import { InteractionsViewState, ViewData, } from './types' -import Topbar from './Topbar' /*-------------------- CYTOSCAPE PLUGIN SETUP @@ -124,6 +124,8 @@ const InteractionsViewer: View = { >) { // const [cy, setCy] = useState(cytoscape()) const cyRef = useRef(null) + let cy: Core + const geneId = geneticElement?.id console.log(activeData) const viewData = activeData.viewData const elements: any = [...viewData.nodes, ...viewData.edges] @@ -305,10 +307,10 @@ const InteractionsViewer: View = { useEffect(() => { const cy: Core = cytoscape({ - container: document.getElementById('cy'), // container to render in - elements: elements, - style: styles, - }) + container: document.getElementById('cy'), // container to render in + elements: elements, + style: styles, + }) setLayout(cy, viewData.loadFlags) // Listen for mouseover events on nodes @@ -319,7 +321,7 @@ const InteractionsViewer: View = { return (
- +
Date: Sun, 15 Sep 2024 11:28:37 -0400 Subject: [PATCH 04/97] Added Legend, Added proper icons for topbar, as per design in eplant v2, --- Eplant/views/InteractionsViewer/Topbar.tsx | 128 +++++++++++++++------ thumbnails/legendAIV.png | Bin 0 -> 64669 bytes 2 files changed, 96 insertions(+), 32 deletions(-) create mode 100644 thumbnails/legendAIV.png diff --git a/Eplant/views/InteractionsViewer/Topbar.tsx b/Eplant/views/InteractionsViewer/Topbar.tsx index 03d20e14..869d5e82 100644 --- a/Eplant/views/InteractionsViewer/Topbar.tsx +++ b/Eplant/views/InteractionsViewer/Topbar.tsx @@ -1,75 +1,139 @@ -import { FC } from 'react' +import { FC, useRef, useState } from 'react' +import { Unstable_Popup as Popup } from '@mui/base/Unstable_Popup' +import { Filter, FilterAlt, QuestionMark } from '@mui/icons-material' import Add from '@mui/icons-material/Add' import Remove from '@mui/icons-material/Remove' import AppBar from '@mui/material/AppBar' +import Box from '@mui/material/Box' import Button from '@mui/material/Button' import ButtonGroup from '@mui/material/ButtonGroup' import Toolbar from '@mui/material/Toolbar' import Typography from '@mui/material/Typography' +import List from '@mui/material/List' +import ListItem from '@mui/material/ListItem' +import { ListItemText, ListSubheader, Switch } from '@mui/material' interface TopbarProps { gene: string } const Topbar: FC = ({ gene }) => { + const [showLegend, setShowLegend] = useState(false) + const legendRef = useRef(null) + const [showFilter, setShowFilter] = useState(false) + const filterRef = useRef(null) + const zoomValue = 1000 + + const handleLegendClick = () => { + setShowLegend(!showLegend) + } + const handleFilterClick = () => { + setShowFilter(!showFilter) + } return ( {/* VIEW TITLE */} - + Interactions Viewer: {gene} - {/* ZOOM CONTROLS */} - - {/* (zoom value).toFixed(0) */} - - + - + + + + + + + + ({ + maxWidth: 360, + bgcolor: theme.palette.background.default, + })} + subheader={Filter Interactions} + > + + + {}} + checked={false} + + /> + + + + {}} + checked={false} + + /> + + + + {}} + checked={false} + + /> + + + + {}} + checked={false} + + /> + + + + {}} + checked={false} + + /> + + + + ) } diff --git a/thumbnails/legendAIV.png b/thumbnails/legendAIV.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9a3e1c79b448ce0a464fbbfeaac09be6919d7f GIT binary patch literal 64669 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⋘yYX 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 literal 0 HcmV?d00001 From 8e11d0fde6e5fd79701a4b69c23ac5420468892c Mon Sep 17 00:00:00 2001 From: Yonah Aviv Date: Sun, 22 Sep 2024 14:01:55 -0400 Subject: [PATCH 05/97] 1. Tried to add load gene button to node popup, came to the conclusion its impossible with jotais capabilties (see comment on eventHandler.ts), 2. Added some filter mechanism for the edges and nodes --- .../ChromosomeViewer/Viewer/GeneInfoPopup.tsx | 1 - Eplant/views/InteractionsViewer/Topbar.tsx | 3 +- .../scripts/eventHandlers.ts | 149 +++++++++++------- .../InteractionsViewer/scripts/filterLogic.ts | 37 +++++ 4 files changed, 133 insertions(+), 57 deletions(-) create mode 100644 Eplant/views/InteractionsViewer/scripts/filterLogic.ts diff --git a/Eplant/views/ChromosomeViewer/Viewer/GeneInfoPopup.tsx b/Eplant/views/ChromosomeViewer/Viewer/GeneInfoPopup.tsx index a8b6d279..fc256b9c 100644 --- a/Eplant/views/ChromosomeViewer/Viewer/GeneInfoPopup.tsx +++ b/Eplant/views/ChromosomeViewer/Viewer/GeneInfoPopup.tsx @@ -43,7 +43,6 @@ const GeneInfoPopup: FC = (props) => { const geneticElements = useGeneticElements() const setGeneticElements = useSetGeneticElements() const theme = useTheme() - useEffect(() => { if (props.gene != gene) { setOpen(props.open) diff --git a/Eplant/views/InteractionsViewer/Topbar.tsx b/Eplant/views/InteractionsViewer/Topbar.tsx index 869d5e82..ca2b9d4d 100644 --- a/Eplant/views/InteractionsViewer/Topbar.tsx +++ b/Eplant/views/InteractionsViewer/Topbar.tsx @@ -17,6 +17,7 @@ import { ListItemText, ListSubheader, Switch } from '@mui/material' interface TopbarProps { gene: string } + const Topbar: FC = ({ gene }) => { const [showLegend, setShowLegend] = useState(false) const legendRef = useRef(null) @@ -68,7 +69,7 @@ const Topbar: FC = ({ gene }) => { - + diff --git a/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts b/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts index 43655477..7dc5d48d 100644 --- a/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts +++ b/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts @@ -1,5 +1,14 @@ import { Core } from 'cytoscape' import { PopperInstance } from 'cytoscape-popper' + +// import GeneticElement from '@eplant/GeneticElement' +// import arabidopsis from '@eplant/Species/arabidopsis' +// import { useActiveGeneId, useGeneticElements, useSetActiveGeneId, useSetGeneticElements } from '@eplant/state' +// import { GeneItem } from '@eplant/views/ChromosomeViewer/types' + +// Global + + // -------------- // Event Listeners // -------------- @@ -31,6 +40,89 @@ export const addEdgeListener = (cy: Core) => { // -------------- // Event Handlers // -------------- +// Handle load gene button click +// Tried to set jotai geneticElements atom from outside react component --> I beleieve it is impossible due to the limits of jotai copabilities +/* class LoadGene { + geneticElements = useGeneticElements() + setGeneticElements = useSetGeneticElements() + activeGeneId = useActiveGeneId() + setActiveGeneId = useSetActiveGeneId() + + public handleLoadGeneClick = (gene: GeneticElement) => { + if (gene != null) { + const geneticElement = new GeneticElement( + gene.id, + gene.annotation, + arabidopsis, + gene.aliases + ) + this.setGeneticElements([...this.geneticElements[0], geneticElement]) + this.setActiveGeneId(geneticElement.id) + } + } +} */ + + +// Handle regular node hover +const nodeMouseOverHandler = (cy: Core, event) => { + const node = event.target + const id = node._private.data.content + fetch( + 'https://bar.utoronto.ca/eplant/cgi-bin/querygene.cgi?species=Arabidopsis_thaliana&term=' + + id + ) + .then((response) => response.json()) + .then((gene) => { + const tip: PopperInstance = node.popper({ + content: () => { + const content = document.createElement('div') + + content.innerHTML = ` +
    + + + + + + + + + + + + + + + +
    ${gene.id}
    + ${gene.aliases.length > 0 ? gene.aliases.slice(0, 3) : 'N/A'} +
    + ${gene.annotation != '' ? gene.annotation : 'N/A'} +
    +
    +
    ` + return content + }, + }) + + tip.show() + destroyTip(cy, tip) + }) +} // Handle edge hover const edgeMouseOverHandler = (cy: Core, event) => { const edge = event.target @@ -118,63 +210,8 @@ const chrNodeMouseOverHandler = (cy: Core, event) => { } -// Handle regular node hover -const nodeMouseOverHandler = (cy: Core, event) => { - const node = event.target - const id = node._private.data.content - fetch( - 'https://bar.utoronto.ca/eplant/cgi-bin/querygene.cgi?species=Arabidopsis_thaliana&term=' + - id - ) - .then((response) => response.json()) - .then((gene) => { - const tip: PopperInstance = node.popper({ - content: () => { - const content = document.createElement('div') - content.innerHTML = ` -
    - - - - - - - - - - - - - -
    ${gene.id}
    - ${gene.aliases.length > 0 ? gene.aliases.slice(0, 3) : 'N/A'} -
    - ${gene.annotation != '' ? gene.annotation : 'N/A'} -
    -
    ` - return content - }, - }) - tip.show() - destroyTip(cy, tip) - }) -} const destroyTip = (cy: Core, tip: PopperInstance) => { // add handler to node for mouse leave cy.on('mouseout', 'node', (event) => { @@ -189,7 +226,9 @@ const destroyTip = (cy: Core, tip: PopperInstance) => { }) } +// -------- // Helpers +// -------- const generateLinks = (reference: string): string[] => { const AL1_HYPERLINK = 'http://interactome.dfci.harvard.edu/A_thaliana/' diff --git a/Eplant/views/InteractionsViewer/scripts/filterLogic.ts b/Eplant/views/InteractionsViewer/scripts/filterLogic.ts new file mode 100644 index 00000000..59d3149b --- /dev/null +++ b/Eplant/views/InteractionsViewer/scripts/filterLogic.ts @@ -0,0 +1,37 @@ +import { Core } from 'cytoscape' + +/* +* Applies filter to get edges matching selector +* @param {HTMLElement} checkbox The related checkbox element +* @param {Number} index The related filterStatus index +* @param {String} selector The selector by which to filter edges +* @return {boolean} The state of the related checkbox element +*/ +export const applyFilter = (cy: Core, selector) => { + const edges = cy.edges(selector); + edges.hide(); +} + + + +/** + * Clears interaction view of nodes without associated edges + * @returns {void} + */ +export const cleanNodes = (cy: Core) => { + // Get all nodes in interaction view + const nodes = cy.nodes(); + for (let n = 0; n < nodes.length; n = n + 1) { + const node = nodes[n]; + const type = node.data('id').substring(9); + + // Remove nodes with no connecting interactions + const isOrphaned = node.connectedEdges(':visible').length === 0; + + if (type === 'DNA_NODE' && isOrphaned) { + node.hide(); + } else if (type === 'PROTEIN_NODE' && isOrphaned) { + node._private.parent.hide(); + } + } +}; \ No newline at end of file From 9759b93fb438e5791950e7b9b785c2f910a1487c Mon Sep 17 00:00:00 2001 From: Yonah Aviv Date: Mon, 30 Sep 2024 13:14:48 -0400 Subject: [PATCH 06/97] Added more logic to filter, created FilterDialog.tsx --- .../views/InteractionsViewer/FilterDialog.tsx | 84 ++++++++ Eplant/views/InteractionsViewer/Topbar.tsx | 23 ++- Eplant/views/InteractionsViewer/cytoStyles.ts | 176 +++++++++++++++++ Eplant/views/InteractionsViewer/index.tsx | 181 +----------------- .../InteractionsViewer/scripts/filterLogic.ts | 4 +- 5 files changed, 286 insertions(+), 182 deletions(-) create mode 100644 Eplant/views/InteractionsViewer/FilterDialog.tsx create mode 100644 Eplant/views/InteractionsViewer/cytoStyles.ts diff --git a/Eplant/views/InteractionsViewer/FilterDialog.tsx b/Eplant/views/InteractionsViewer/FilterDialog.tsx new file mode 100644 index 00000000..1a63dd2c --- /dev/null +++ b/Eplant/views/InteractionsViewer/FilterDialog.tsx @@ -0,0 +1,84 @@ +import { FC, useState } from 'react' + +import { ListItemText, ListSubheader, Switch } from '@mui/material' +import Box from '@mui/material/Box' +import List from '@mui/material/List' +import ListItem from '@mui/material/ListItem' + +export const FilterDialog: FC = () => { + const [EPPICorrValue, setEPPICorrValue] = useState() + const [PPPICorrValue, setPPPICorrValue] = useState() + const [PPPIConfValue, setPPPIConfValue] = useState() + const [PPDIConfValue, setPPDIConfValue] = useState() + const selectors = { + EPPISelector: '[type = "PPI"][method = "E"]', // checkbox + corrSelector: '[correlation <= ', // eppi-correlation spinner + checkbox + PPPISelector: '[type = "PPI"][method = "P"]', // checkbox + interConfSelector: '[interolog_conf <=', // PPPI correlation + EPDISelector: '[type = "PDI"][method = "E"]', + PPDISelector: '[type = "PDI"][method = "P"]', + fimoConfSelector: '[fimo_conf >= ', + } + + const applyFilters = () => { + // Create selectors + const eppiCorr = + selectors.EPPISelector + selectors.corrSelector + EPPICorrValue + ']' + const pppiCorr = + selectors.PPPISelector + selectors.corrSelector + PPPICorrValue + ']' + const pppiConf = + selectors.PPPISelector + selectors.interConfSelector + PPPIConfValue + ']' + const ppdiConf = + selectors.PPDISelector + selectors.fimoConfSelector + PPDIConfValue + ']' + } + + return ( + + ({ + maxWidth: 360, + bgcolor: theme.palette.background.default, + })} + subheader={Filter Interactions} + > + + + {}} checked={false} /> + + + + {}} checked={false} /> + + + + {}} checked={false} /> + + + + {}} checked={false} /> + + + + {}} checked={false} /> + + + + ) +} diff --git a/Eplant/views/InteractionsViewer/Topbar.tsx b/Eplant/views/InteractionsViewer/Topbar.tsx index ca2b9d4d..b4f1f7b4 100644 --- a/Eplant/views/InteractionsViewer/Topbar.tsx +++ b/Eplant/views/InteractionsViewer/Topbar.tsx @@ -4,15 +4,15 @@ import { Unstable_Popup as Popup } from '@mui/base/Unstable_Popup' import { Filter, FilterAlt, QuestionMark } from '@mui/icons-material' import Add from '@mui/icons-material/Add' import Remove from '@mui/icons-material/Remove' +import { ListItemText, ListSubheader, Switch } from '@mui/material' import AppBar from '@mui/material/AppBar' import Box from '@mui/material/Box' import Button from '@mui/material/Button' import ButtonGroup from '@mui/material/ButtonGroup' -import Toolbar from '@mui/material/Toolbar' -import Typography from '@mui/material/Typography' import List from '@mui/material/List' import ListItem from '@mui/material/ListItem' -import { ListItemText, ListSubheader, Switch } from '@mui/material' +import Toolbar from '@mui/material/Toolbar' +import Typography from '@mui/material/Typography' interface TopbarProps { gene: string @@ -23,9 +23,24 @@ const Topbar: FC = ({ gene }) => { const legendRef = useRef(null) const [showFilter, setShowFilter] = useState(false) const filterRef = useRef(null) - + const selectors = { + EPPISelector: '[type = "PPI"][method = "E"]', // checkbox + corrSelector: '[correlation <= ', // eppi-correlation spinner + checkbox + PPPISelector: '[type = "PPI"][method = "P"]', // checkbox + interConfSelector: '[interolog_conf <=', // PPPI correlation + EPDISelector: '[type = "PDI"][method = "E"]', + PPDISelector: '[type = "PDI"][method = "P"]', + fimoConfSelector: '[fimo_conf >= ' +} const zoomValue = 1000 + const applyFilters = () =>{ + // Create selectors + const eppiCorr = selectors.EPPISelector + selectors.corrSelector + EPPICorrValue + ']'; + const pppiCorr = selectors.PPPISelector + selectors.corrSelector + PPPICorrValue + ']'; + const pppiConf = selectors.PPPISelector + selectors.interConfSelector + PPPIConfValue + ']'; + const ppdiConf = selectors.PPDISelector + selectors.fimoConfSelector + PPDIConfValue + ']'; + } const handleLegendClick = () => { setShowLegend(!showLegend) } diff --git a/Eplant/views/InteractionsViewer/cytoStyles.ts b/Eplant/views/InteractionsViewer/cytoStyles.ts new file mode 100644 index 00000000..54e84264 --- /dev/null +++ b/Eplant/views/InteractionsViewer/cytoStyles.ts @@ -0,0 +1,176 @@ +const styles: any = [ + { + selector: 'node', + style: { + 'text-background-shape': 'roundrectangle', + 'text-background-color': 'white', + 'text-background-opacity': 0.9, + 'background-color': '#f4f4f4', + 'font-size': '11px', + //'font-weight': 'bold', + 'text-halign': 'center', + 'border-width': '0px', + //'width': 'auto', + 'text-background-padding': '2px', + }, + }, + { + selector: '.compound-top', + style: { + shape: 'roundrectangle', + 'background-color': '#F3F3F3', + 'text-background-color': 'white', + 'text-wrap': 'wrap', + width: '300px', + color: '#000', + 'font-size': '10px', + 'font-weight': 'bold', + 'text-outline-width': '0px', + 'text-valign': 'top', + }, + }, + { + selector: '#COMPOUND_DNA', + style: { + 'background-opacity': '0', + 'text-background-opacity': '1', + label: 'Protein-DNA\nInteractions', + }, + }, + { + selector: '#COMPOUND_PROTEIN', + style: { + 'background-opacity': '0', + 'text-background-opacity': '1', + label: 'Protein-Protein\nInteractions', + }, + }, + { + selector: '.protein-compound', + style: { + 'background-opacity': 0, + events: 'no', + }, + }, + { + selector: '.protein-back[borderWidth]', + style: { + height: 'data(height)', + width: 'data(width)', + 'pie-size': '100%', + 'pie-1-background-color': 'data(pie1Colour)', + 'pie-1-background-size': 'data(pie1Size)', + 'pie-1-background-opacity': 1, + 'pie-2-background-color': 'data(pie2Colour)', + 'pie-2-background-size': 'data(pie2Size)', + 'pie-2-background-opacity': 1, + 'pie-3-background-color': 'data(pie3Colour)', + 'pie-3-background-size': 'data(pie3Size)', + 'pie-3-background-opacity': 1, + 'pie-4-background-color': 'data(pie4Colour)', + 'pie-4-background-size': 'data(pie4Size)', + 'pie-4-background-opacity': 1, + 'border-width': 'data(borderWidth)', + 'border-color': '#99CC00', + events: 'no', + }, + }, + { + selector: '.protein-node', + style: { + height: '36px', + width: '36px', + padding: '3px 3px 3px 3px', + 'text-valign': 'center', + content: 'data(content)', + events: 'yes', + 'z-index': 10, + }, + }, + { + selector: '[id $= "QUERY_BACK"]', + style: { + height: '60px', + width: '60px', + }, + }, + { + selector: '[id $= "QUERY_NODE"]', + style: { + height: '48px', + width: '48px', + 'font-size': '11px', + 'z-index': 10000000, + }, + }, + { + selector: '.dna-node', + style: { + shape: 'square', + width: '34px', + height: '34px', + 'border-width': '4px', + padding: '3px 3px 3px 3px', + 'border-color': '#030303', + 'text-valign': 'center', + content: 'data(content)', + 'z-index': 10, + }, + }, + { + selector: 'edge', + style: { + width: 'data(size)', + 'line-style': 'data(lineStyle)', + 'line-color': 'data(lineColor)', + 'control-point-distance': '50px', + 'control-point-weight': '0.5', + }, + }, + { + selector: '.protein-edge', + style: { + 'curve-style': 'bezier', + 'mid-target-arrow-shape': 'none', + }, + }, + { + selector: '.dna-edge', + style: { + 'curve-style': 'unbundled-bezier', + 'mid-target-arrow-shape': 'triangle', + 'mid-target-arrow-color': 'data(lineColor)', + }, + }, + { + selector: '.chr-edge', + style: { + 'curve-style': 'unbundled-bezier', + 'mid-target-arrow-shape': 'triangle', + 'mid-target-arrow-color': 'data(arrowColor)', + 'control-point-distance': '50px', + 'control-point-weight': '0.5', + }, + }, + { + selector: '.loaded', + style: { + 'background-color': '#3C3C3C', + 'text-background-color': '#3C3C3C', + color: '#FFFFFF', + }, + }, + { + selector: '#noInteractionLabel', + style: { + shape: 'circle', + content: 'No interactions found for this gene.', + width: '1px', + height: '1px', + color: '#000', + 'text-background-opacity': '0', + 'font-size': 15, + }, + }, +] +export default styles \ No newline at end of file diff --git a/Eplant/views/InteractionsViewer/index.tsx b/Eplant/views/InteractionsViewer/index.tsx index 394a93a7..93135dc8 100644 --- a/Eplant/views/InteractionsViewer/index.tsx +++ b/Eplant/views/InteractionsViewer/index.tsx @@ -18,8 +18,9 @@ import { addEdgeListener, addNodeListener } from './scripts/eventHandlers' import setLayout from './scripts/layout' import loadInteractions from './scripts/loadInteractions' import loadSublocalizations from './scripts/loadSublocalizations' +import cytoStyles from './cytoStyles' import { InteractionsIcon } from './icon' -import Topbar from './Topbar' +import Topbar from './Topbar.1' // import GeneDialog from './GeneDialog' import { Interaction, @@ -129,187 +130,13 @@ const InteractionsViewer: View = { console.log(activeData) const viewData = activeData.viewData const elements: any = [...viewData.nodes, ...viewData.edges] - const styles: any = [ - { - selector: 'node', - style: { - 'text-background-shape': 'roundrectangle', - 'text-background-color': 'white', - 'text-background-opacity': 0.9, - 'background-color': '#f4f4f4', - 'font-size': '11px', - //'font-weight': 'bold', - 'text-halign': 'center', - 'border-width': '0px', - //'width': 'auto', - 'text-background-padding': '2px', - }, - }, - { - selector: '.compound-top', - style: { - shape: 'roundrectangle', - 'background-color': '#F3F3F3', - 'text-background-color': 'white', - 'text-wrap': 'wrap', - width: '300px', - color: '#000', - 'font-size': '10px', - 'font-weight': 'bold', - 'text-outline-width': '0px', - 'text-valign': 'top', - }, - }, - { - selector: '#COMPOUND_DNA', - style: { - 'background-opacity': '0', - 'text-background-opacity': '1', - label: 'Protein-DNA\nInteractions', - }, - }, - { - selector: '#COMPOUND_PROTEIN', - style: { - 'background-opacity': '0', - 'text-background-opacity': '1', - label: 'Protein-Protein\nInteractions', - }, - }, - { - selector: '.protein-compound', - style: { - 'background-opacity': 0, - events: 'no', - }, - }, - { - selector: '.protein-back[borderWidth]', - style: { - height: 'data(height)', - width: 'data(width)', - 'pie-size': '100%', - 'pie-1-background-color': 'data(pie1Colour)', - 'pie-1-background-size': 'data(pie1Size)', - 'pie-1-background-opacity': 1, - 'pie-2-background-color': 'data(pie2Colour)', - 'pie-2-background-size': 'data(pie2Size)', - 'pie-2-background-opacity': 1, - 'pie-3-background-color': 'data(pie3Colour)', - 'pie-3-background-size': 'data(pie3Size)', - 'pie-3-background-opacity': 1, - 'pie-4-background-color': 'data(pie4Colour)', - 'pie-4-background-size': 'data(pie4Size)', - 'pie-4-background-opacity': 1, - 'border-width': 'data(borderWidth)', - 'border-color': '#99CC00', - events: 'no', - }, - }, - { - selector: '.protein-node', - style: { - height: '36px', - width: '36px', - padding: '3px 3px 3px 3px', - 'text-valign': 'center', - content: 'data(content)', - events: 'yes', - 'z-index': 10, - }, - }, - { - selector: '[id $= "QUERY_BACK"]', - style: { - height: '60px', - width: '60px', - }, - }, - { - selector: '[id $= "QUERY_NODE"]', - style: { - height: '48px', - width: '48px', - 'font-size': '11px', - 'z-index': 10000000, - }, - }, - { - selector: '.dna-node', - style: { - shape: 'square', - width: '34px', - height: '34px', - 'border-width': '4px', - padding: '3px 3px 3px 3px', - 'border-color': '#030303', - 'text-valign': 'center', - content: 'data(content)', - 'z-index': 10, - }, - }, - { - selector: 'edge', - style: { - width: 'data(size)', - 'line-style': 'data(lineStyle)', - 'line-color': 'data(lineColor)', - 'control-point-distance': '50px', - 'control-point-weight': '0.5', - }, - }, - { - selector: '.protein-edge', - style: { - 'curve-style': 'bezier', - 'mid-target-arrow-shape': 'none', - }, - }, - { - selector: '.dna-edge', - style: { - 'curve-style': 'unbundled-bezier', - 'mid-target-arrow-shape': 'triangle', - 'mid-target-arrow-color': 'data(lineColor)', - }, - }, - { - selector: '.chr-edge', - style: { - 'curve-style': 'unbundled-bezier', - 'mid-target-arrow-shape': 'triangle', - 'mid-target-arrow-color': 'data(arrowColor)', - 'control-point-distance': '50px', - 'control-point-weight': '0.5', - }, - }, - { - selector: '.loaded', - style: { - 'background-color': '#3C3C3C', - 'text-background-color': '#3C3C3C', - color: '#FFFFFF', - }, - }, - { - selector: '#noInteractionLabel', - style: { - shape: 'circle', - content: 'No interactions found for this gene.', - width: '1px', - height: '1px', - color: '#000', - 'text-background-opacity': '0', - 'font-size': 15, - }, - }, - ] + const styles = cytoStyles useEffect(() => { const cy: Core = cytoscape({ container: document.getElementById('cy'), // container to render in elements: elements, - style: styles, + style: cytoStyles, }) setLayout(cy, viewData.loadFlags) diff --git a/Eplant/views/InteractionsViewer/scripts/filterLogic.ts b/Eplant/views/InteractionsViewer/scripts/filterLogic.ts index 59d3149b..32b9ec64 100644 --- a/Eplant/views/InteractionsViewer/scripts/filterLogic.ts +++ b/Eplant/views/InteractionsViewer/scripts/filterLogic.ts @@ -1,5 +1,7 @@ import { Core } from 'cytoscape' + + /* * Applies filter to get edges matching selector * @param {HTMLElement} checkbox The related checkbox element @@ -7,7 +9,7 @@ import { Core } from 'cytoscape' * @param {String} selector The selector by which to filter edges * @return {boolean} The state of the related checkbox element */ -export const applyFilter = (cy: Core, selector) => { +export const applyFilter = (cy: Core, selector: string) => { const edges = cy.edges(selector); edges.hide(); } From 22a531bf39da83dd95436cbb8f88961ef688c86c Mon Sep 17 00:00:00 2001 From: bdls-jamal Date: Mon, 7 Oct 2024 21:09:06 -0400 Subject: [PATCH 07/97] s --- Eplant/config.ts | 2 + Eplant/views/KobiTestView/NavigatorView.tsx | 141 ++++ Eplant/views/KobiTestView/d3.phylogram.js | 811 ++++++++++++++++++ Eplant/views/KobiTestView/index.tsx | 20 + Eplant/views/KobiTestView/placeholder.tsx | 141 ++++ package-lock.json | 881 +++++++++++++++++++- package.json | 8 +- 7 files changed, 1996 insertions(+), 8 deletions(-) create mode 100644 Eplant/views/KobiTestView/NavigatorView.tsx create mode 100644 Eplant/views/KobiTestView/d3.phylogram.js create mode 100644 Eplant/views/KobiTestView/index.tsx create mode 100644 Eplant/views/KobiTestView/placeholder.tsx diff --git a/Eplant/config.ts b/Eplant/config.ts index 8ef5012c..6ac90ecc 100644 --- a/Eplant/config.ts +++ b/Eplant/config.ts @@ -7,6 +7,7 @@ import ExperimentEFP from './views/ExperimentEFP' import FallbackView from './views/FallbackView' import GeneInfoView from './views/GeneInfoView' import GetStartedView from './views/GetStartedView' +import NavigatorView from './views/KobiTestView' import PlantEFP from './views/PlantEFP' import PublicationViewer from './views/PublicationViewer' import { type View } from './View' @@ -33,6 +34,7 @@ const userViews = [ CellEFP, ExperimentEFP, ChromosomeViewer, + NavigatorView, ] // List of views that are used to lookup a view by id diff --git a/Eplant/views/KobiTestView/NavigatorView.tsx b/Eplant/views/KobiTestView/NavigatorView.tsx new file mode 100644 index 00000000..27f92503 --- /dev/null +++ b/Eplant/views/KobiTestView/NavigatorView.tsx @@ -0,0 +1,141 @@ +import React, { useEffect, useState } from 'react'; +import { parse } from "newick-js"; +import Tree from 'react-d3-tree'; + +interface NodeData { + name: string; + attributes?: { + length?: number; + }; + children?: NodeData[]; +} + +interface CustomNodeProps { + nodeDatum: NodeData; + toggleNode: () => void; +} + +const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { + // Determine if this is a leaf node + const isLeafNode = !nodeDatum.children || nodeDatum.children.length === 0; + + return ( + + + + {/* Only render text if there's a valid gene name */} + {nodeDatum.name && nodeDatum.name !== "Unnamed" && ( + + {nodeDatum.name} + + )} + + {/* Show "Expression Data" only for leaf nodes */} + {isLeafNode && ( + +
    +
    + Expression Data +
    +
    +
    + )} +
    + ); +}; + +const NavigatorView = () => { + const [treeData, setTreeData] = useState(null); + + const containerStyles: React.CSSProperties = { + width: '100%', + height: '500px', + }; + + useEffect(() => { + const newickData = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; + + try { + const parsedTree = parse(newickData); + const vertices = Array.from(parsedTree.graph[0]); + const rootVertex = vertices.find(vertex => + !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) + ); + + const formatTreeData = (vertex: any): NodeData => { + const node: NodeData = { + name: vertex.label || vertex.name || "", // Changed to empty string instead of "Unnamed" + attributes: { + length: vertex.length || 0, + }, + children: [], + }; + + const childArcs = Array.from(parsedTree.graph[1]) + .filter(arc => arc[0] === vertex); + + if (childArcs.length === 0) { + // For leaf nodes, extend the branch length to ensure alignment + node.attributes!.length = Math.max(node.attributes?.length || 0, 0.6); + } + + childArcs.forEach(arc => { + const childVertex = arc[1]; + const childNode = formatTreeData(childVertex); + node.children?.push(childNode); + }); + + return node; + }; + + if (rootVertex) { + const formattedData = formatTreeData(rootVertex); + setTreeData(formattedData); + } + } catch (error) { + console.error("Error parsing Newick data:", error); + setTreeData(null); + } + }, []); + + const renderCustomNode = (props: CustomNodeProps) => ; + + return ( +
    +

    Phylogenetic Tree

    + {treeData ? ( +
    + +
    + ) : ( +

    Loading...

    + )} +
    + ); +}; + +export default NavigatorView; diff --git a/Eplant/views/KobiTestView/d3.phylogram.js b/Eplant/views/KobiTestView/d3.phylogram.js new file mode 100644 index 00000000..862564e6 --- /dev/null +++ b/Eplant/views/KobiTestView/d3.phylogram.js @@ -0,0 +1,811 @@ +/* + d3.phylogram.js + Wrapper around a d3-based phylogram (tree where branch lengths are scaled) + Also includes a radial dendrogram visualization (branch lengths not scaled) + along with some helper methods for building angled-branch trees. + + Copyright (c) 2013, Ken-ichi Ueda + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. 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. + + 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. + + DOCUEMENTATION + + d3.phylogram.build(selector, nodes, options) + Creates a phylogram. + Arguments: + selector: selector of an element that will contain the SVG + nodes: JS object of nodes (JSON) + Options: + width + Width of the vis, will attempt to set a default based on the width of + the container. + height + Height of the vis, will attempt to set a default based on the height + of the container. + vis + Pre-constructed d3 vis. + tree + Pre-constructed d3 tree layout. + children + Function for retrieving an array of children given a node. Default is + to assume each node has an attribute called "branchset" + diagonal + Function that creates the d attribute for an svg:path. Defaults to a + right-angle diagonal. + skipTicks + Skip the tick rule. ticks: measurements in grey vertical lines + skipBranchLengthScaling + Make a dendrogram instead of a phylogram. + + d3.phylogram.buildRadial(selector, nodes, options) + Creates a radial dendrogram. + Options: same as build, but without diagonal, skipTicks, and + skipBranchLengthScaling + + d3.phylogram.rightAngleDiagonal() + Similar to d3.diagonal except it create an orthogonal crook instead of a + smooth Bezier curve. + + d3.phylogram.radialRightAngleDiagonal() + d3.phylogram.rightAngleDiagonal for radial layouts. +*/ + +import * as d3 from 'd3'; + +if (!d3) { throw "d3 wasn't included!"}; +(function() { + + d3.phylogram.rightAngleDiagonal = function() { + var projection = function(d) { return [d.y, d.x]; } + + var path = function(pathData) { + return "M" + pathData[0] + ' ' + pathData[1] + " " + pathData[2]; + } + + function diagonal(diagonalPath, i) { + var source = diagonalPath.source, + target = diagonalPath.target, + midpointX = (source.x + target.x) / 2, + midpointY = (source.y + target.y) / 2, + pathData = [source, {x: target.x, y: source.y}, target]; + pathData = pathData.map(projection); + return path(pathData) + } + + diagonal.projection = function(x) { + if (!arguments.length) return projection; + projection = x; + return diagonal; + }; + + diagonal.path = function(x) { + if (!arguments.length) return path; + path = x; + return diagonal; + }; + + return diagonal; + } + + // Convert XY and radius to angle of a circle centered at 0,0 + d3.phylogram.coordinateToAngle = function(coord, radius) { + var wholeAngle = 2 * Math.PI, + quarterAngle = wholeAngle / 4 + + var coordQuad = coord[0] >= 0 ? (coord[1] >= 0 ? 1 : 2) : (coord[1] >= 0 ? 4 : 3), + coordBaseAngle = Math.abs(Math.asin(coord[1] / radius)) + + let coordAngle; + + // Since this is just based on the angle of the right triangle formed + // by the coordinate and the origin, each quad will have different + // offsets + switch (coordQuad) { + + case 1: + coordAngle = quarterAngle - coordBaseAngle + break + case 2: + coordAngle = quarterAngle + coordBaseAngle + break + case 3: + coordAngle = 2*quarterAngle + quarterAngle - coordBaseAngle + break + case 4: + coordAngle = 3*quarterAngle + coordBaseAngle + } + return coordAngle + } + + d3.phylogram.styleTreeNodes = function(vis) { + vis.selectAll('g.leaf.node') + .append("svg:circle") + .attr("r", 4.5) + .attr('fill', '#99cc00') //BEN CHANGED (removed stroke and changed color of fill) + .attr('stroke-width', '2px'); + + vis.selectAll('g.root.node') + .append('svg:circle') + .attr("r", 4.5) + .attr('fill', 'steelblue') + .attr('stroke', '#369') + .attr('stroke-width', '2px'); + + } + + function scaleBranchLengths(nodes, w) { + // Visit all nodes and adjust y pos width distance metric + var visitPreOrder = function(root, callback) { + callback(root) + if (root.children) { + for (var i = root.children.length - 1; i >= 0; i--){ + visitPreOrder(root.children[i], callback) + }; + } + } + visitPreOrder(nodes[0], function(node) { + node.rootDist = (node.parent ? node.parent.rootDist : 0) + (node.length || 0) + }) + var rootDists = nodes.map(function(n) { return n.rootDist; }); + var yscale = d3.scale.linear() + .domain([0, d3.max(rootDists)]) + .range([0, w]); + visitPreOrder(nodes[0], function(node) { + node.y = yscale(node.rootDist) + }) + return yscale + } + + // phylogram build function + d3.phylogram.build = function(selector, nodes, q, eFPLinks, gens, scc, seq, options) { + options = options || {} + var w = options.width || d3.select(selector).style('width') || d3.select(selector).attr('width'), + h = options.height || d3.select(selector).style('height') || d3.select(selector).attr('height') + w = parseInt(w), + h = parseInt(h); + var tree = options.tree || d3.layout.cluster() + .size([h, w]) + .sort(function(node) { return node.children ? node.children.length : -1; }) + .children(options.children || function(node) { + return node.branchset + }); + var diagonal = options.diagonal || d3.phylogram.rightAngleDiagonal(); + var vis = options.vis || d3.select(selector).append("svg:svg") + .attr("width", w + 1000) // to change width/height of container + .attr("height", h + 50) + .append("svg:g") + .attr("transform", "translate(20, 20)"); + nodes = tree(nodes); + //var eFPLinks = eFPLinks; + var genomes = gens; + var sccValues = scc; + var seqValues = seq; + var query = q; + + + //hidden until made visible by being active + d3.select(selector).style("visibility", "hidden"); + + if (!options.skipBranchLengthScaling) { + var yscale = d3.scale.linear() + .domain([0, w]) + .range([0, w]); + } + + var link = vis.selectAll("path.link") + .data(tree.links(nodes)) + .enter().append("svg:path") + .attr("class", "link") + .attr("d", diagonal) + .attr("fill", "none") + .attr("stroke", "#aaa") + .attr("stroke-width", "4px"); + + var node = vis.selectAll("g.node") + .data(nodes) + .enter().append("svg:g") + .attr("class", function(n) { + if (n.children) { + if (n.depth == 0) { + return "root node" + } else { + return "inner node" + } + } else { + return "leaf node" + } + }) + .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; }) + + d3.phylogram.styleTreeNodes(vis) + + if (!options.skipLabels) { + nodes = vis.selectAll('g.inner.node') + .append("svg:text") + .attr("dx", -6) + .attr("dy", -6) + .attr("text-anchor", 'end') + .attr('font-size', '8px') + .attr('fill', '#ccc') + .text(function(d) { return d.length; }); + + var leafNode = vis.selectAll('g.leaf.node'); + + var showAll = vis.select("#button") + .append("svg:svg") + +// var hover = leafNode +// .on({ +// "mouseover": function(d) { +// d3.select(this).style("cursor", "auto") +// // species.filter(function(p){ +// // if(p == d) +// // d3.select(this) +// // .style("cursor", "default") +// // .style("visibility", "visible") +// // .transition() +// // .style("opacity", 1); +// // +// // else d3.select(this) +// // .transition() +// // .style("opacity", 0); +// // }) +// icons.filter(function(p){ +// if(p == d) +// d3.select(this) +// .style("visibility", "visible") +// .transition() +// .style("opacity", 1); +// +// else d3.select(this) +// .transition() +// .style("opacity", 0); +// }); +// }, +// "mouseout": function(d) { +// d3.select(this).style("cursor", "default") +// } +// }); + var first = true; + +// d3.select("#button").text("clear all"); +// d3.select("#button") +// .on("click", function() { +// if (icons.style("visibility") == "visible") { +// d3.select(this).text("show all"); +// icons.style("visibility", "visible") //hidden +// // species.style("visibility", "hidden") +// hover = leafNode +// .on({ +// "mouseover": function(d) { +// d3.select(this).style("cursor", "pointer") +// // species.filter(function(p){ +// // if(p == d) +// // d3.select(this) +// // .style("cursor", "default") +// // .style("visibility", "visible") +// // .transition() +// // .style("opacity", 1); +// // +// // else d3.select(this) +// // .transition() +// // .style("opacity", 0); +// // }) +// icons.filter(function(p){ +// if(p == d) +// d3.select(this) +// .style("visibility", "visible") +// .transition() +// .style("opacity", 1); +// +// else d3.select(this) +// .transition() +// .style("opacity", 0); +// }); +// }, +// "mouseout": function(d) { +// d3.select(this).style("cursor", "default") +// } +// }); +// +// +// } +// else if (icons.style("visibility") == "hidden") { +// d3.select(this).text("hide all"); +// icons.style("visibility", "visible") +// +// .style("opacity", 1) +// // species.style("visibility", "visible") +// // .style("opacity", 1); +// hover.on("mouseover", null); +// hover.on("mouseout",null); +// +// +// } +// }); + + var label = leafNode.append("svg:text") + .attr("dx", 8) + .attr("dy", 4) + .attr("text-anchor", "start") + .attr('font-family', 'Helvetica Neue, Helvetica, sans-serif') + .attr('font-size', '15px') + .attr('fill', 'black') + .style("font-weight", function(d) { + if (d.name === query) { + return "bold" + } + }) + + .text(function(d) { return d.name}); //+ ' ('+ d.length +')' + + + // vars for concatenation + var titleData = ["World", "Plant", "Cell", "Molecule", "Interactions"]; + var generalURL = "http://bar.utoronto.ca/eplant/?ActiveSpecies=Arabidopsis%20thaliana&Genes="; + var cogeURL = "https://genomevolution.org/CoGe/GEvo.pl?accn1="; + var grameneURL = "http://ensembl.gramene.org/Arabidopsis_thaliana/Gene/Summary?g="; + + + var species = leafNode.append("svg:text") + .attr("dx", 300) + .attr("dy", 3) + .attr("text-anchor", "end") + .attr('font-family', 'Helvetica Neue, Helvetica, sans-serif') + .attr('font-size', '14px') + .style("font-weight", "bold") + .attr('fill', function(d) { + if (genomes[d.name] == "GRAPE") { + return "gray"; + } + else if (genomes[d.name] == "POP") { + return "gray"; + } + else if (genomes[d.name] == "MED") { + return "red"; + } + else if (genomes[d.name] == "SOYBEAN") { + return "cornflowerblue"; + } + else if (genomes[d.name] == "POTATO") { + return "darkolivegreen"; + } + else if (genomes[d.name] == "TOMATO") { + return "orange"; + } + else if (genomes[d.name] == "RICE") { + return "green"; + } + else if (genomes[d.name] == "MAIZE") { + return "turquoise"; + } + else if (genomes[d.name] == "BARLEY") { + return "gold"; + } + else if (genomes[d.name] == "ARABIDOPSIS") { + return "black"; + } + else { + return "black"; + } + }) + //.style("visibility", "visible") + .text(function(d) { + // if (d.name == query) { + // return "QUERY"; + // } + // else + if (d.name.substr(0,2) == "AT") { + return "ARABIDOPSIS"; + } + else { + return genomes[d.name]; + } + }); + + var icons = leafNode.append("svg") + .attr("x", 320) + .attr("y", -11) + .attr("align", "right"); + // .style("visibility", "visible"); ///hidden + + var seqTip = d3.tip() + .attr('class', 'd3-tip') + .style("font-size", "13px") + .style("margin-top", "0px") + .style("background-color", "yellowgreen") + .style("color", "white") + .offset([-10, 0]) + .html(function(d) { + if (d.name != query) { + return "  Sequence similarity: " + seqValues[d.name] + "  "; + } + else { + return "  Sequence similarity: " + 100 + "  "; + } + + }); + + icons.call(seqTip); + + seq = leafNode.append("svg:g") + .on('mouseover', seqTip.show) + .on('mouseout', seqTip.hide); + + + var seqBarsWhole = seq.append("rect") + .attr("x", 325) + .attr("y", -7) + .attr("width", 50) + .attr("height", 10) + .attr("fill", "gray"); + + + var seqBars = seq.append("rect") + .attr("x", 325) + .attr("y", -7) + .attr("fill", "black") + .attr("width", function(d) { + if (d.name != query) { + return (seqValues[d.name])/2; + } + else { + return 50; + } + + }) + .attr("height", 10); + + + var titleSeq = vis.append("svg:text") + .attr("dx", 480) + .attr("dy", 0) //BEN CHANGED 9 => 0 + .attr("text-anchor", "start") + .attr('font-family', 'Helvetica Neue, Helvetica, sans-serif') + .attr('font-size', '11px') + .attr('fill', 'black') + .text("SEQUENCE"); + + var titleScc = vis.append("svg:text") + .attr("dx", 552) + .attr("dy", 0) //BEN CHANGED 9 => 0 + .attr("text-anchor", "start") + .attr('font-family', 'Helvetica Neue, Helvetica, sans-serif') + .attr('font-size', '11px') + .attr('fill', 'black') + .text("EXPRESSION"); + + + var sccTip = d3.tip() + .attr('class', 'd3-tip') + .style("font-size", "13px") + .style("margin-top", "0px") + .style("background-color", "yellowgreen") + .style("color", "white") + .offset([-10, 0]) + .html(function(d) { + if (d.name != query) { + return "  Expression similarity: " + sccValues[d.name] + "  "; + } + else { + return "  Expression similarity: " + 1 + "  "; + } + }); + + icons.call(sccTip); + + scc = leafNode.append("svg:g") + .on('mouseover', sccTip.show) + .on('mouseout', sccTip.hide); + + var sccBarsWhole = scc.append("rect") + .attr("x", 402) + .attr("y", -7) + .attr("width", 52) + .attr("height", 10) + .attr("fill", "gray"); + + var sccDivider = scc.append("rect") + .attr("x", 428) + .attr("y", -12) + .attr("width", 1) + .attr("height", 20) + .attr("fill", "red"); + + var negSccBars = scc.append("rect") + .attr("fill", function(d) { // if negative, lighter colour + if (sccValues[d.name] < 0) { + return "darkslategray"; + } + else { + return "black"; + } + }) + .attr("width", function(d) { + if (sccValues[d.name] < 0) { // negative value + return Math.abs(sccValues[d.name]) * 25; + } + else if (sccValues[d.name] > 0) { + return sccValues[d.name] * 25; + } + else if (d.name == query) { + return 27; + } + else { + return 0; + } + }) + .attr("x", function(d) { + if (sccValues[d.name] < 0) { // negative value + return 428 - Math.abs(sccValues[d.name]) * 25; + } + else if (sccValues[d.name] > 0) { + return 429; + } + else if (d.name == query) { + return 429; + } + else { + return 0; + } + }) + .attr("y", -7) + .attr("height", 10); + +// var sccBars = scc.append("rect") +// .attr("x", 402) +// .attr("y", -7) +// .attr("fill", "black") +// .attr("width", function(d) { +// if (sccValues[d.name] < 0) { +// return Math.abs(sccValues[d.name]) * 50; +// } +// else if (sccValues[d.name] > 0) { +// return (sccValues[d.name] * 25 + 1) * 2; +// } +// else if (d.name == query) { +// return 50; +// } +// else { +// return 0; +// } +// }) +// .attr("height", 10); + + + + + + var worldTip = d3.tip() + .attr('class', 'd3-tip') + .style("font-size", "13px") + .style("margin-top", "0px") + .style("background-color", "yellowgreen") + .style("color", "white") + .offset([-10, 0]) + .html(function(d) { + if (d.name.substr(0,2) != "AT") {return "  Coming soon!  ";} + else {return "  " + titleData[0] + "  ";}; + }); + + icons.call(worldTip); + + var worldEFP = icons.append("a") + .attr("xlink:href", function(d) { + return generalURL + d.name + "&ActiveGene=" + d.name + "&ActiveView=" + "WorldView"; + }) + .attr("target", "_blank") + .append("image") + .attr("xlink:href", function(d) {return 'img/available/world.png';}) + + .attr("x", 150) + .attr("y", 0) + .attr("height", 20) + .attr("width", 20) + .style("opacity", function (d) { + // for non-arabidopsis, gray out all icons but plant + if (d.name.substr(0,2) != "AT") {return "0.2";} + + }) + .on('mouseover', worldTip.show) + .on('mouseout', worldTip.hide); + + + + var plantTip = d3.tip() + .attr('class', 'd3-tip') + .style("font-size", "13px") + .style("margin-top", "0px") + .style("background-color", "yellowgreen") + .style("color", "white") + .offset([-10, 0]) + .html("  " + titleData[1] + "  "); + + icons.call(plantTip); + + var plantEFP = icons.append("a") + .attr("xlink:href", function(d) { + if (d.name.substr(0,2) != "AT") { + return eFPLinks[d.name]; + } + else { + return generalURL + d.name + "&ActiveGene=" + d.name + "&ActiveView=" + "PlantView"; + } + + }) + .attr("target", "_blank") + .append("image") + .attr("xlink:href", function(d) { return 'img/available/plant.png';}) + .attr("x", 185) + .attr("y", 0) + .attr("height", 20) + .attr("width", 20) + .on('mouseover', plantTip.show) + .on('mouseout', plantTip.hide); + + var cellTip = d3.tip() + .attr('class', 'd3-tip') + .style("font-size", "13px") + .style("margin-top", "0px") + .style("background-color", "yellowgreen") + .style("color", "white") + .offset([-10, 0]) + .html(function (d) { + // for non-arabidopsis, say that it's coming soon + if (d.name.substr(0,2) != "AT") {return "  Coming soon!  ";} + else {return "  " + titleData[2] + "  ";} + }); + + icons.call(cellTip); + + var cellEFP = icons.append("a") + .attr("xlink:href", function(d) { + return generalURL + d.name + "&ActiveGene=" + d.name + "&ActiveView=" + "CellView"; + }) + .attr("target", "_blank") + .append("svg:image") + .attr("xlink:href", function(d) { return 'img/available/cell.png';}) + .attr("x", 220) + .attr("y", 0) + .attr("height", 20) + .attr("width", 20) + .style("opacity", function (d) { + // for non-arabidopsis, gray out all icons but plant + if (d.name.substr(0,2) != "AT") {return "0.2";} + }) + .on('mouseover', cellTip.show) + .on('mouseout', cellTip.hide); + + var molTip = d3.tip() + .attr('class', 'd3-tip') + .style("font-size", "13px") + .style("margin-top", "0px") + .style("background-color", "yellowgreen") + .style("color", "white") + .offset([-10, 0]) + .html(function (d) { + // for non-arabidopsis, say that it's coming soon + if (d.name.substr(0,2) != "AT") {return "  Coming soon!  ";} + else {return "  " + titleData[3] + "  ";} + }); + + icons.call(molTip); + + var moleculeviewer = icons.append("a") + .attr("xlink:href", function(d) { + return generalURL + d.name + "&ActiveGene=" + d.name + "&ActiveView=" + "MoleculeView"; + }) + .attr("target", "_blank") + .append("svg:image") + .attr("xlink:href", function(d) { return 'img/available/molecule.png';}) + .attr("x", 255) + .attr("y", 0) + .attr("height", 20) + .attr("width", 20) + .style("opacity", function (d) { + // for non-arabidopsis, gray out all icons but plant + if (d.name.substr(0,2) != "AT") {return "0.2";} + }) + .on('mouseover', molTip.show) + .on('mouseout', molTip.hide); + + + var intTip = d3.tip() + .attr('class', 'd3-tip') + .style("font-size", "13px") + .style("margin-top", "0px") + .style("background-color", "yellowgreen") + .style("color", "white") + .offset([-10, 0]) + .html(function (d) { + // for non-arabidopsis, say that it's coming soon + if (d.name.substr(0,2) != "AT") {return "  Coming soon!  ";} + else {return "  " + titleData[4] + "  ";} + }); + + icons.call(intTip); + + var interactionviewer = icons.append("a") + .attr("xlink:href", function(d) { + return generalURL + d.name + "&ActiveGene=" + d.name + "&ActiveView=" + "InteractionView"; + }) + .attr("target", "_blank") + .append("svg:image") + .attr("xlink:href", function(d) { return 'img/available/interaction.png';}) + .attr("x", 290) + .attr("y", 0) + .attr("height", 20) + .attr("width", 20) + .style("opacity", function (d) { + // for non-arabidopsis, gray out all icons but plant + if (d.name.substr(0,2) != "AT") {return "0.2";} + }) + .on('mouseover', intTip.show) + .on('mouseout', intTip.hide); + + } + + var coge = icons.append("a") + .attr("xlink:href", function(d) { + if (d.name != query) + { + return cogeURL + query + ";accn2=" + d.name + ";num_seqs=2;autogo=1"; + } + }) + .attr("target", "_blank") + .append("svg:text") + .attr("dx", 327) + .attr("dy", 18) + .attr("height", 20) + .attr("width", 20) + .style("font-size","12px") + .style("visibility", function (d) { + // for non-arabidopsis, gray out all icons but plant + if (d.name === query) {return "hidden";} + }) + .text("CoGE"); + + var gramene = icons.append("a") + .attr("xlink:href", function(d) { + if (d.name != query) + { + return grameneURL + d.name; + } + }) + .attr("target", "_blank") + .append("svg:text") + .attr("dx", 368) + .attr("dy", 18) + .attr("height", 20) + .attr("width", 20) + .style("font-size","12px") + .style("visibility", function (d) { + // for non-arabidopsis, gray out all icons but plant + if (d.name === query) {return "hidden";} + }) + .text("Gramene"); + return {tree: tree, vis: vis} + } + +}()); diff --git a/Eplant/views/KobiTestView/index.tsx b/Eplant/views/KobiTestView/index.tsx new file mode 100644 index 00000000..4059a47b --- /dev/null +++ b/Eplant/views/KobiTestView/index.tsx @@ -0,0 +1,20 @@ +// index.ts + +import * as React from 'react'; + +import { View } from '@eplant/View'; +import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; + +import NavigatorView from './NavigatorView'; // Import the new NavigatorView component + +const KobiTestView: View = { + name: 'Navigator View', + component: NavigatorView, // Use the NavigatorView as the component + async getInitialData() { + return null; + }, + id: 'navigator-view', + icon: () => , +}; + +export default KobiTestView; diff --git a/Eplant/views/KobiTestView/placeholder.tsx b/Eplant/views/KobiTestView/placeholder.tsx new file mode 100644 index 00000000..27f92503 --- /dev/null +++ b/Eplant/views/KobiTestView/placeholder.tsx @@ -0,0 +1,141 @@ +import React, { useEffect, useState } from 'react'; +import { parse } from "newick-js"; +import Tree from 'react-d3-tree'; + +interface NodeData { + name: string; + attributes?: { + length?: number; + }; + children?: NodeData[]; +} + +interface CustomNodeProps { + nodeDatum: NodeData; + toggleNode: () => void; +} + +const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { + // Determine if this is a leaf node + const isLeafNode = !nodeDatum.children || nodeDatum.children.length === 0; + + return ( + + + + {/* Only render text if there's a valid gene name */} + {nodeDatum.name && nodeDatum.name !== "Unnamed" && ( + + {nodeDatum.name} + + )} + + {/* Show "Expression Data" only for leaf nodes */} + {isLeafNode && ( + +
    +
    + Expression Data +
    +
    +
    + )} +
    + ); +}; + +const NavigatorView = () => { + const [treeData, setTreeData] = useState(null); + + const containerStyles: React.CSSProperties = { + width: '100%', + height: '500px', + }; + + useEffect(() => { + const newickData = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; + + try { + const parsedTree = parse(newickData); + const vertices = Array.from(parsedTree.graph[0]); + const rootVertex = vertices.find(vertex => + !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) + ); + + const formatTreeData = (vertex: any): NodeData => { + const node: NodeData = { + name: vertex.label || vertex.name || "", // Changed to empty string instead of "Unnamed" + attributes: { + length: vertex.length || 0, + }, + children: [], + }; + + const childArcs = Array.from(parsedTree.graph[1]) + .filter(arc => arc[0] === vertex); + + if (childArcs.length === 0) { + // For leaf nodes, extend the branch length to ensure alignment + node.attributes!.length = Math.max(node.attributes?.length || 0, 0.6); + } + + childArcs.forEach(arc => { + const childVertex = arc[1]; + const childNode = formatTreeData(childVertex); + node.children?.push(childNode); + }); + + return node; + }; + + if (rootVertex) { + const formattedData = formatTreeData(rootVertex); + setTreeData(formattedData); + } + } catch (error) { + console.error("Error parsing Newick data:", error); + setTreeData(null); + } + }, []); + + const renderCustomNode = (props: CustomNodeProps) => ; + + return ( +
    +

    Phylogenetic Tree

    + {treeData ? ( +
    + +
    + ) : ( +

    Loading...

    + )} +
    + ); +}; + +export default NavigatorView; diff --git a/package-lock.json b/package-lock.json index 819c43db..a5b1da64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,12 +25,15 @@ "@types/react-router-dom": "^5.3.3", "axios": "^1.5.1", "color2k": "^2.0.2", + "d3": "^7.9.0", "dompurify": "^3.0.6", "flexlayout-react": "^0.7.11", "idb": "^7.1.1", "jotai": "^2.4.3", "lodash": "^4.17.21", - "react": "^18.2.0", + "newick-js": "^1.2.1", + "react": "^18.3.1", + "react-d3-tree": "^3.6.2", "react-dom": "^18.2.0", "react-router-dom": "^6.16.0", "react-window": "^1.8.9" @@ -40,6 +43,7 @@ "@testing-library/jest-dom": "^6.1.3", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.5.1", + "@types/d3": "^7.4.3", "@types/dompurify": "^3.0.3", "@types/jest": "^29.5.5", "@types/lodash": "^4.14.199", @@ -630,6 +634,33 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@bkrem/react-transition-group": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@bkrem/react-transition-group/-/react-transition-group-1.3.3.tgz", + "integrity": "sha512-nUZaumHu/MMolELv+MhEEQzQtKsnfpbKBHtam/NK53tGICwU19tuffEXW8BLhm9HhQfN1H3+C0bsJv8Z7vzwEA==", + "license": "BSD-3-Clause", + "dependencies": { + "chain-function": "^1.0.0", + "dom-helpers": "^3.3.1", + "loose-envify": "^1.3.1", + "prop-types": "^15.5.6", + "react-lifecycles-compat": "^3.0.4", + "warning": "^3.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@bkrem/react-transition-group/node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz", @@ -3260,6 +3291,289 @@ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.11.tgz", + "integrity": "sha512-lnQiU7jV+Gyk9oQYk0GGYccuexmQPTp08E0+4BidgFdiJivjEvf+esPSdZqCZ2C7UwTWejWpqetVaU8A+eX3FA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -3305,6 +3619,13 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -4856,6 +5177,12 @@ } ] }, + "node_modules/chain-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz", + "integrity": "sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==", + "license": "MIT" + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5338,6 +5665,428 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -5533,6 +6282,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5541,6 +6299,15 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -7415,6 +8182,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -10664,6 +11440,12 @@ "dev": true, "peer": true }, + "node_modules/newick-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/newick-js/-/newick-js-1.2.1.tgz", + "integrity": "sha512-qyZVNtlXmORBf2w9vg2S/5N5mQlU46xDFdPX7SEDZTeSElafNQUelNzR7HWSKcVOpjXiDnBqkvjd5RlEG7/SEA==", + "license": "MIT" + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -11467,9 +12249,10 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -11492,6 +12275,57 @@ "lodash.curry": "^4.1.1" } }, + "node_modules/react-d3-tree": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/react-d3-tree/-/react-d3-tree-3.6.2.tgz", + "integrity": "sha512-1ExQlmEnv5iOw9XfZ3EcESDjzGXVKPAmyDJTJbvVfiwkplZtP7CcNEY0tKZf4XSW0FzYJf4aFXprGJen+95yuw==", + "license": "MIT", + "dependencies": { + "@bkrem/react-transition-group": "^1.3.3", + "@types/d3-hierarchy": "^1.1.8", + "clone": "^2.1.1", + "d3-hierarchy": "^1.1.9", + "d3-selection": "^3.0.0", + "d3-shape": "^1.3.7", + "d3-zoom": "^3.0.0", + "dequal": "^2.0.2", + "uuid": "^8.3.1" + }, + "peerDependencies": { + "react": "16.x || 17.x || 18.x", + "react-dom": "16.x || 17.x || 18.x" + } + }, + "node_modules/react-d3-tree/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/react-d3-tree/node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", + "license": "BSD-3-Clause" + }, + "node_modules/react-d3-tree/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/react-d3-tree/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -11559,6 +12393,12 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -11959,6 +12799,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, "node_modules/rollup": { "version": "3.29.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", @@ -12007,6 +12853,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -12074,8 +12926,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/saxes": { "version": "6.0.0", @@ -13485,6 +14336,15 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -13624,6 +14484,15 @@ "makeerror": "1.0.12" } }, + "node_modules/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", + "license": "BSD-3-Clause", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", diff --git a/package.json b/package.json index 31965b27..a751e08b 100644 --- a/package.json +++ b/package.json @@ -31,12 +31,15 @@ "@types/react-router-dom": "^5.3.3", "axios": "^1.5.1", "color2k": "^2.0.2", + "d3": "^7.9.0", "dompurify": "^3.0.6", "flexlayout-react": "^0.7.11", "idb": "^7.1.1", "jotai": "^2.4.3", "lodash": "^4.17.21", - "react": "^18.2.0", + "newick-js": "^1.2.1", + "react": "^18.3.1", + "react-d3-tree": "^3.6.2", "react-dom": "^18.2.0", "react-router-dom": "^6.16.0", "react-window": "^1.8.9" @@ -46,6 +49,7 @@ "@testing-library/jest-dom": "^6.1.3", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.5.1", + "@types/d3": "^7.4.3", "@types/dompurify": "^3.0.3", "@types/jest": "^29.5.5", "@types/lodash": "^4.14.199", @@ -82,4 +86,4 @@ "vite-plugin-eslint": "^1.8.1", "vite-tsconfig-paths": "^4.2.1" } -} \ No newline at end of file +} From 3f7c7252ec5b356f9533cf2e5713fcb518e37d3d Mon Sep 17 00:00:00 2001 From: "k.jamal" Date: Tue, 8 Oct 2024 01:40:58 -0400 Subject: [PATCH 08/97] s --- Eplant/views/KobiTestView/NavigatorView.tsx | 72 ++++---- Eplant/views/KobiTestView/data.tsx | 53 ++++++ Eplant/views/KobiTestView/ghostnodetest.tsx | 172 ++++++++++++++++++++ Eplant/views/KobiTestView/placeholder.tsx | 72 ++++---- 4 files changed, 301 insertions(+), 68 deletions(-) create mode 100644 Eplant/views/KobiTestView/data.tsx create mode 100644 Eplant/views/KobiTestView/ghostnodetest.tsx diff --git a/Eplant/views/KobiTestView/NavigatorView.tsx b/Eplant/views/KobiTestView/NavigatorView.tsx index 27f92503..3235b64e 100644 --- a/Eplant/views/KobiTestView/NavigatorView.tsx +++ b/Eplant/views/KobiTestView/NavigatorView.tsx @@ -8,6 +8,7 @@ interface NodeData { length?: number; }; children?: NodeData[]; + depth?: number; // Add depth to interface } interface CustomNodeProps { @@ -16,18 +17,15 @@ interface CustomNodeProps { } const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { - // Determine if this is a leaf node const isLeafNode = !nodeDatum.children || nodeDatum.children.length === 0; return ( - - {/* Only render text if there's a valid gene name */} {nodeDatum.name && nodeDatum.name !== "Unnamed" && ( = ({ nodeDatum, toggleNode }) => { {nodeDatum.name} )} - - {/* Show "Expression Data" only for leaf nodes */} {isLeafNode && (
    @@ -59,14 +55,10 @@ const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { ); }; + const NavigatorView = () => { const [treeData, setTreeData] = useState(null); - const containerStyles: React.CSSProperties = { - width: '100%', - height: '500px', - }; - useEffect(() => { const newickData = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; @@ -77,23 +69,26 @@ const NavigatorView = () => { !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) ); + + const formatTreeData = (vertex: any): NodeData => { + const childArcs = Array.from(parsedTree.graph[1]) + .filter(arc => arc[0] === vertex); + const node: NodeData = { - name: vertex.label || vertex.name || "", // Changed to empty string instead of "Unnamed" + name: vertex.label || vertex.name || "", attributes: { - length: vertex.length || 0, + length: 1 }, children: [], }; - - const childArcs = Array.from(parsedTree.graph[1]) - .filter(arc => arc[0] === vertex); - - if (childArcs.length === 0) { - // For leaf nodes, extend the branch length to ensure alignment - node.attributes!.length = Math.max(node.attributes?.length || 0, 0.6); - } - + + childArcs.sort((a, b) => { + const aLabel = a[1].label || ""; + const bLabel = b[1].label || ""; + return aLabel.localeCompare(bLabel); + }); + childArcs.forEach(arc => { const childVertex = arc[1]; const childNode = formatTreeData(childVertex); @@ -105,6 +100,7 @@ const NavigatorView = () => { if (rootVertex) { const formattedData = formatTreeData(rootVertex); + setTreeData(formattedData); } } catch (error) { @@ -116,26 +112,34 @@ const NavigatorView = () => { const renderCustomNode = (props: CustomNodeProps) => ; return ( -
    +

    Phylogenetic Tree

    - {treeData ? ( -
    +
    + {treeData && ( -
    - ) : ( -

    Loading...

    - )} + )} +
    ); }; -export default NavigatorView; +export default NavigatorView; \ No newline at end of file diff --git a/Eplant/views/KobiTestView/data.tsx b/Eplant/views/KobiTestView/data.tsx new file mode 100644 index 00000000..00eac6cf --- /dev/null +++ b/Eplant/views/KobiTestView/data.tsx @@ -0,0 +1,53 @@ +export type TreeNode = { + type: 'node'; + value: number; + name: string; + children: Tree[]; + }; + + export type TreeLeaf = { + type: 'leaf'; + name: string; + value: number; + }; + + export type Tree = TreeNode | TreeLeaf; + + export const data: Tree = { + type: "node", + name: "boss", + value: 0, + children: [ + { + type: "node", + name: "Team Dataviz", + value: 0, + children: [ + { type: "leaf", name: "Mark", value: 90 }, + { type: "leaf", name: "Robert", value: 12 }, + { type: "leaf", name: "Emily", value: 34 }, + { type: "leaf", name: "Marion", value: 53 }, + ], + }, + { + type: "node", + name: "Team DevOps", + value: 0, + children: [ + { type: "leaf", name: "Nicolas", value: 98 }, + { type: "leaf", name: "Malki", value: 22 }, + { type: "leaf", name: "Djé", value: 12 }, + ], + }, + { + type: "node", + name: "Team Sales", + value: 0, + children: [ + { type: "leaf", name: "Mélanie", value: 45 }, + { type: "leaf", name: "Einstein", value: 76 }, + ], + }, + ], + }; + \ No newline at end of file diff --git a/Eplant/views/KobiTestView/ghostnodetest.tsx b/Eplant/views/KobiTestView/ghostnodetest.tsx new file mode 100644 index 00000000..84f79aac --- /dev/null +++ b/Eplant/views/KobiTestView/ghostnodetest.tsx @@ -0,0 +1,172 @@ +import React, { useEffect, useState } from 'react'; +import { parse } from "newick-js"; +import Tree from 'react-d3-tree'; + +interface NodeData { + name: string; + attributes?: { + length?: number; + }; + children?: NodeData[]; + depth?: number; // Add depth to interface +} + +interface CustomNodeProps { + nodeDatum: NodeData; + toggleNode: () => void; +} + +const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { + const isLeafNode = !nodeDatum.children || nodeDatum.children.length === 0; + + // Ignore ghost nodes + if (nodeDatum.name === "ghost") return null; + + return ( + + + {nodeDatum.name && nodeDatum.name !== "Unnamed" && ( + + {nodeDatum.name} + + )} + {isLeafNode && ( + +
    +
    + Expression Data +
    +
    +
    + )} +
    + ); +}; + + +const NavigatorView = () => { + const [treeData, setTreeData] = useState(null); + + useEffect(() => { + const newickData = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; + + try { + const parsedTree = parse(newickData); + const vertices = Array.from(parsedTree.graph[0]); + const rootVertex = vertices.find(vertex => + !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) + ); + + // Function to find the maximum depth in the tree + const findMaxDepth = (node: NodeData): number => { + if (!node.children || node.children.length === 0) return 0; + return 1 + Math.max(...node.children.map(child => findMaxDepth(child))); + }; + + // Function to set all leaf nodes to the same depth + const alignLeafNodes = (node: NodeData, maxDepth: number, currentDepth = 0): NodeData => { + const isLeaf = !node.children || node.children.length === 0; + + if (isLeaf) { + + const depthNeeded = maxDepth - currentDepth; + let tempNode = node; + for (let i = 0; i < depthNeeded; i++) { + tempNode.children = [{ name: "ghost", attributes: { length: 0 }, children: [] }]; + tempNode = tempNode.children[0]; + } + return node; // Return modified node + } else { + node.children = node.children?.map(child => alignLeafNodes(child, maxDepth, currentDepth + 1)) || []; + return node; // Return modified non-leaf node + } + }; + + const formatTreeData = (vertex: any): NodeData => { + const childArcs = Array.from(parsedTree.graph[1]) + .filter(arc => arc[0] === vertex); + + const node: NodeData = { + name: vertex.label || vertex.name || "", + attributes: { + length: 1 + }, + children: [], + }; + + childArcs.sort((a, b) => { + const aLabel = a[1].label || ""; + const bLabel = b[1].label || ""; + return aLabel.localeCompare(bLabel); + }); + + childArcs.forEach(arc => { + const childVertex = arc[1]; + const childNode = formatTreeData(childVertex); + node.children?.push(childNode); + }); + + return node; + }; + + if (rootVertex) { + let formattedData = formatTreeData(rootVertex); + const maxDepth = findMaxDepth(formattedData); + formattedData = alignLeafNodes(formattedData, maxDepth); // Align with ghost nodes + setTreeData(formattedData); + } + } catch (error) { + console.error("Error parsing Newick data:", error); + setTreeData(null); + } + }, []); + + const renderCustomNode = (props: CustomNodeProps) => ; + + return ( +
    +

    Phylogenetic Tree

    +
    + {treeData && ( + + )} +
    +
    + ); +}; + +export default NavigatorView; \ No newline at end of file diff --git a/Eplant/views/KobiTestView/placeholder.tsx b/Eplant/views/KobiTestView/placeholder.tsx index 27f92503..3235b64e 100644 --- a/Eplant/views/KobiTestView/placeholder.tsx +++ b/Eplant/views/KobiTestView/placeholder.tsx @@ -8,6 +8,7 @@ interface NodeData { length?: number; }; children?: NodeData[]; + depth?: number; // Add depth to interface } interface CustomNodeProps { @@ -16,18 +17,15 @@ interface CustomNodeProps { } const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { - // Determine if this is a leaf node const isLeafNode = !nodeDatum.children || nodeDatum.children.length === 0; return ( - - {/* Only render text if there's a valid gene name */} {nodeDatum.name && nodeDatum.name !== "Unnamed" && ( = ({ nodeDatum, toggleNode }) => { {nodeDatum.name} )} - - {/* Show "Expression Data" only for leaf nodes */} {isLeafNode && (
    @@ -59,14 +55,10 @@ const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { ); }; + const NavigatorView = () => { const [treeData, setTreeData] = useState(null); - const containerStyles: React.CSSProperties = { - width: '100%', - height: '500px', - }; - useEffect(() => { const newickData = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; @@ -77,23 +69,26 @@ const NavigatorView = () => { !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) ); + + const formatTreeData = (vertex: any): NodeData => { + const childArcs = Array.from(parsedTree.graph[1]) + .filter(arc => arc[0] === vertex); + const node: NodeData = { - name: vertex.label || vertex.name || "", // Changed to empty string instead of "Unnamed" + name: vertex.label || vertex.name || "", attributes: { - length: vertex.length || 0, + length: 1 }, children: [], }; - - const childArcs = Array.from(parsedTree.graph[1]) - .filter(arc => arc[0] === vertex); - - if (childArcs.length === 0) { - // For leaf nodes, extend the branch length to ensure alignment - node.attributes!.length = Math.max(node.attributes?.length || 0, 0.6); - } - + + childArcs.sort((a, b) => { + const aLabel = a[1].label || ""; + const bLabel = b[1].label || ""; + return aLabel.localeCompare(bLabel); + }); + childArcs.forEach(arc => { const childVertex = arc[1]; const childNode = formatTreeData(childVertex); @@ -105,6 +100,7 @@ const NavigatorView = () => { if (rootVertex) { const formattedData = formatTreeData(rootVertex); + setTreeData(formattedData); } } catch (error) { @@ -116,26 +112,34 @@ const NavigatorView = () => { const renderCustomNode = (props: CustomNodeProps) => ; return ( -
    +

    Phylogenetic Tree

    - {treeData ? ( -
    +
    + {treeData && ( -
    - ) : ( -

    Loading...

    - )} + )} +
    ); }; -export default NavigatorView; +export default NavigatorView; \ No newline at end of file From cef9be2df4884ca6df3fad6b1d1bcb55fd7d87ab Mon Sep 17 00:00:00 2001 From: "k.jamal" Date: Tue, 8 Oct 2024 01:41:19 -0400 Subject: [PATCH 09/97] s --- package-lock.json | 1609 ++++++++- package.json | 2 + yarn.lock | 8273 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 9847 insertions(+), 37 deletions(-) create mode 100644 yarn.lock diff --git a/package-lock.json b/package-lock.json index a5b1da64..1de17c3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@mui/x-tree-view": "^7.5.1", "@popperjs/core": "^2.11.8", "@types/react-router-dom": "^5.3.3", + "@visx/visx": "^3.11.0", "axios": "^1.5.1", "color2k": "^2.0.2", "d3": "^7.9.0", @@ -32,6 +33,7 @@ "jotai": "^2.4.3", "lodash": "^4.17.21", "newick-js": "^1.2.1", + "phylotree": "^2.0.1", "react": "^18.3.1", "react-d3-tree": "^3.6.2", "react-dom": "^18.2.0", @@ -661,6 +663,24 @@ "@babel/runtime": "^7.1.2" } }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz", @@ -2927,6 +2947,78 @@ "react": "^16.8 || ^17.0 || ^18.0" } }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "peer": true, + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "peer": true + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "peer": true, + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "peer": true + }, + "node_modules/@react-spring/web": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", + "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@redux-devtools/extension": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.3.0.tgz", @@ -3296,7 +3388,6 @@ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", @@ -3364,6 +3455,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/d3-cloud": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/d3-cloud/-/d3-cloud-1.2.5.tgz", + "integrity": "sha512-vEIER9DsEBUOdpRiwCh3n1qE+cV6h4e1LhxhY2sLt+m8LPNAIkOOhTlqk0JDiBwD+ZPM8ynFAOU3AuPuVYBFBA==", + "dependencies": { + "@types/d3": "^3" + } + }, + "node_modules/@types/d3-cloud/node_modules/@types/d3": { + "version": "3.5.53", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.53.tgz", + "integrity": "sha512-8yKQA9cAS6+wGsJpBysmnhlaaxlN42Qizqkw+h2nILSlS+MAG2z4JdO6p+PJrJ+ACvimkmLJL281h157e52psQ==" + }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", @@ -3448,7 +3552,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/geojson": "*" @@ -3563,6 +3666,11 @@ "@types/d3-selection": "*" } }, + "node_modules/@types/d3-voronoi": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.12.tgz", + "integrity": "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==" + }, "node_modules/@types/d3-zoom": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", @@ -3623,7 +3731,6 @@ "version": "7946.0.14", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", - "dev": true, "license": "MIT" }, "node_modules/@types/graceful-fs": { @@ -3726,8 +3833,7 @@ "node_modules/@types/lodash": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", - "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", - "dev": true + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==" }, "node_modules/@types/ms": { "version": "0.7.34", @@ -3739,7 +3845,6 @@ "version": "20.11.30", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -3768,7 +3873,6 @@ "version": "18.2.22", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", - "dev": true, "dependencies": { "@types/react": "*" } @@ -3809,6 +3913,14 @@ "@types/react": "*" } }, + "node_modules/@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", @@ -3841,6 +3953,11 @@ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -4157,6 +4274,758 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@visx/annotation": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/annotation/-/annotation-3.3.0.tgz", + "integrity": "sha512-v0htpd/sT1kdU1N7frqmj078UByJXUwPQJT9LENv0ypssjGyRgvZERjkgSUuMKMjZquOBs/f6XOzxF4mLV57sA==", + "dependencies": { + "@types/react": "*", + "@visx/drag": "3.3.0", + "@visx/group": "3.3.0", + "@visx/text": "3.3.0", + "classnames": "^2.3.1", + "prop-types": "^15.5.10", + "react-use-measure": "^2.0.4" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/axis": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@visx/axis/-/axis-3.10.1.tgz", + "integrity": "sha512-HBEDLcpZoJ16hFbkYu3S6mN5mbwlFmUWY5yN967X06RdIL4LmAG3gnZ7u4F9buA3LQo+trJXW78moN005odD4Q==", + "dependencies": { + "@types/react": "*", + "@visx/group": "3.3.0", + "@visx/point": "3.3.0", + "@visx/scale": "3.5.0", + "@visx/shape": "3.5.0", + "@visx/text": "3.3.0", + "classnames": "^2.3.1", + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/bounds": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/bounds/-/bounds-3.3.0.tgz", + "integrity": "sha512-gESmN+4N2NkeUzqQEDZaS63umkGfMp9XjQcKBqtOR64mjjQtamh3lNVRWvKjJ2Zb421RbYHWq22Wv9nay6ZUOg==", + "dependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0", + "react-dom": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/brush": { + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/@visx/brush/-/brush-3.10.4.tgz", + "integrity": "sha512-V1vmthRuODSOxt4V/aSVQF9/2V+t/DDQZHFj+M8ueiv9OVznBXVydkMDnaAG5jRAEboX8JlKSmTFB6YrrPc+Ow==", + "dependencies": { + "@visx/drag": "3.3.0", + "@visx/event": "3.3.0", + "@visx/group": "3.3.0", + "@visx/scale": "3.5.0", + "@visx/shape": "3.5.0", + "classnames": "^2.3.1", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/clip-path": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/clip-path/-/clip-path-3.3.0.tgz", + "integrity": "sha512-uMuI2M05qZTgUdTSHJGg4VDr2gytGmGyuaC89iByHqNaeMHkrJqQi/cOFAZi4D0dn75p7lVirJijEgDgSpcrMQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/curve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/curve/-/curve-3.3.0.tgz", + "integrity": "sha512-G1l1rzGWwIs8ka3mBhO/gj8uYK6XdU/3bwRSoiZ+MockMahQFPog0bUkuVgPwwzPSJfsA/E5u53Y/DNesnHQxg==", + "dependencies": { + "@types/d3-shape": "^1.3.1", + "d3-shape": "^1.0.6" + } + }, + "node_modules/@visx/curve/node_modules/@types/d3-path": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz", + "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==" + }, + "node_modules/@visx/curve/node_modules/@types/d3-shape": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", + "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==", + "dependencies": { + "@types/d3-path": "^1" + } + }, + "node_modules/@visx/curve/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/@visx/curve/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/@visx/delaunay": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@visx/delaunay/-/delaunay-3.5.0.tgz", + "integrity": "sha512-M5X50FBEw3EZcnrT8qnjmm80CzSRZnwZA9DXbtgjOVdMJcuBZXsE0QKYisuTkH0bMLV765WKZWaQy8dwWb1snw==", + "dependencies": { + "@types/react": "*", + "@visx/vendor": "3.5.0", + "classnames": "^2.3.1", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/drag": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/drag/-/drag-3.3.0.tgz", + "integrity": "sha512-fLNsorq6GyANCqAE/dToG0q7YoGVxihGC9FZQUp0MCV1wMJIJ45ximhrl5NDng2ytbpWnBmXu8M8hdsdFuvIXw==", + "dependencies": { + "@types/react": "*", + "@visx/event": "3.3.0", + "@visx/point": "3.3.0", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/event": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/event/-/event-3.3.0.tgz", + "integrity": "sha512-fKalbNgNz2ooVOTXhvcOx5IlEQDgVfX66rI7bgZhBxI2/scy+5rWcXJXpwkheRF68SMx9R93SjKW6tmiD0h+jA==", + "dependencies": { + "@types/react": "*", + "@visx/point": "3.3.0" + } + }, + "node_modules/@visx/geo": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@visx/geo/-/geo-3.5.0.tgz", + "integrity": "sha512-TpfMrLL5zHkrxKaasN9G2EQnCBmbhTgLa+o9/6lEFrBp8l4+j3zFaH/U6I6mqlhfMdZqgTj+9ryM4K7AfBuKDA==", + "dependencies": { + "@types/geojson": "*", + "@types/react": "*", + "@visx/group": "3.3.0", + "@visx/vendor": "3.5.0", + "classnames": "^2.3.1", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/glyph": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/glyph/-/glyph-3.3.0.tgz", + "integrity": "sha512-U2r1rFLpim3afKuuAmrbxXGSDCaLwXHmjXxWN8PiIQPMxpS7eaa/V5g2TRd/+x0KCkaf3Ismk4VKMl8ZlrmxIQ==", + "dependencies": { + "@types/d3-shape": "^1.3.1", + "@types/react": "*", + "@visx/group": "3.3.0", + "classnames": "^2.3.1", + "d3-shape": "^1.2.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/glyph/node_modules/@types/d3-path": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz", + "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==" + }, + "node_modules/@visx/glyph/node_modules/@types/d3-shape": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", + "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==", + "dependencies": { + "@types/d3-path": "^1" + } + }, + "node_modules/@visx/glyph/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/@visx/glyph/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/@visx/gradient": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/gradient/-/gradient-3.3.0.tgz", + "integrity": "sha512-t3vqukahDQsJ64/fcm85woFm2XPpSPMBz92gFvaY4J8EJY3e6rFOg382v5Dm17fgNsLRKJA0Vqo7mUtDe2pWOw==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.5.7" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/grid": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@visx/grid/-/grid-3.5.0.tgz", + "integrity": "sha512-i1pdobTE223ItMiER3q4ojIaZWja3vg46TkS6FotnBZ4c0VRDHSrALQPdi0na+YEgppASWCQ2WrI/vD6mIkhSg==", + "dependencies": { + "@types/react": "*", + "@visx/curve": "3.3.0", + "@visx/group": "3.3.0", + "@visx/point": "3.3.0", + "@visx/scale": "3.5.0", + "@visx/shape": "3.5.0", + "classnames": "^2.3.1", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/group": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/group/-/group-3.3.0.tgz", + "integrity": "sha512-yKepDKwJqlzvnvPS0yDuW13XNrYJE4xzT6xM7J++441nu6IybWWwextyap8ey+kU651cYDb+q1Oi6aHvQwyEyw==", + "dependencies": { + "@types/react": "*", + "classnames": "^2.3.1", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/heatmap": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/heatmap/-/heatmap-3.3.0.tgz", + "integrity": "sha512-FekGeV9hKS8c1G3hiKua1X3ccmCfY+QNPT6FV8XYfU3Mrlk2xi6WjSwqG1YaqYp+JsJ0mQXt/kW82RzFSqERwg==", + "dependencies": { + "@types/react": "*", + "@visx/group": "3.3.0", + "classnames": "^2.3.1", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/hierarchy": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/hierarchy/-/hierarchy-3.3.0.tgz", + "integrity": "sha512-nPOZDsSst95+eZOQjZQbq1cuVywriiNAOQp2yXDkZov/32b7Qj0aakXvwU1Yd2DhriuSxlNzMecwVX7L6azrIg==", + "dependencies": { + "@types/d3-hierarchy": "^1.1.6", + "@types/react": "*", + "@visx/group": "3.3.0", + "classnames": "^2.3.1", + "d3-hierarchy": "^1.1.4", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/hierarchy/node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "node_modules/@visx/legend": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@visx/legend/-/legend-3.10.3.tgz", + "integrity": "sha512-jEEK/zdp8gslc3egb3tqNi7dz79riuWR032lCHnULge/h+TtbrC8MnwhbdCbcCn7Fnu3SvY/5DnPpZImFE/Ojg==", + "dependencies": { + "@types/react": "*", + "@visx/group": "3.3.0", + "@visx/scale": "3.5.0", + "classnames": "^2.3.1", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/marker": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@visx/marker/-/marker-3.5.0.tgz", + "integrity": "sha512-gpB+YkhNqaRLRQLLkDnwP1oFevbdOeAMRZJVB1e/XaDG/mL5maVPN6sYDoEPME276LOcW9MMfQeKM8JrRH8nFw==", + "dependencies": { + "@types/react": "*", + "@visx/group": "3.3.0", + "@visx/shape": "3.5.0", + "classnames": "^2.3.1", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/mock-data": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/mock-data/-/mock-data-3.3.0.tgz", + "integrity": "sha512-yb5R/tAU8fjwRSc5VL1UPYbkD+BoYjXUorblE3/oDcSfFrOvpRMZzSaYCBbZ6jtllge3Ks6QVzwyUUj1/xweqQ==", + "dependencies": { + "@types/d3-random": "^2.2.0", + "d3-random": "^2.2.2" + } + }, + "node_modules/@visx/mock-data/node_modules/@types/d3-random": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-2.2.3.tgz", + "integrity": "sha512-Ghs4R3CcgJ3o6svszRzIH4b8PPYex/COo+rhhZjDAs+bVducXwjmVSi27WcDOaLLCBV2t3tfVH9bYXAL76IvQA==" + }, + "node_modules/@visx/mock-data/node_modules/d3-random": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz", + "integrity": "sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==" + }, + "node_modules/@visx/network": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/network/-/network-3.3.0.tgz", + "integrity": "sha512-D4uRFQ+QKSyiDQ6YpjuC082yMllCKtv+KwDcNpyv8XNBkFm3LJuDKpIY4CDCrLeLhOiOTAfyEH7GV/cOcKiw5A==", + "dependencies": { + "@types/react": "*", + "@visx/group": "3.3.0", + "classnames": "^2.3.1", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/pattern": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/pattern/-/pattern-3.3.0.tgz", + "integrity": "sha512-x/a8sG8a+yj+yMjecL+UunRBGPf2Jm6L/X5AbRHEYddHZxxZa6FwxFuJe4R6S19+/vmFaXm8Md1ZAzT/cu6Icw==", + "dependencies": { + "@types/react": "*", + "classnames": "^2.3.1", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/point": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/point/-/point-3.3.0.tgz", + "integrity": "sha512-03eBBIJarkmX79WbeEGTUZwmS5/MUuabbiM9KfkGS9pETBTWkp1DZtEHZdp5z34x5TDQVLSi0rk1Plg3/8RtDg==" + }, + "node_modules/@visx/react-spring": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@visx/react-spring/-/react-spring-3.10.1.tgz", + "integrity": "sha512-OB64l98nGF0pBFXUmAgzQVJNhQvLXTw3RpyP11LpljJh4NRtpcnuHAYCruVQJjRrN7MIrqPdhhG0xvibLib2rg==", + "dependencies": { + "@types/react": "*", + "@visx/axis": "3.10.1", + "@visx/grid": "3.5.0", + "@visx/scale": "3.5.0", + "@visx/text": "3.3.0", + "classnames": "^2.3.1", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "@react-spring/web": "^9.4.5", + "react": "^16.3.0-0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@visx/responsive": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@visx/responsive/-/responsive-3.10.2.tgz", + "integrity": "sha512-oDzFnLLpGpvTcFDoixVJX6iKOVzNJJW4dlAnsfgtxa/ibgMFZGoN4QL3NIzVlgg9s0fTDFCgQ+0FSMv1VvgKlQ==", + "dependencies": { + "@types/lodash": "^4.14.172", + "@types/react": "*", + "lodash": "^4.17.21", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/scale": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@visx/scale/-/scale-3.5.0.tgz", + "integrity": "sha512-xo3zrXV2IZxrMq9Y9RUVJUpd93h3NO/r/y3GVi5F9AsbOzOhsLIbsPkunhO9mpUSR8LZ9TiumLEBrY+3frRBSg==", + "dependencies": { + "@visx/vendor": "3.5.0" + } + }, + "node_modules/@visx/shape": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@visx/shape/-/shape-3.5.0.tgz", + "integrity": "sha512-DP3t9jBQ7dSE3e6ptA1xO4QAIGxO55GrY/6P+S6YREuQGjZgq20TLYLAsiaoPEzFSS4tp0m12ZTPivWhU2VBTw==", + "dependencies": { + "@types/d3-path": "^1.0.8", + "@types/d3-shape": "^1.3.1", + "@types/lodash": "^4.14.172", + "@types/react": "*", + "@visx/curve": "3.3.0", + "@visx/group": "3.3.0", + "@visx/scale": "3.5.0", + "classnames": "^2.3.1", + "d3-path": "^1.0.5", + "d3-shape": "^1.2.0", + "lodash": "^4.17.21", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/shape/node_modules/@types/d3-path": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz", + "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==" + }, + "node_modules/@visx/shape/node_modules/@types/d3-shape": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", + "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==", + "dependencies": { + "@types/d3-path": "^1" + } + }, + "node_modules/@visx/shape/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/@visx/shape/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/@visx/text": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/text/-/text-3.3.0.tgz", + "integrity": "sha512-fOimcsf0GtQE9whM5MdA/xIkHMaV29z7qNqNXysUDE8znSMKsN+ott7kSg2ljAEE89CQo3WKHkPNettoVsa84w==", + "dependencies": { + "@types/lodash": "^4.14.172", + "@types/react": "*", + "classnames": "^2.3.1", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "reduce-css-calc": "^1.3.0" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/threshold": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@visx/threshold/-/threshold-3.5.0.tgz", + "integrity": "sha512-Vq6yq2QIVuIOs8GfIhj+ifsAN3mglw9jWGPaLLHm72Hzr13NdQDFeWSZ8a6yQAcpA3oz7N/2StqLzb0FPYZRbA==", + "dependencies": { + "@types/react": "*", + "@visx/clip-path": "3.3.0", + "@visx/shape": "3.5.0", + "classnames": "^2.3.1", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/tooltip": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/tooltip/-/tooltip-3.3.0.tgz", + "integrity": "sha512-0ovbxnvAphEU/RVJprWHdOJT7p3YfBDpwXclXRuhIY2EkH59g8sDHatDcYwiNPeqk61jBh1KACRZxqToMuutlg==", + "dependencies": { + "@types/react": "*", + "@visx/bounds": "3.3.0", + "classnames": "^2.3.1", + "prop-types": "^15.5.10", + "react-use-measure": "^2.0.4" + }, + "peerDependencies": { + "react": "^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0", + "react-dom": "^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/vendor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@visx/vendor/-/vendor-3.5.0.tgz", + "integrity": "sha512-yt3SEZRVmt36+APsCISSO9eSOtzQkBjt+QRxNRzcTWuzwMAaF3PHCCSe31++kkpgY9yFoF+Gfes1TBe5NlETiQ==", + "dependencies": { + "@types/d3-array": "3.0.3", + "@types/d3-color": "3.1.0", + "@types/d3-delaunay": "6.0.1", + "@types/d3-format": "3.0.1", + "@types/d3-geo": "3.1.0", + "@types/d3-interpolate": "3.0.1", + "@types/d3-scale": "4.0.2", + "@types/d3-time": "3.0.0", + "@types/d3-time-format": "2.1.0", + "d3-array": "3.2.1", + "d3-color": "3.1.0", + "d3-delaunay": "6.0.2", + "d3-format": "3.1.0", + "d3-geo": "3.1.0", + "d3-interpolate": "3.0.1", + "d3-scale": "4.0.2", + "d3-time": "3.1.0", + "d3-time-format": "4.1.0", + "internmap": "2.0.3" + } + }, + "node_modules/@visx/vendor/node_modules/@types/d3-array": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz", + "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@visx/vendor/node_modules/@types/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@visx/vendor/node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "node_modules/@visx/vendor/node_modules/@types/d3-time-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.0.tgz", + "integrity": "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==" + }, + "node_modules/@visx/vendor/node_modules/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@visx/vendor/node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@visx/vendor/node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@visx/visx": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@visx/visx/-/visx-3.11.0.tgz", + "integrity": "sha512-KtWpwAMymm2oxF0bjfECoIlIoiZu71d4YmhJR/fAt7puKttKk+Syy0X1KqLXxsapan6DkV9dgCTc2mVCjKKoKw==", + "dependencies": { + "@visx/annotation": "3.3.0", + "@visx/axis": "3.10.1", + "@visx/bounds": "3.3.0", + "@visx/brush": "3.10.4", + "@visx/clip-path": "3.3.0", + "@visx/curve": "3.3.0", + "@visx/delaunay": "3.5.0", + "@visx/drag": "3.3.0", + "@visx/event": "3.3.0", + "@visx/geo": "3.5.0", + "@visx/glyph": "3.3.0", + "@visx/gradient": "3.3.0", + "@visx/grid": "3.5.0", + "@visx/group": "3.3.0", + "@visx/heatmap": "3.3.0", + "@visx/hierarchy": "3.3.0", + "@visx/legend": "3.10.3", + "@visx/marker": "3.5.0", + "@visx/mock-data": "3.3.0", + "@visx/network": "3.3.0", + "@visx/pattern": "3.3.0", + "@visx/point": "3.3.0", + "@visx/responsive": "3.10.2", + "@visx/scale": "3.5.0", + "@visx/shape": "3.5.0", + "@visx/text": "3.3.0", + "@visx/threshold": "3.5.0", + "@visx/tooltip": "3.3.0", + "@visx/voronoi": "3.3.0", + "@visx/wordcloud": "3.3.0", + "@visx/xychart": "3.11.0", + "@visx/zoom": "3.3.0" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/voronoi": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/voronoi/-/voronoi-3.3.0.tgz", + "integrity": "sha512-twVovwdcEZZRkFV+x6yXGcyohf7gYHz0y/dFoS0SfGtEwT+CMEQgfO3ZDNQjU8X/m8je/wu9qtd35Zur+0RYOQ==", + "dependencies": { + "@types/d3-voronoi": "^1.1.9", + "@types/react": "*", + "classnames": "^2.3.1", + "d3-voronoi": "^1.1.2", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": "^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/wordcloud": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/wordcloud/-/wordcloud-3.3.0.tgz", + "integrity": "sha512-nopA4+qoBo3xDlHPNqq7cQx/8u1pfsNk6a+RNJwQFM4Nql7AgD9X9rcThqxXzGxJK3oODH9qgEhs4q+m4Jn46A==", + "dependencies": { + "@types/d3-cloud": "1.2.5", + "@visx/group": "3.3.0", + "d3-cloud": "^1.2.5" + }, + "peerDependencies": { + "react": "^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, + "node_modules/@visx/xychart": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@visx/xychart/-/xychart-3.11.0.tgz", + "integrity": "sha512-phs/q0eeVNJDaHkKLQ+/0UYVt1fiVTaDZPtOVgcFRpEghpRWFgyApGuZ+BWWnTcGzpLEVv1HBcVA6H555IpvJQ==", + "dependencies": { + "@types/lodash": "^4.14.172", + "@types/react": "*", + "@visx/annotation": "3.3.0", + "@visx/axis": "3.10.1", + "@visx/event": "3.3.0", + "@visx/glyph": "3.3.0", + "@visx/grid": "3.5.0", + "@visx/react-spring": "3.10.1", + "@visx/responsive": "3.10.2", + "@visx/scale": "3.5.0", + "@visx/shape": "3.5.0", + "@visx/text": "3.3.0", + "@visx/tooltip": "3.3.0", + "@visx/vendor": "3.5.0", + "@visx/voronoi": "3.3.0", + "classnames": "^2.3.1", + "d3-interpolate-path": "2.2.1", + "d3-shape": "^2.0.0", + "lodash": "^4.17.21", + "mitt": "^2.1.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "@react-spring/web": "^9.4.5", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@visx/xychart/node_modules/d3-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", + "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" + }, + "node_modules/@visx/xychart/node_modules/d3-shape": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz", + "integrity": "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==", + "dependencies": { + "d3-path": "1 - 2" + } + }, + "node_modules/@visx/zoom": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@visx/zoom/-/zoom-3.3.0.tgz", + "integrity": "sha512-ijSitmJWbhupAe1F0LTsusg/WWEvYBcxV9iOHmTbGHhgpdKuhmZCXYg2zGAF4oT3lTuhofUA678jQt5+U9FlWA==", + "dependencies": { + "@types/react": "*", + "@use-gesture/react": "^10.0.0-beta.22", + "@visx/event": "3.3.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", @@ -4374,6 +5243,17 @@ "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -4724,6 +5604,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4965,8 +5850,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base16": { "version": "1.0.0", @@ -4978,7 +5862,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -5121,6 +6004,17 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -5297,6 +6191,11 @@ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5431,7 +6330,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" @@ -5454,7 +6352,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -5465,6 +6362,15 @@ "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz", "integrity": "sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==" }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -5665,6 +6571,11 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/csv-stringify": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", + "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==" + }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", @@ -5755,6 +6666,19 @@ "node": ">=12" } }, + "node_modules/d3-cloud": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.7.tgz", + "integrity": "sha512-8TrgcgwRIpoZYQp7s3fGB7tATWfhckRb8KcVd1bOgqkNdkJRDGWfdSf4HkHHzZxSczwQJdSxvfPudwir5IAJ3w==", + "dependencies": { + "d3-dispatch": "^1.0.3" + } + }, + "node_modules/d3-cloud/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -5933,6 +6857,11 @@ "node": ">=12" } }, + "node_modules/d3-interpolate-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/d3-interpolate-path/-/d3-interpolate-path-2.2.1.tgz", + "integrity": "sha512-6qLLh/KJVzls0XtMsMpcxhqMhgVEN7VIbR/6YGZe2qlS8KDgyyVB20XcmGnDyB051HcefQXM/Tppa9vcANEA4Q==" + }, "node_modules/d3-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", @@ -6071,6 +7000,11 @@ "d3-selection": "2 - 3" } }, + "node_modules/d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, "node_modules/d3-zoom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", @@ -6152,6 +7086,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6419,6 +7358,11 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "node_modules/enhanced-resolve": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", @@ -7148,14 +8092,21 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" } }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -7286,6 +8237,11 @@ "bser": "2.1.1" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -7400,6 +8356,11 @@ "react-dom": "^18.0.0" } }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -7451,7 +8412,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -7892,7 +8852,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -7909,7 +8868,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -8069,8 +9027,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inquirer": { "version": "8.2.6", @@ -8432,6 +9389,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -8536,7 +9498,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -10683,6 +11644,11 @@ "react": ">=17.0.0" } }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + }, "node_modules/js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -10917,6 +11883,11 @@ "node": ">=6" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -11078,6 +12049,22 @@ "node": ">=8" } }, + "node_modules/logform": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz", + "integrity": "sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -11175,6 +12162,11 @@ "tmpl": "1.0.5" } }, + "node_modules/math-expression-evaluator": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz", + "integrity": "sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==" + }, "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -11269,11 +12261,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mitt": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz", + "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/msw": { "version": "1.3.3", @@ -11443,8 +12447,7 @@ "node_modules/newick-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/newick-js/-/newick-js-1.2.1.tgz", - "integrity": "sha512-qyZVNtlXmORBf2w9vg2S/5N5mQlU46xDFdPX7SEDZTeSElafNQUelNzR7HWSKcVOpjXiDnBqkvjd5RlEG7/SEA==", - "license": "MIT" + "integrity": "sha512-qyZVNtlXmORBf2w9vg2S/5N5mQlU46xDFdPX7SEDZTeSElafNQUelNzR7HWSKcVOpjXiDnBqkvjd5RlEG7/SEA==" }, "node_modules/node-fetch": { "version": "2.7.0", @@ -11658,6 +12661,14 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -11923,6 +12934,329 @@ "node": ">=8" } }, + "node_modules/phylotree": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/phylotree/-/phylotree-2.0.1.tgz", + "integrity": "sha512-L6EA0le2TLzHAQJa3NPm4X6swtuOab8tAhPqugZ+Eqlstl0s3MIK5EvnXdkU2Cvm8Q5rmrNwq3AKsFLVqKiFZw==", + "dependencies": { + "commander": "^6.2.1", + "csv-stringify": "^5.3.6", + "d3": "6", + "jquery": "3", + "lodash": "^4.17.11", + "moment": "^2.29.4", + "pretty-data": "^0.40.0", + "rollup-plugin-node-resolve": "^5.2.0", + "underscore": "1.x", + "winston": "^3.2.1", + "xml2js": "^0.4.19" + }, + "bin": { + "phylotree": "bin/phylotree.js", + "root-to-tip": "bin/root-to-tip.js", + "tip-date-extractor": "bin/tip-date-extractor.js" + } + }, + "node_modules/phylotree/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/phylotree/node_modules/d3": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-6.7.0.tgz", + "integrity": "sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g==", + "dependencies": { + "d3-array": "2", + "d3-axis": "2", + "d3-brush": "2", + "d3-chord": "2", + "d3-color": "2", + "d3-contour": "2", + "d3-delaunay": "5", + "d3-dispatch": "2", + "d3-drag": "2", + "d3-dsv": "2", + "d3-ease": "2", + "d3-fetch": "2", + "d3-force": "2", + "d3-format": "2", + "d3-geo": "2", + "d3-hierarchy": "2", + "d3-interpolate": "2", + "d3-path": "2", + "d3-polygon": "2", + "d3-quadtree": "2", + "d3-random": "2", + "d3-scale": "3", + "d3-scale-chromatic": "2", + "d3-selection": "2", + "d3-shape": "2", + "d3-time": "2", + "d3-time-format": "3", + "d3-timer": "2", + "d3-transition": "2", + "d3-zoom": "2" + } + }, + "node_modules/phylotree/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/phylotree/node_modules/d3-axis": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-2.1.0.tgz", + "integrity": "sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==" + }, + "node_modules/phylotree/node_modules/d3-brush": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-2.1.0.tgz", + "integrity": "sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "node_modules/phylotree/node_modules/d3-chord": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-2.0.0.tgz", + "integrity": "sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==", + "dependencies": { + "d3-path": "1 - 2" + } + }, + "node_modules/phylotree/node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/phylotree/node_modules/d3-contour": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-2.0.0.tgz", + "integrity": "sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==", + "dependencies": { + "d3-array": "2" + } + }, + "node_modules/phylotree/node_modules/d3-delaunay": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz", + "integrity": "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==", + "dependencies": { + "delaunator": "4" + } + }, + "node_modules/phylotree/node_modules/d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + }, + "node_modules/phylotree/node_modules/d3-drag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-2.0.0.tgz", + "integrity": "sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-selection": "2" + } + }, + "node_modules/phylotree/node_modules/d3-dsv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", + "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/phylotree/node_modules/d3-dsv/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/phylotree/node_modules/d3-ease": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-2.0.0.tgz", + "integrity": "sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==" + }, + "node_modules/phylotree/node_modules/d3-fetch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-2.0.0.tgz", + "integrity": "sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==", + "dependencies": { + "d3-dsv": "1 - 2" + } + }, + "node_modules/phylotree/node_modules/d3-force": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", + "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-quadtree": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "node_modules/phylotree/node_modules/d3-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + }, + "node_modules/phylotree/node_modules/d3-geo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz", + "integrity": "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==", + "dependencies": { + "d3-array": "^2.5.0" + } + }, + "node_modules/phylotree/node_modules/d3-hierarchy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz", + "integrity": "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==" + }, + "node_modules/phylotree/node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, + "node_modules/phylotree/node_modules/d3-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", + "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" + }, + "node_modules/phylotree/node_modules/d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" + }, + "node_modules/phylotree/node_modules/d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + }, + "node_modules/phylotree/node_modules/d3-random": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz", + "integrity": "sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==" + }, + "node_modules/phylotree/node_modules/d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "dependencies": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + } + }, + "node_modules/phylotree/node_modules/d3-scale-chromatic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "dependencies": { + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" + } + }, + "node_modules/phylotree/node_modules/d3-selection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", + "integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==" + }, + "node_modules/phylotree/node_modules/d3-shape": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz", + "integrity": "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==", + "dependencies": { + "d3-path": "1 - 2" + } + }, + "node_modules/phylotree/node_modules/d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "dependencies": { + "d3-array": "2" + } + }, + "node_modules/phylotree/node_modules/d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "dependencies": { + "d3-time": "1 - 2" + } + }, + "node_modules/phylotree/node_modules/d3-timer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", + "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" + }, + "node_modules/phylotree/node_modules/d3-transition": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-2.0.0.tgz", + "integrity": "sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==", + "dependencies": { + "d3-color": "1 - 2", + "d3-dispatch": "1 - 2", + "d3-ease": "1 - 2", + "d3-interpolate": "1 - 2", + "d3-timer": "1 - 2" + }, + "peerDependencies": { + "d3-selection": "2" + } + }, + "node_modules/phylotree/node_modules/d3-zoom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-2.0.0.tgz", + "integrity": "sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "node_modules/phylotree/node_modules/delaunator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + }, + "node_modules/phylotree/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -12107,6 +13441,14 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-data": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz", + "integrity": "sha512-YFLnEdDEDnkt/GEhet5CYZHCvALw6+Elyb/tp8kQG03ZSIuzeaDWpZYndCXwgqu4NAjh1PI534dhDS1mHarRnQ==", + "engines": { + "node": "*" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -12148,6 +13490,14 @@ "react": ">=0.14.9" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -12252,7 +13602,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -12279,7 +13628,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/react-d3-tree/-/react-d3-tree-3.6.2.tgz", "integrity": "sha512-1ExQlmEnv5iOw9XfZ3EcESDjzGXVKPAmyDJTJbvVfiwkplZtP7CcNEY0tKZf4XSW0FzYJf4aFXprGJen+95yuw==", - "license": "MIT", "dependencies": { "@bkrem/react-transition-group": "^1.3.3", "@types/d3-hierarchy": "^1.1.8", @@ -12550,6 +13898,18 @@ "react-dom": ">=16.6.0" } }, + "node_modules/react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "dependencies": { + "debounce": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + } + }, "node_modules/react-window": { "version": "1.8.10", "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", @@ -12583,7 +13943,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12618,6 +13977,29 @@ "node": ">=8" } }, + "node_modules/reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==", + "dependencies": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + } + }, + "node_modules/reduce-css-calc/node_modules/balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==" + }, + "node_modules/reduce-function-call": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", + "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", @@ -12809,7 +14191,6 @@ "version": "3.29.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -12821,6 +14202,35 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup-plugin-node-resolve": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", + "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-node-resolve.", + "dependencies": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1", + "rollup-pluginutils": "^2.8.1" + }, + "peerDependencies": { + "rollup": ">=1.11.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -12890,7 +14300,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -12923,11 +14332,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -13107,7 +14529,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, "dependencies": { "is-arrayish": "^0.3.1" } @@ -13115,8 +14536,7 @@ "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -13175,6 +14595,14 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -13218,7 +14646,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -13595,6 +15022,11 @@ "node": "*" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -13672,6 +15104,14 @@ "node": ">=12" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -14170,11 +15610,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/universalify": { "version": "0.2.0", @@ -14333,8 +15777,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "8.3.2", @@ -14778,6 +16221,78 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/winston": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.15.0.tgz", + "integrity": "sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.6.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.8.0.tgz", + "integrity": "sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA==", + "dependencies": { + "logform": "^2.6.1", + "readable-stream": "^4.5.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -14874,6 +16389,26 @@ "node": ">=12" } }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index a751e08b..e92529cd 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@mui/x-tree-view": "^7.5.1", "@popperjs/core": "^2.11.8", "@types/react-router-dom": "^5.3.3", + "@visx/visx": "^3.11.0", "axios": "^1.5.1", "color2k": "^2.0.2", "d3": "^7.9.0", @@ -38,6 +39,7 @@ "jotai": "^2.4.3", "lodash": "^4.17.21", "newick-js": "^1.2.1", + "phylotree": "^2.0.1", "react": "^18.3.1", "react-d3-tree": "^3.6.2", "react-dom": "^18.2.0", diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..cdc8f842 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,8273 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adobe/css-tools@^4.3.2": + version "4.3.3" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz" + integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + +"@babel/compat-data@^7.23.5": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz" + integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.23.5", "@babel/core@^7.23.9", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": + version "7.24.3" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz" + integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.1" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.24.1" + "@babel/parser" "^7.24.1" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.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" + +"@babel/generator@^7.24.1", "@babel/generator@^7.7.2": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz" + integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== + dependencies: + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15": + version "7.24.3" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helpers@^7.24.1": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz" + integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz" + integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-jsx-self@^7.23.3": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz" + integrity sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-react-jsx-source@^7.23.3": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz" + integrity sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.24.6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz" + integrity sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@^7.24.1": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== + dependencies: + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.3.3": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@bkrem/react-transition-group@^1.3.3": + version "1.3.3" + resolved "https://registry.npmjs.org/@bkrem/react-transition-group/-/react-transition-group-1.3.3.tgz" + integrity sha512-nUZaumHu/MMolELv+MhEEQzQtKsnfpbKBHtam/NK53tGICwU19tuffEXW8BLhm9HhQfN1H3+C0bsJv8Z7vzwEA== + dependencies: + chain-function "^1.0.0" + dom-helpers "^3.3.1" + loose-envify "^1.3.1" + prop-types "^15.5.6" + react-lifecycles-compat "^3.0.4" + warning "^3.0.0" + +"@colors/colors@^1.6.0", "@colors/colors@1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@dnd-kit/accessibility@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz" + integrity sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ== + dependencies: + tslib "^2.0.0" + +"@dnd-kit/core@^6.0.6", "@dnd-kit/core@^6.0.7", "@dnd-kit/core@^6.0.8": + version "6.1.0" + resolved "https://registry.npmjs.org/@dnd-kit/core/-/core-6.1.0.tgz" + integrity sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg== + dependencies: + "@dnd-kit/accessibility" "^3.1.0" + "@dnd-kit/utilities" "^3.2.2" + tslib "^2.0.0" + +"@dnd-kit/modifiers@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-6.0.1.tgz" + integrity sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A== + dependencies: + "@dnd-kit/utilities" "^3.2.1" + tslib "^2.0.0" + +"@dnd-kit/sortable@^7.0.2": + version "7.0.2" + resolved "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-7.0.2.tgz" + integrity sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA== + dependencies: + "@dnd-kit/utilities" "^3.2.0" + tslib "^2.0.0" + +"@dnd-kit/utilities@^3.2.0", "@dnd-kit/utilities@^3.2.1", "@dnd-kit/utilities@^3.2.2": + version "3.2.2" + resolved "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz" + integrity sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg== + dependencies: + tslib "^2.0.0" + +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/is-prop-valid@^1.2.1": + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz" + integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.11.1", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0", "@emotion/react@>=11.0.0", "@emotion/react@>=11.9.0": + version "11.11.4" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz" + integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": + version "1.1.3" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz" + integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/styled@^11.11.0", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + 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" + +"@eslint/js@^9.3.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz" + integrity sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw== + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@floating-ui/core@^1.0.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz" + integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + dependencies: + "@floating-ui/utils" "^0.2.1" + +"@floating-ui/dom@^1.2.1", "@floating-ui/dom@^1.6.1": + version "1.6.3" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz" + integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== + dependencies: + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/react-dom@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz" + integrity sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g== + dependencies: + "@floating-ui/dom" "^1.2.1" + +"@floating-ui/react-dom@^2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz" + integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw== + dependencies: + "@floating-ui/dom" "^1.6.1" + +"@floating-ui/react@^0.19.1": + version "0.19.2" + resolved "https://registry.npmjs.org/@floating-ui/react/-/react-0.19.2.tgz" + integrity sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w== + dependencies: + "@floating-ui/react-dom" "^1.3.0" + aria-hidden "^1.1.3" + tabbable "^6.0.1" + +"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": + version "0.2.1" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== + +"@fontsource/roboto-mono@^5.0.8": + version "5.0.17" + resolved "https://registry.npmjs.org/@fontsource/roboto-mono/-/roboto-mono-5.0.17.tgz" + integrity sha512-MU6FrAyG7DWMCL8mu0JDPvB2tnFcn/lYvVKixzqHb2uefRsLaD6OBFfF1q5RMFsKcFHyPySHM7ZcGw/Q6A1/FA== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + 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" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + 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" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + 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" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + 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" + +"@jest/globals@^29.7.0", "@jest/globals@>= 28": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + 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" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + 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" + +"@jest/types@^29.0.0", "@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + 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" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@lottiefiles/react-lottie-player@^3.5.3": + version "3.5.3" + resolved "https://registry.npmjs.org/@lottiefiles/react-lottie-player/-/react-lottie-player-3.5.3.tgz" + integrity sha512-6pGbiTMjGnPddR1ur8M/TIDCiogZMc1aKIUbMEKXKAuNeYwZ2hvqwBJ+w5KRm88ccdcU88C2cGyLVsboFlSdVQ== + dependencies: + lottie-web "^5.10.2" + +"@mantine/core@^6.0.21", "@mantine/core@6.0.21": + version "6.0.21" + resolved "https://registry.npmjs.org/@mantine/core/-/core-6.0.21.tgz" + integrity sha512-Kx4RrRfv0I+cOCIcsq/UA2aWcYLyXgW3aluAuW870OdXnbII6qg7RW28D+r9D76SHPxWFKwIKwmcucAG08Divg== + dependencies: + "@floating-ui/react" "^0.19.1" + "@mantine/styles" "6.0.21" + "@mantine/utils" "6.0.21" + "@radix-ui/react-scroll-area" "1.0.2" + react-remove-scroll "^2.5.5" + react-textarea-autosize "8.3.4" + +"@mantine/hooks@^6.0.21", "@mantine/hooks@6.0.21": + version "6.0.21" + resolved "https://registry.npmjs.org/@mantine/hooks/-/hooks-6.0.21.tgz" + integrity sha512-sYwt5wai25W6VnqHbS5eamey30/HD5dNXaZuaVEAJ2i2bBv8C0cCiczygMDpAFiSYdXoSMRr/SZ2CrrPTzeNew== + +"@mantine/prism@^6.0.21": + version "6.0.21" + resolved "https://registry.npmjs.org/@mantine/prism/-/prism-6.0.21.tgz" + integrity sha512-M9hDUAuuxiINI7f07V0qlX532UXlOTpBqNcG1WWm80t6C0fHjzkTvFj77QpnGS73+MI88mV8ru458y10bQjTBA== + dependencies: + "@mantine/utils" "6.0.21" + prism-react-renderer "^1.2.1" + +"@mantine/styles@6.0.21": + version "6.0.21" + resolved "https://registry.npmjs.org/@mantine/styles/-/styles-6.0.21.tgz" + integrity sha512-PVtL7XHUiD/B5/kZ/QvZOZZQQOj12QcRs3Q6nPoqaoPcOX5+S7bMZLMH0iLtcGq5OODYk0uxlvuJkOZGoPj8Mg== + dependencies: + clsx "1.1.1" + csstype "3.0.9" + +"@mantine/utils@6.0.21": + version "6.0.21" + resolved "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.21.tgz" + integrity sha512-33RVDRop5jiWFao3HKd3Yp7A9mEq4HAJxJPTuYm1NkdqX6aTKOQK7wT8v8itVodBp+sb4cJK6ZVdD1UurK/txQ== + +"@mswjs/cookies@^0.2.2": + version "0.2.2" + resolved "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.2.tgz" + integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== + dependencies: + "@types/set-cookie-parser" "^2.4.0" + set-cookie-parser "^2.4.6" + +"@mswjs/interceptors@^0.17.10": + version "0.17.10" + resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.10.tgz" + integrity sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw== + dependencies: + "@open-draft/until" "^1.0.3" + "@types/debug" "^4.1.7" + "@xmldom/xmldom" "^0.8.3" + debug "^4.3.3" + headers-polyfill "3.2.5" + outvariant "^1.2.1" + strict-event-emitter "^0.2.4" + web-encoding "^1.1.5" + +"@mui/base@^5.0.0-beta.40", "@mui/base@5.0.0-beta.40": + version "5.0.0-beta.40" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz" + integrity sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ== + dependencies: + "@babel/runtime" "^7.23.9" + "@floating-ui/react-dom" "^2.0.8" + "@mui/types" "^7.2.14" + "@mui/utils" "^5.15.14" + "@popperjs/core" "^2.11.8" + clsx "^2.1.0" + prop-types "^15.8.1" + +"@mui/core-downloads-tracker@^5.15.14": + version "5.15.14" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz" + integrity sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA== + +"@mui/icons-material@^5.14.11": + version "5.15.14" + resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.14.tgz" + integrity sha512-vj/51k7MdFmt+XVw94sl30SCvGx6+wJLsNYjZRgxhS6y3UtnWnypMOsm3Kmg8TN+P0dqwsjy4/fX7B1HufJIhw== + dependencies: + "@babel/runtime" "^7.23.9" + +"@mui/lab@^5.0.0-alpha.170": + version "5.0.0-alpha.170" + resolved "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.170.tgz" + integrity sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/base" "5.0.0-beta.40" + "@mui/system" "^5.15.15" + "@mui/types" "^7.2.14" + "@mui/utils" "^5.15.14" + clsx "^2.1.0" + prop-types "^15.8.1" + +"@mui/material@^5.0.0", "@mui/material@^5.14.11", "@mui/material@^5.15.14", "@mui/material@^5.4.1", "@mui/material@>=5.15.0": + version "5.15.14" + resolved "https://registry.npmjs.org/@mui/material/-/material-5.15.14.tgz" + integrity sha512-kEbRw6fASdQ1SQ7LVdWR5OlWV3y7Y54ZxkLzd6LV5tmz+NpO3MJKZXSfgR0LHMP7meKsPiMm4AuzV0pXDpk/BQ== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/base" "5.0.0-beta.40" + "@mui/core-downloads-tracker" "^5.15.14" + "@mui/system" "^5.15.14" + "@mui/types" "^7.2.14" + "@mui/utils" "^5.15.14" + "@types/react-transition-group" "^4.4.10" + clsx "^2.1.0" + csstype "^3.1.3" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.5" + +"@mui/private-theming@^5.15.14": + version "5.15.14" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz" + integrity sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/utils" "^5.15.14" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.15.14": + version "5.15.14" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz" + integrity sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw== + dependencies: + "@babel/runtime" "^7.23.9" + "@emotion/cache" "^11.11.0" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/system@^5.15.14", "@mui/system@^5.15.15", "@mui/system@^5.4.1": + version "5.15.15" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz" + integrity sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ== + dependencies: + "@babel/runtime" "^7.23.9" + "@mui/private-theming" "^5.15.14" + "@mui/styled-engine" "^5.15.14" + "@mui/types" "^7.2.14" + "@mui/utils" "^5.15.14" + clsx "^2.1.0" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/types@^7.2.14": + version "7.2.14" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz" + integrity sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ== + +"@mui/utils@^5.14.16", "@mui/utils@^5.15.14": + version "5.15.14" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz" + integrity sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA== + dependencies: + "@babel/runtime" "^7.23.9" + "@types/prop-types" "^15.7.11" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/x-data-grid@^6.15.0": + version "6.19.8" + resolved "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-6.19.8.tgz" + integrity sha512-QsOW9GhJdhvagJfUb5jpZE1MMaCLugxx0l89amxJAthMia95BlGS7jndiDEh8IQNthgzfxjAzrSv8GZpcgSEaA== + dependencies: + "@babel/runtime" "^7.23.2" + "@mui/utils" "^5.14.16" + clsx "^2.0.0" + prop-types "^15.8.1" + reselect "^4.1.8" + +"@mui/x-tree-view@^7.5.1": + version "7.5.1" + resolved "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.5.1.tgz" + integrity sha512-b4Lfclg1Lpa+kSs305snl/xFG5yOxq3/oVZEyPIseg8oOfl0r79UKqCIdO2iQqQydjUsUMbLtnR9TFypxlwCbQ== + dependencies: + "@babel/runtime" "^7.24.5" + "@mui/base" "^5.0.0-beta.40" + "@mui/system" "^5.15.14" + "@mui/utils" "^5.15.14" + "@types/react-transition-group" "^4.4.10" + clsx "^2.1.1" + prop-types "^15.8.1" + react-transition-group "^4.4.5" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@open-draft/until@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz" + integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== + +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@radix-ui/number@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz" + integrity sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/primitive@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz" + integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-compose-refs@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz" + integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz" + integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-direction@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz" + integrity sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-presence@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz" + integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-primitive@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz" + integrity sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.1" + +"@radix-ui/react-scroll-area@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.2.tgz" + integrity sha512-k8VseTxI26kcKJaX0HPwkvlNBPTs56JRdYzcZ/vzrNUkDlvXBy8sMc7WvCpYzZkHgb+hd72VW9MqkqecGtuNgg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/number" "1.0.0" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-direction" "1.0.0" + "@radix-ui/react-presence" "1.0.0" + "@radix-ui/react-primitive" "1.0.1" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-slot@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz" + integrity sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + +"@radix-ui/react-use-callback-ref@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz" + integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-layout-effect@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz" + integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@react-spring/animated@~9.7.5": + version "9.7.5" + resolved "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz" + integrity sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg== + dependencies: + "@react-spring/shared" "~9.7.5" + "@react-spring/types" "~9.7.5" + +"@react-spring/core@~9.7.5": + version "9.7.5" + resolved "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz" + integrity sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w== + dependencies: + "@react-spring/animated" "~9.7.5" + "@react-spring/shared" "~9.7.5" + "@react-spring/types" "~9.7.5" + +"@react-spring/rafz@~9.7.5": + version "9.7.5" + resolved "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz" + integrity sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw== + +"@react-spring/shared@~9.7.5": + version "9.7.5" + resolved "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz" + integrity sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw== + dependencies: + "@react-spring/rafz" "~9.7.5" + "@react-spring/types" "~9.7.5" + +"@react-spring/types@~9.7.5": + version "9.7.5" + resolved "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz" + integrity sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g== + +"@react-spring/web@^9.4.5": + version "9.7.5" + resolved "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz" + integrity sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ== + dependencies: + "@react-spring/animated" "~9.7.5" + "@react-spring/core" "~9.7.5" + "@react-spring/shared" "~9.7.5" + "@react-spring/types" "~9.7.5" + +"@redux-devtools/extension@^3.2.6": + version "3.3.0" + resolved "https://registry.npmjs.org/@redux-devtools/extension/-/extension-3.3.0.tgz" + integrity sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g== + dependencies: + "@babel/runtime" "^7.23.2" + immutable "^4.3.4" + +"@remix-run/router@1.16.1": + version "1.16.1" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz" + integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig== + +"@rollup/pluginutils@^4.2.1": + version "4.2.1" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@testing-library/dom@^9.0.0", "@testing-library/dom@>=7.21.4": + version "9.3.4" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz" + integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^6.1.3": + version "6.4.2" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz" + integrity sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw== + dependencies: + "@adobe/css-tools" "^4.3.2" + "@babel/runtime" "^7.9.2" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^14.0.0": + version "14.2.2" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-14.2.2.tgz" + integrity sha512-SOUuM2ysCvjUWBXTNfQ/ztmnKDmqaiPV3SvoIuyxMUca45rbSWWAT/qB8CUs/JQ/ux/8JFs9DNdFQ3f6jH3crA== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^9.0.0" + "@types/react-dom" "^18.0.0" + +"@testing-library/user-event@^14.5.1": + version "14.5.2" + resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz" + integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + +"@types/babel__core@^7.1.14", "@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + +"@types/base16@^1.0.2": + version "1.0.5" + resolved "https://registry.npmjs.org/@types/base16/-/base16-1.0.5.tgz" + integrity sha512-OzOWrTluG9cwqidEzC/Q6FAmIPcnZfm8BFRlIx0+UIUqnuAmi5OS88O0RpT3Yz6qdmqObvUhasrbNsCofE4W9A== + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/d3-array@*": + version "3.2.1" + resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz" + integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== + +"@types/d3-array@3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz" + integrity sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ== + +"@types/d3-axis@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz" + integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-brush@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz" + integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-chord@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz" + integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== + +"@types/d3-cloud@1.2.5": + version "1.2.5" + resolved "https://registry.npmjs.org/@types/d3-cloud/-/d3-cloud-1.2.5.tgz" + integrity sha512-vEIER9DsEBUOdpRiwCh3n1qE+cV6h4e1LhxhY2sLt+m8LPNAIkOOhTlqk0JDiBwD+ZPM8ynFAOU3AuPuVYBFBA== + dependencies: + "@types/d3" "^3" + +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-color@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz" + integrity sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== + +"@types/d3-contour@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz" + integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== + dependencies: + "@types/d3-array" "*" + "@types/geojson" "*" + +"@types/d3-delaunay@*": + version "6.0.4" + resolved "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz" + integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== + +"@types/d3-delaunay@6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz" + integrity sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ== + +"@types/d3-dispatch@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz" + integrity sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ== + +"@types/d3-drag@*": + version "3.0.7" + resolved "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz" + integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-dsv@*": + version "3.0.7" + resolved "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz" + integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== + +"@types/d3-ease@*": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== + +"@types/d3-fetch@*": + version "3.0.7" + resolved "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz" + integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== + dependencies: + "@types/d3-dsv" "*" + +"@types/d3-force@*": + version "3.0.10" + resolved "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz" + integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== + +"@types/d3-format@*": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz" + integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== + +"@types/d3-format@3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz" + integrity sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg== + +"@types/d3-geo@*", "@types/d3-geo@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz" + integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@*", "@types/d3-hierarchy@^1.1.6", "@types/d3-hierarchy@^1.1.8": + version "1.1.11" + resolved "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.11.tgz" + integrity sha512-lnQiU7jV+Gyk9oQYk0GGYccuexmQPTp08E0+4BidgFdiJivjEvf+esPSdZqCZ2C7UwTWejWpqetVaU8A+eX3FA== + +"@types/d3-interpolate@*": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== + dependencies: + "@types/d3-color" "*" + +"@types/d3-interpolate@3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz" + integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.1.0" + resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz" + integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ== + +"@types/d3-path@^1", "@types/d3-path@^1.0.8": + version "1.0.11" + resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz" + integrity sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw== + +"@types/d3-polygon@*": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz" + integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== + +"@types/d3-quadtree@*": + version "3.0.6" + resolved "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz" + integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== + +"@types/d3-random@*": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz" + integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== + +"@types/d3-random@^2.2.0": + version "2.2.3" + resolved "https://registry.npmjs.org/@types/d3-random/-/d3-random-2.2.3.tgz" + integrity sha512-Ghs4R3CcgJ3o6svszRzIH4b8PPYex/COo+rhhZjDAs+bVducXwjmVSi27WcDOaLLCBV2t3tfVH9bYXAL76IvQA== + +"@types/d3-scale-chromatic@*": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz" + integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw== + +"@types/d3-scale@*": + version "4.0.8" + resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz" + integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== + dependencies: + "@types/d3-time" "*" + +"@types/d3-scale@4.0.2": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz" + integrity sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA== + dependencies: + "@types/d3-time" "*" + +"@types/d3-selection@*": + version "3.0.10" + resolved "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz" + integrity sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg== + +"@types/d3-shape@*": + version "3.1.6" + resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz" + integrity sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA== + dependencies: + "@types/d3-path" "*" + +"@types/d3-shape@^1.3.1": + version "1.3.12" + resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz" + integrity sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q== + dependencies: + "@types/d3-path" "^1" + +"@types/d3-time-format@*": + version "4.0.3" + resolved "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz" + integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== + +"@types/d3-time-format@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.0.tgz" + integrity sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA== + +"@types/d3-time@*": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz" + integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== + +"@types/d3-time@3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz" + integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== + +"@types/d3-timer@*": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== + +"@types/d3-transition@*": + version "3.0.8" + resolved "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz" + integrity sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-voronoi@^1.1.9": + version "1.1.12" + resolved "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.12.tgz" + integrity sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw== + +"@types/d3-zoom@*": + version "3.0.8" + resolved "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz" + integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + +"@types/d3@^3": + version "3.5.53" + resolved "https://registry.npmjs.org/@types/d3/-/d3-3.5.53.tgz" + integrity sha512-8yKQA9cAS6+wGsJpBysmnhlaaxlN42Qizqkw+h2nILSlS+MAG2z4JdO6p+PJrJ+ACvimkmLJL281h157e52psQ== + +"@types/d3@^7.4.3": + version "7.4.3" + resolved "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz" + integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== + dependencies: + "@types/d3-array" "*" + "@types/d3-axis" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" + "@types/d3-contour" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" + "@types/d3-drag" "*" + "@types/d3-dsv" "*" + "@types/d3-ease" "*" + "@types/d3-fetch" "*" + "@types/d3-force" "*" + "@types/d3-format" "*" + "@types/d3-geo" "*" + "@types/d3-hierarchy" "*" + "@types/d3-interpolate" "*" + "@types/d3-path" "*" + "@types/d3-polygon" "*" + "@types/d3-quadtree" "*" + "@types/d3-random" "*" + "@types/d3-scale" "*" + "@types/d3-scale-chromatic" "*" + "@types/d3-selection" "*" + "@types/d3-shape" "*" + "@types/d3-time" "*" + "@types/d3-time-format" "*" + "@types/d3-timer" "*" + "@types/d3-transition" "*" + "@types/d3-zoom" "*" + +"@types/debug@^4.1.7": + version "4.1.12" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/dompurify@^3.0.3": + version "3.0.5" + resolved "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz" + integrity sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg== + dependencies: + "@types/trusted-types" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.7" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^8.4.5": + version "8.56.6" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.6.tgz" + integrity sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/geojson@*": + version "7946.0.14" + resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz" + integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.5", "@types/jest@>= 28": + version "29.5.12" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/js-levenshtein@^1.1.1": + version "1.1.3" + resolved "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz" + integrity sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ== + +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/lodash@^4.14.172", "@types/lodash@^4.14.178", "@types/lodash@^4.14.191", "@types/lodash@^4.14.199": + version "4.17.0" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz" + integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node@*", "@types/node@>= 14": + version "20.11.30" + resolved "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz" + integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== + dependencies: + undici-types "~5.26.4" + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/prop-types@*", "@types/prop-types@^15.7.11": + version "15.7.11" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/react-dom@*", "@types/react-dom@^18.0.0", "@types/react-dom@^18.2.8": + version "18.2.22" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz" + integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== + dependencies: + "@types/react" "*" + +"@types/react-router-dom@^5.3.3": + version "5.3.3" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*": + version "5.1.20" + resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react-transition-group@^4.4.10": + version "4.4.10" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== + dependencies: + "@types/react" "*" + +"@types/react-window@^1.8.6": + version "1.8.8" + resolved "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz" + integrity sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^18.2.23", "@types/react@>=17.0.0": + version "18.2.67" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.67.tgz" + integrity sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/set-cookie-parser@^2.4.0": + version "2.4.7" + resolved "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.7.tgz" + integrity sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + +"@types/trusted-types@*": + version "2.0.7" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^6.7.3": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + 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" + +"@typescript-eslint/parser@^6.0.0", "@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + 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" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + 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" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + 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" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@use-gesture/core@10.3.1": + version "10.3.1" + resolved "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz" + integrity sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw== + +"@use-gesture/react@^10.0.0-beta.22": + version "10.3.1" + resolved "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz" + integrity sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g== + dependencies: + "@use-gesture/core" "10.3.1" + +"@visx/annotation@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/annotation/-/annotation-3.3.0.tgz" + integrity sha512-v0htpd/sT1kdU1N7frqmj078UByJXUwPQJT9LENv0ypssjGyRgvZERjkgSUuMKMjZquOBs/f6XOzxF4mLV57sA== + dependencies: + "@types/react" "*" + "@visx/drag" "3.3.0" + "@visx/group" "3.3.0" + "@visx/text" "3.3.0" + classnames "^2.3.1" + prop-types "^15.5.10" + react-use-measure "^2.0.4" + +"@visx/axis@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@visx/axis/-/axis-3.10.1.tgz" + integrity sha512-HBEDLcpZoJ16hFbkYu3S6mN5mbwlFmUWY5yN967X06RdIL4LmAG3gnZ7u4F9buA3LQo+trJXW78moN005odD4Q== + dependencies: + "@types/react" "*" + "@visx/group" "3.3.0" + "@visx/point" "3.3.0" + "@visx/scale" "3.5.0" + "@visx/shape" "3.5.0" + "@visx/text" "3.3.0" + classnames "^2.3.1" + prop-types "^15.6.0" + +"@visx/bounds@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/bounds/-/bounds-3.3.0.tgz" + integrity sha512-gESmN+4N2NkeUzqQEDZaS63umkGfMp9XjQcKBqtOR64mjjQtamh3lNVRWvKjJ2Zb421RbYHWq22Wv9nay6ZUOg== + dependencies: + "@types/react" "*" + "@types/react-dom" "*" + prop-types "^15.5.10" + +"@visx/brush@3.10.4": + version "3.10.4" + resolved "https://registry.npmjs.org/@visx/brush/-/brush-3.10.4.tgz" + integrity sha512-V1vmthRuODSOxt4V/aSVQF9/2V+t/DDQZHFj+M8ueiv9OVznBXVydkMDnaAG5jRAEboX8JlKSmTFB6YrrPc+Ow== + dependencies: + "@visx/drag" "3.3.0" + "@visx/event" "3.3.0" + "@visx/group" "3.3.0" + "@visx/scale" "3.5.0" + "@visx/shape" "3.5.0" + classnames "^2.3.1" + prop-types "^15.6.1" + +"@visx/clip-path@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/clip-path/-/clip-path-3.3.0.tgz" + integrity sha512-uMuI2M05qZTgUdTSHJGg4VDr2gytGmGyuaC89iByHqNaeMHkrJqQi/cOFAZi4D0dn75p7lVirJijEgDgSpcrMQ== + dependencies: + "@types/react" "*" + prop-types "^15.5.10" + +"@visx/curve@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/curve/-/curve-3.3.0.tgz" + integrity sha512-G1l1rzGWwIs8ka3mBhO/gj8uYK6XdU/3bwRSoiZ+MockMahQFPog0bUkuVgPwwzPSJfsA/E5u53Y/DNesnHQxg== + dependencies: + "@types/d3-shape" "^1.3.1" + d3-shape "^1.0.6" + +"@visx/delaunay@3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@visx/delaunay/-/delaunay-3.5.0.tgz" + integrity sha512-M5X50FBEw3EZcnrT8qnjmm80CzSRZnwZA9DXbtgjOVdMJcuBZXsE0QKYisuTkH0bMLV765WKZWaQy8dwWb1snw== + dependencies: + "@types/react" "*" + "@visx/vendor" "3.5.0" + classnames "^2.3.1" + prop-types "^15.6.1" + +"@visx/drag@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/drag/-/drag-3.3.0.tgz" + integrity sha512-fLNsorq6GyANCqAE/dToG0q7YoGVxihGC9FZQUp0MCV1wMJIJ45ximhrl5NDng2ytbpWnBmXu8M8hdsdFuvIXw== + dependencies: + "@types/react" "*" + "@visx/event" "3.3.0" + "@visx/point" "3.3.0" + prop-types "^15.5.10" + +"@visx/event@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/event/-/event-3.3.0.tgz" + integrity sha512-fKalbNgNz2ooVOTXhvcOx5IlEQDgVfX66rI7bgZhBxI2/scy+5rWcXJXpwkheRF68SMx9R93SjKW6tmiD0h+jA== + dependencies: + "@types/react" "*" + "@visx/point" "3.3.0" + +"@visx/geo@3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@visx/geo/-/geo-3.5.0.tgz" + integrity sha512-TpfMrLL5zHkrxKaasN9G2EQnCBmbhTgLa+o9/6lEFrBp8l4+j3zFaH/U6I6mqlhfMdZqgTj+9ryM4K7AfBuKDA== + dependencies: + "@types/geojson" "*" + "@types/react" "*" + "@visx/group" "3.3.0" + "@visx/vendor" "3.5.0" + classnames "^2.3.1" + prop-types "^15.5.10" + +"@visx/glyph@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/glyph/-/glyph-3.3.0.tgz" + integrity sha512-U2r1rFLpim3afKuuAmrbxXGSDCaLwXHmjXxWN8PiIQPMxpS7eaa/V5g2TRd/+x0KCkaf3Ismk4VKMl8ZlrmxIQ== + dependencies: + "@types/d3-shape" "^1.3.1" + "@types/react" "*" + "@visx/group" "3.3.0" + classnames "^2.3.1" + d3-shape "^1.2.0" + prop-types "^15.6.2" + +"@visx/gradient@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/gradient/-/gradient-3.3.0.tgz" + integrity sha512-t3vqukahDQsJ64/fcm85woFm2XPpSPMBz92gFvaY4J8EJY3e6rFOg382v5Dm17fgNsLRKJA0Vqo7mUtDe2pWOw== + dependencies: + "@types/react" "*" + prop-types "^15.5.7" + +"@visx/grid@3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@visx/grid/-/grid-3.5.0.tgz" + integrity sha512-i1pdobTE223ItMiER3q4ojIaZWja3vg46TkS6FotnBZ4c0VRDHSrALQPdi0na+YEgppASWCQ2WrI/vD6mIkhSg== + dependencies: + "@types/react" "*" + "@visx/curve" "3.3.0" + "@visx/group" "3.3.0" + "@visx/point" "3.3.0" + "@visx/scale" "3.5.0" + "@visx/shape" "3.5.0" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/group@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/group/-/group-3.3.0.tgz" + integrity sha512-yKepDKwJqlzvnvPS0yDuW13XNrYJE4xzT6xM7J++441nu6IybWWwextyap8ey+kU651cYDb+q1Oi6aHvQwyEyw== + dependencies: + "@types/react" "*" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/heatmap@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/heatmap/-/heatmap-3.3.0.tgz" + integrity sha512-FekGeV9hKS8c1G3hiKua1X3ccmCfY+QNPT6FV8XYfU3Mrlk2xi6WjSwqG1YaqYp+JsJ0mQXt/kW82RzFSqERwg== + dependencies: + "@types/react" "*" + "@visx/group" "3.3.0" + classnames "^2.3.1" + prop-types "^15.6.1" + +"@visx/hierarchy@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/hierarchy/-/hierarchy-3.3.0.tgz" + integrity sha512-nPOZDsSst95+eZOQjZQbq1cuVywriiNAOQp2yXDkZov/32b7Qj0aakXvwU1Yd2DhriuSxlNzMecwVX7L6azrIg== + dependencies: + "@types/d3-hierarchy" "^1.1.6" + "@types/react" "*" + "@visx/group" "3.3.0" + classnames "^2.3.1" + d3-hierarchy "^1.1.4" + prop-types "^15.6.1" + +"@visx/legend@3.10.3": + version "3.10.3" + resolved "https://registry.npmjs.org/@visx/legend/-/legend-3.10.3.tgz" + integrity sha512-jEEK/zdp8gslc3egb3tqNi7dz79riuWR032lCHnULge/h+TtbrC8MnwhbdCbcCn7Fnu3SvY/5DnPpZImFE/Ojg== + dependencies: + "@types/react" "*" + "@visx/group" "3.3.0" + "@visx/scale" "3.5.0" + classnames "^2.3.1" + prop-types "^15.5.10" + +"@visx/marker@3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@visx/marker/-/marker-3.5.0.tgz" + integrity sha512-gpB+YkhNqaRLRQLLkDnwP1oFevbdOeAMRZJVB1e/XaDG/mL5maVPN6sYDoEPME276LOcW9MMfQeKM8JrRH8nFw== + dependencies: + "@types/react" "*" + "@visx/group" "3.3.0" + "@visx/shape" "3.5.0" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/mock-data@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/mock-data/-/mock-data-3.3.0.tgz" + integrity sha512-yb5R/tAU8fjwRSc5VL1UPYbkD+BoYjXUorblE3/oDcSfFrOvpRMZzSaYCBbZ6jtllge3Ks6QVzwyUUj1/xweqQ== + dependencies: + "@types/d3-random" "^2.2.0" + d3-random "^2.2.2" + +"@visx/network@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/network/-/network-3.3.0.tgz" + integrity sha512-D4uRFQ+QKSyiDQ6YpjuC082yMllCKtv+KwDcNpyv8XNBkFm3LJuDKpIY4CDCrLeLhOiOTAfyEH7GV/cOcKiw5A== + dependencies: + "@types/react" "*" + "@visx/group" "3.3.0" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/pattern@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/pattern/-/pattern-3.3.0.tgz" + integrity sha512-x/a8sG8a+yj+yMjecL+UunRBGPf2Jm6L/X5AbRHEYddHZxxZa6FwxFuJe4R6S19+/vmFaXm8Md1ZAzT/cu6Icw== + dependencies: + "@types/react" "*" + classnames "^2.3.1" + prop-types "^15.5.10" + +"@visx/point@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/point/-/point-3.3.0.tgz" + integrity sha512-03eBBIJarkmX79WbeEGTUZwmS5/MUuabbiM9KfkGS9pETBTWkp1DZtEHZdp5z34x5TDQVLSi0rk1Plg3/8RtDg== + +"@visx/react-spring@3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@visx/react-spring/-/react-spring-3.10.1.tgz" + integrity sha512-OB64l98nGF0pBFXUmAgzQVJNhQvLXTw3RpyP11LpljJh4NRtpcnuHAYCruVQJjRrN7MIrqPdhhG0xvibLib2rg== + dependencies: + "@types/react" "*" + "@visx/axis" "3.10.1" + "@visx/grid" "3.5.0" + "@visx/scale" "3.5.0" + "@visx/text" "3.3.0" + classnames "^2.3.1" + prop-types "^15.6.2" + +"@visx/responsive@3.10.2": + version "3.10.2" + resolved "https://registry.npmjs.org/@visx/responsive/-/responsive-3.10.2.tgz" + integrity sha512-oDzFnLLpGpvTcFDoixVJX6iKOVzNJJW4dlAnsfgtxa/ibgMFZGoN4QL3NIzVlgg9s0fTDFCgQ+0FSMv1VvgKlQ== + dependencies: + "@types/lodash" "^4.14.172" + "@types/react" "*" + lodash "^4.17.21" + prop-types "^15.6.1" + +"@visx/scale@3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@visx/scale/-/scale-3.5.0.tgz" + integrity sha512-xo3zrXV2IZxrMq9Y9RUVJUpd93h3NO/r/y3GVi5F9AsbOzOhsLIbsPkunhO9mpUSR8LZ9TiumLEBrY+3frRBSg== + dependencies: + "@visx/vendor" "3.5.0" + +"@visx/shape@3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@visx/shape/-/shape-3.5.0.tgz" + integrity sha512-DP3t9jBQ7dSE3e6ptA1xO4QAIGxO55GrY/6P+S6YREuQGjZgq20TLYLAsiaoPEzFSS4tp0m12ZTPivWhU2VBTw== + dependencies: + "@types/d3-path" "^1.0.8" + "@types/d3-shape" "^1.3.1" + "@types/lodash" "^4.14.172" + "@types/react" "*" + "@visx/curve" "3.3.0" + "@visx/group" "3.3.0" + "@visx/scale" "3.5.0" + classnames "^2.3.1" + d3-path "^1.0.5" + d3-shape "^1.2.0" + lodash "^4.17.21" + prop-types "^15.5.10" + +"@visx/text@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/text/-/text-3.3.0.tgz" + integrity sha512-fOimcsf0GtQE9whM5MdA/xIkHMaV29z7qNqNXysUDE8znSMKsN+ott7kSg2ljAEE89CQo3WKHkPNettoVsa84w== + dependencies: + "@types/lodash" "^4.14.172" + "@types/react" "*" + classnames "^2.3.1" + lodash "^4.17.21" + prop-types "^15.7.2" + reduce-css-calc "^1.3.0" + +"@visx/threshold@3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@visx/threshold/-/threshold-3.5.0.tgz" + integrity sha512-Vq6yq2QIVuIOs8GfIhj+ifsAN3mglw9jWGPaLLHm72Hzr13NdQDFeWSZ8a6yQAcpA3oz7N/2StqLzb0FPYZRbA== + dependencies: + "@types/react" "*" + "@visx/clip-path" "3.3.0" + "@visx/shape" "3.5.0" + classnames "^2.3.1" + prop-types "^15.5.10" + +"@visx/tooltip@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/tooltip/-/tooltip-3.3.0.tgz" + integrity sha512-0ovbxnvAphEU/RVJprWHdOJT7p3YfBDpwXclXRuhIY2EkH59g8sDHatDcYwiNPeqk61jBh1KACRZxqToMuutlg== + dependencies: + "@types/react" "*" + "@visx/bounds" "3.3.0" + classnames "^2.3.1" + prop-types "^15.5.10" + react-use-measure "^2.0.4" + +"@visx/vendor@3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@visx/vendor/-/vendor-3.5.0.tgz" + integrity sha512-yt3SEZRVmt36+APsCISSO9eSOtzQkBjt+QRxNRzcTWuzwMAaF3PHCCSe31++kkpgY9yFoF+Gfes1TBe5NlETiQ== + dependencies: + "@types/d3-array" "3.0.3" + "@types/d3-color" "3.1.0" + "@types/d3-delaunay" "6.0.1" + "@types/d3-format" "3.0.1" + "@types/d3-geo" "3.1.0" + "@types/d3-interpolate" "3.0.1" + "@types/d3-scale" "4.0.2" + "@types/d3-time" "3.0.0" + "@types/d3-time-format" "2.1.0" + d3-array "3.2.1" + d3-color "3.1.0" + d3-delaunay "6.0.2" + d3-format "3.1.0" + d3-geo "3.1.0" + d3-interpolate "3.0.1" + d3-scale "4.0.2" + d3-time "3.1.0" + d3-time-format "4.1.0" + internmap "2.0.3" + +"@visx/visx@^3.11.0": + version "3.11.0" + resolved "https://registry.npmjs.org/@visx/visx/-/visx-3.11.0.tgz" + integrity sha512-KtWpwAMymm2oxF0bjfECoIlIoiZu71d4YmhJR/fAt7puKttKk+Syy0X1KqLXxsapan6DkV9dgCTc2mVCjKKoKw== + dependencies: + "@visx/annotation" "3.3.0" + "@visx/axis" "3.10.1" + "@visx/bounds" "3.3.0" + "@visx/brush" "3.10.4" + "@visx/clip-path" "3.3.0" + "@visx/curve" "3.3.0" + "@visx/delaunay" "3.5.0" + "@visx/drag" "3.3.0" + "@visx/event" "3.3.0" + "@visx/geo" "3.5.0" + "@visx/glyph" "3.3.0" + "@visx/gradient" "3.3.0" + "@visx/grid" "3.5.0" + "@visx/group" "3.3.0" + "@visx/heatmap" "3.3.0" + "@visx/hierarchy" "3.3.0" + "@visx/legend" "3.10.3" + "@visx/marker" "3.5.0" + "@visx/mock-data" "3.3.0" + "@visx/network" "3.3.0" + "@visx/pattern" "3.3.0" + "@visx/point" "3.3.0" + "@visx/responsive" "3.10.2" + "@visx/scale" "3.5.0" + "@visx/shape" "3.5.0" + "@visx/text" "3.3.0" + "@visx/threshold" "3.5.0" + "@visx/tooltip" "3.3.0" + "@visx/voronoi" "3.3.0" + "@visx/wordcloud" "3.3.0" + "@visx/xychart" "3.11.0" + "@visx/zoom" "3.3.0" + +"@visx/voronoi@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/voronoi/-/voronoi-3.3.0.tgz" + integrity sha512-twVovwdcEZZRkFV+x6yXGcyohf7gYHz0y/dFoS0SfGtEwT+CMEQgfO3ZDNQjU8X/m8je/wu9qtd35Zur+0RYOQ== + dependencies: + "@types/d3-voronoi" "^1.1.9" + "@types/react" "*" + classnames "^2.3.1" + d3-voronoi "^1.1.2" + prop-types "^15.6.1" + +"@visx/wordcloud@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/wordcloud/-/wordcloud-3.3.0.tgz" + integrity sha512-nopA4+qoBo3xDlHPNqq7cQx/8u1pfsNk6a+RNJwQFM4Nql7AgD9X9rcThqxXzGxJK3oODH9qgEhs4q+m4Jn46A== + dependencies: + "@types/d3-cloud" "1.2.5" + "@visx/group" "3.3.0" + d3-cloud "^1.2.5" + +"@visx/xychart@3.11.0": + version "3.11.0" + resolved "https://registry.npmjs.org/@visx/xychart/-/xychart-3.11.0.tgz" + integrity sha512-phs/q0eeVNJDaHkKLQ+/0UYVt1fiVTaDZPtOVgcFRpEghpRWFgyApGuZ+BWWnTcGzpLEVv1HBcVA6H555IpvJQ== + dependencies: + "@types/lodash" "^4.14.172" + "@types/react" "*" + "@visx/annotation" "3.3.0" + "@visx/axis" "3.10.1" + "@visx/event" "3.3.0" + "@visx/glyph" "3.3.0" + "@visx/grid" "3.5.0" + "@visx/react-spring" "3.10.1" + "@visx/responsive" "3.10.2" + "@visx/scale" "3.5.0" + "@visx/shape" "3.5.0" + "@visx/text" "3.3.0" + "@visx/tooltip" "3.3.0" + "@visx/vendor" "3.5.0" + "@visx/voronoi" "3.3.0" + classnames "^2.3.1" + d3-interpolate-path "2.2.1" + d3-shape "^2.0.0" + lodash "^4.17.21" + mitt "^2.1.0" + prop-types "^15.6.2" + +"@visx/zoom@3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@visx/zoom/-/zoom-3.3.0.tgz" + integrity sha512-ijSitmJWbhupAe1F0LTsusg/WWEvYBcxV9iOHmTbGHhgpdKuhmZCXYg2zGAF4oT3lTuhofUA678jQt5+U9FlWA== + dependencies: + "@types/react" "*" + "@use-gesture/react" "^10.0.0-beta.22" + "@visx/event" "3.3.0" + prop-types "^15.6.2" + +"@vitejs/plugin-react@^4.0.3": + version "4.2.1" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz" + integrity sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ== + dependencies: + "@babel/core" "^7.23.5" + "@babel/plugin-transform-react-jsx-self" "^7.23.3" + "@babel/plugin-transform-react-jsx-source" "^7.23.3" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.0" + +"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@xmldom/xmldom@^0.8.3": + version "0.8.10" + resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.2: + version "8.3.2" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.1.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ajv@^8.0.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.8.2, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-hidden@^1.1.3: + version "1.2.4" + resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz" + integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== + dependencies: + tslib "^2.0.0" + +aria-query@^5.0.0, aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +async@^3.2.3: + version "3.2.6" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axios@^1.5.1: + version "1.6.8" + resolved "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz" + integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-jest@^29.0.0, babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + 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" + +babel-loader@^9.1.3: + version "9.1.3" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz" + integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== + dependencies: + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + 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" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@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-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + integrity sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.10, browserslist@^4.22.2, "browserslist@>= 4.21.0": + version "4.23.0" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001587: + version "1.0.30001599" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz" + integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA== + +chain-function@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz" + integrity sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^3.4.2: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chromatic@^7.2.0: + version "7.6.0" + resolved "https://registry.npmjs.org/chromatic/-/chromatic-7.6.0.tgz" + integrity sha512-4MwlX8EDMyfQKf1NXTdUhJ2b0EYueByaVrF75pdFaOzHH7n3OhzknmQYbUSegLiFhKvHuvM8nZvf9SCajO+Cow== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +classnames@^2.3.1: + version "2.5.1" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +clsx@^2.0.0, clsx@^2.1.0, clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +clsx@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.0.0, color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3, color@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +color2k@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz" + integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +commander@2: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@7: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie@^0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + 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" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +csstype@3.0.9: + version "3.0.9" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz" + integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== + +csv-stringify@^5.3.6: + version "5.6.5" + resolved "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz" + integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== + +d3-array@^2.3.0, d3-array@^2.5.0, d3-array@2: + version "2.12.1" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3: + version "3.2.4" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-array@3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.1.tgz" + integrity sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ== + dependencies: + internmap "1 - 2" + +d3-axis@2: + version "2.1.0" + resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-2.1.0.tgz" + integrity sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw== + +d3-axis@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@2: + version "2.1.0" + resolved "https://registry.npmjs.org/d3-brush/-/d3-brush-2.1.0.tgz" + integrity sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ== + dependencies: + d3-dispatch "1 - 2" + d3-drag "2" + d3-interpolate "1 - 2" + d3-selection "2" + d3-transition "2" + +d3-brush@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-chord/-/d3-chord-2.0.0.tgz" + integrity sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig== + dependencies: + d3-path "1 - 2" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +d3-cloud@^1.2.5: + version "1.2.7" + resolved "https://registry.npmjs.org/d3-cloud/-/d3-cloud-1.2.7.tgz" + integrity sha512-8TrgcgwRIpoZYQp7s3fGB7tATWfhckRb8KcVd1bOgqkNdkJRDGWfdSf4HkHHzZxSczwQJdSxvfPudwir5IAJ3w== + dependencies: + d3-dispatch "^1.0.3" + +"d3-color@1 - 2", d3-color@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz" + integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== + +"d3-color@1 - 3", d3-color@3, d3-color@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-contour/-/d3-contour-2.0.0.tgz" + integrity sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA== + dependencies: + d3-array "2" + +d3-contour@4: + version "4.0.2" + resolved "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@5: + version "5.3.0" + resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz" + integrity sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w== + dependencies: + delaunator "4" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +d3-delaunay@6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz" + integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== + dependencies: + delaunator "5" + +d3-dispatch@^1.0.3: + version "1.0.6" + resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + +"d3-dispatch@1 - 2", d3-dispatch@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz" + integrity sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA== + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +d3-drag@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-2.0.0.tgz" + integrity sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w== + dependencies: + d3-dispatch "1 - 2" + d3-selection "2" + +"d3-dsv@1 - 2", d3-dsv@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz" + integrity sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w== + dependencies: + commander "2" + iconv-lite "0.4" + rw "1" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 2", d3-ease@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-2.0.0.tgz" + integrity sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ== + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-fetch/-/d3-fetch-2.0.0.tgz" + integrity sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw== + dependencies: + d3-dsv "1 - 2" + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@2: + version "2.1.1" + resolved "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz" + integrity sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew== + dependencies: + d3-dispatch "1 - 2" + d3-quadtree "1 - 2" + d3-timer "1 - 2" + +d3-force@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 2", d3-format@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz" + integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== + +"d3-format@1 - 3", d3-format@3, d3-format@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@2: + version "2.0.2" + resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz" + integrity sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA== + dependencies: + d3-array "^2.5.0" + +d3-geo@3: + version "3.1.1" + resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== + dependencies: + d3-array "2.5.0 - 3" + +d3-geo@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz" + integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@^1.1.4: + version "1.1.9" + resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-hierarchy@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-hierarchy@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz" + integrity sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw== + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +d3-interpolate-path@2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/d3-interpolate-path/-/d3-interpolate-path-2.2.1.tgz" + integrity sha512-6qLLh/KJVzls0XtMsMpcxhqMhgVEN7VIbR/6YGZe2qlS8KDgyyVB20XcmGnDyB051HcefQXM/Tppa9vcANEA4Q== + +"d3-interpolate@1 - 2", "d3-interpolate@1.2.0 - 2", d3-interpolate@2: + version "2.0.1" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz" + integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== + dependencies: + d3-color "1 - 2" + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3, d3-interpolate@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@^1.0.5, d3-path@1: + version "1.0.9" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +"d3-path@1 - 2", d3-path@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz" + integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== + +d3-polygon@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz" + integrity sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 2", d3-quadtree@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz" + integrity sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz" + integrity sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw== + +d3-random@2: + version "2.2.2" + resolved "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz" + integrity sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-scale-chromatic@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz" + integrity sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA== + dependencies: + d3-color "1 - 2" + d3-interpolate "1 - 2" + +d3-scale-chromatic@3: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@3: + version "3.3.0" + resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz" + integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== + dependencies: + d3-array "^2.3.0" + d3-format "1 - 2" + d3-interpolate "1.2.0 - 2" + d3-time "^2.1.1" + d3-time-format "2 - 3" + +d3-scale@4, d3-scale@4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +d3-selection@^3.0.0, "d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-selection@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz" + integrity sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA== + +d3-shape@^1.0.6: + version "1.3.7" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-shape@^1.3.7: + version "1.3.7" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-shape@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz" + integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA== + dependencies: + d3-path "1 - 2" + +d3-shape@2: + version "2.1.0" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz" + integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA== + dependencies: + d3-path "1 - 2" + +d3-shape@3: + version "3.2.0" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 3", d3-time-format@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz" + integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== + dependencies: + d3-time "1 - 2" + +"d3-time-format@2 - 4", d3-time-format@4, d3-time-format@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +d3-time@^2.1.1, "d3-time@1 - 2", d3-time@2: + version "2.1.1" + resolved "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz" + integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== + dependencies: + d3-array "2" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3, d3-time@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 2", d3-timer@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz" + integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA== + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3", d3-transition@3: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-transition@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-2.0.0.tgz" + integrity sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog== + dependencies: + d3-color "1 - 2" + d3-dispatch "1 - 2" + d3-ease "1 - 2" + d3-interpolate "1 - 2" + d3-timer "1 - 2" + +d3-voronoi@^1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz" + integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== + +d3-zoom@^3.0.0, d3-zoom@3: + version "3.0.0" + resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3-zoom@2: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-2.0.0.tgz" + integrity sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw== + dependencies: + d3-dispatch "1 - 2" + d3-drag "2" + d3-interpolate "1 - 2" + d3-selection "2" + d3-transition "2" + +d3@^7.9.0: + version "7.9.0" + resolved "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz" + integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +d3@6: + version "6.7.0" + resolved "https://registry.npmjs.org/d3/-/d3-6.7.0.tgz" + integrity sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g== + dependencies: + d3-array "2" + d3-axis "2" + d3-brush "2" + d3-chord "2" + d3-color "2" + d3-contour "2" + d3-delaunay "5" + d3-dispatch "2" + d3-drag "2" + d3-dsv "2" + d3-ease "2" + d3-fetch "2" + d3-force "2" + d3-format "2" + d3-geo "2" + d3-hierarchy "2" + d3-interpolate "2" + d3-path "2" + d3-polygon "2" + d3-quadtree "2" + d3-random "2" + d3-scale "3" + d3-scale-chromatic "2" + d3-selection "2" + d3-shape "2" + d3-time "2" + d3-time-format "3" + d3-timer "2" + d3-transition "2" + d3-zoom "2" + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delaunator@4: + version "4.0.1" + resolved "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz" + integrity sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag== + +delaunator@5: + version "5.0.1" + resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz" + integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== + dependencies: + robust-predicates "^3.0.2" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dequal@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +diff-match-patch@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz" + integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + +dom-helpers@^3.3.1: + version "3.4.0" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +dompurify@^3.0.6: + version "3.0.10" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.0.10.tgz" + integrity sha512-WZDL8ZHTliEVP3Lk4phtvjg8SNQ3YMc5WVstxE8cszKZrFjzI4PF4ZTIk9VGAc9vZADO7uGO2V/ZiStcRSAT4Q== + +electron-to-chromium@^1.4.668: + version "1.4.713" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.713.tgz" + integrity sha512-vDarADhwntXiULEdmWd77g2dV6FrNGa8ecAC29MZ4TwPut2fvosD0/5sJd1qWNNe8HcJFAC+F5Lf9jW1NPtWmw== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +enhanced-resolve@^5.0.0, enhanced-resolve@^5.16.0, enhanced-resolve@^5.7.0: + version "5.16.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.2" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz" + integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + 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.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.17: + version "1.0.18" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz" + integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-module-lexer@^1.2.1: + version "1.4.2" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.2.tgz" + integrity sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild@^0.18.10: + version "0.18.20" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-plugin-hooks@^0.4.3: + version "0.4.3" + resolved "https://registry.npmjs.org/eslint-plugin-hooks/-/eslint-plugin-hooks-0.4.3.tgz" + integrity sha512-Ra/YMBoTVFlM3zcU0c3vW8WQnauDyj/zVGnx6MUlIHaIMdZ/fZcptA20rotOGpRxZDQhReTlCYzz8BQmteJNWw== + dependencies: + requireindex "~1.2.0" + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react-refresh@^0.4.3: + version "0.4.6" + resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz" + integrity sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA== + +eslint-plugin-react@^7.33.2: + version "7.34.1" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" + +eslint-plugin-simple-import-sort@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz" + integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +"eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.50.0, eslint@>=5.0.0, eslint@>=7, eslint@>=7.0.0: + version "8.57.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@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" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.2.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + 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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + 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" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +flexlayout-react@^0.7.11: + version "0.7.15" + resolved "https://registry.npmjs.org/flexlayout-react/-/flexlayout-react-0.7.15.tgz" + integrity sha512-ydTMdEoQO5BniylxVkSxa59rEY0+96lqqRII+QK+yq6028eHywPuxZawt4g45y5pMb9ptP4N9HPAQXAFsxwowQ== + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globals@^15.2.0: + version "15.2.0" + resolved "https://registry.npmjs.org/globals/-/globals-15.2.0.tgz" + integrity sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A== + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +graphql@^16.8.1: + version "16.8.1" + resolved "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz" + integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== + +hammerjs@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz" + integrity sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +headers-polyfill@3.2.5: + version "3.2.5" + resolved "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.2.5.tgz" + integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== + +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@^0.4.24, iconv-lite@0.4: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +idb@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +immutable@^4.3.4: + version "4.3.5" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.3, inherits@^2.0.4, inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@^8.2.0: + version "8.2.6" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + +internal-slot@^1.0.4, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + +"internmap@1 - 2", internmap@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-arguments@^1.0.4, is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-generator-function@^1.0.10, is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13, is-typed-array@^1.1.3: + version "1.1.13" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +javascript-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz" + integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@*, jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^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" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.0.0, jest@^29.7.0, "jest@>= 28": + version "29.7.0" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +jotai-devtools@^0.7.0: + version "0.7.1" + resolved "https://registry.npmjs.org/jotai-devtools/-/jotai-devtools-0.7.1.tgz" + integrity sha512-Uqz5LOXSNkVBYG7HEauYtguTJyndX5kMVtFSYsqcNrCr2H53okxMwZnRg5n7WOy9uHyi1+a5xa1omjpIH6lGbA== + dependencies: + "@mantine/core" "^6.0.21" + "@mantine/hooks" "^6.0.21" + "@mantine/prism" "^6.0.21" + "@redux-devtools/extension" "^3.2.6" + javascript-stringify "^2.1.0" + jsondiffpatch "^0.5.0" + react-error-boundary "^4.0.11" + react-json-tree "^0.18.0" + react-resizable-panels "^0.0.54" + +jotai@^2.4.3: + version "2.7.1" + resolved "https://registry.npmjs.org/jotai/-/jotai-2.7.1.tgz" + integrity sha512-bsaTPn02nFgWNP6cBtg/htZhCu4s0wxqoklRHePp6l/vlsypR9eLn7diRliwXYWMXDpPvW/LLA2afI8vwgFFaw== + +jquery@3: + version "3.7.1" + resolved "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz" + integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== + +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsondiffpatch@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.5.0.tgz" + integrity sha512-Quz3MvAwHxVYNXsOByL7xI5EB2WYOeFswqaHIA3qOK3isRWTxiplBEocmmru6XmxDB2L7jDNYtYA4FyimoAFEw== + dependencies: + chalk "^3.0.0" + diff-match-patch "^1.0.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.curry@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +logform@^2.6.0, logform@^2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz" + integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lottie-web@^5.10.2: + version "5.12.2" + resolved "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz" + integrity sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@1.x: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +math-expression-evaluator@^1.2.14: + version "1.4.0" + resolved "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz" + integrity sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw== + +"memoize-one@>=3.1.1 <6": + version "5.2.1" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.0, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.5: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mitt@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz" + integrity sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg== + +moment@^2.29.4: + version "2.30.1" + resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +msw@^1.3.1: + version "1.3.3" + resolved "https://registry.npmjs.org/msw/-/msw-1.3.3.tgz" + integrity sha512-CiPyRFiYJCXYyH/vwxT7m+sa4VZHuUH6cGwRBj0kaTjBGpsk4EnL47YzhoA859htVCF2vzqZuOsomIUlFqg9GQ== + dependencies: + "@mswjs/cookies" "^0.2.2" + "@mswjs/interceptors" "^0.17.10" + "@open-draft/until" "^1.0.3" + "@types/cookie" "^0.4.1" + "@types/js-levenshtein" "^1.1.1" + chalk "^4.1.1" + chokidar "^3.4.2" + cookie "^0.4.2" + graphql "^16.8.1" + headers-polyfill "3.2.5" + inquirer "^8.2.0" + is-node-process "^1.2.0" + js-levenshtein "^1.1.6" + node-fetch "^2.6.7" + outvariant "^1.4.0" + path-to-regexp "^6.2.0" + strict-event-emitter "^0.4.3" + type-fest "^2.19.0" + yargs "^17.3.1" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +newick-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/newick-js/-/newick-js-1.2.1.tgz" + integrity sha512-qyZVNtlXmORBf2w9vg2S/5N5mQlU46xDFdPX7SEDZTeSElafNQUelNzR7HWSKcVOpjXiDnBqkvjd5RlEG7/SEA== + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nwsapi@^2.2.2: + version "2.2.7" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.hasown@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +outvariant@^1.2.1, outvariant@^1.4.0: + version "1.4.2" + resolved "https://registry.npmjs.org/outvariant/-/outvariant-1.4.2.tgz" + integrity sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@^6.2.0: + version "6.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +phylotree@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/phylotree/-/phylotree-2.0.1.tgz" + integrity sha512-L6EA0le2TLzHAQJa3NPm4X6swtuOab8tAhPqugZ+Eqlstl0s3MIK5EvnXdkU2Cvm8Q5rmrNwq3AKsFLVqKiFZw== + dependencies: + commander "^6.2.1" + csv-stringify "^5.3.6" + d3 "6" + jquery "3" + lodash "^4.17.11" + moment "^2.29.4" + pretty-data "^0.40.0" + rollup-plugin-node-resolve "^5.2.0" + underscore "1.x" + winston "^3.2.1" + xml2js "^0.4.19" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss@^8.4.27: + version "8.4.38" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz" + integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== + +pretty-data@^0.40.0: + version "0.40.0" + resolved "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz" + integrity sha512-YFLnEdDEDnkt/GEhet5CYZHCvALw6+Elyb/tp8kQG03ZSIuzeaDWpZYndCXwgqu4NAjh1PI534dhDS1mHarRnQ== + +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^29.0.0: + version "29.7.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prism-react-renderer@^1.2.1: + version "1.3.5" + resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz" + integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +react-base16-styling@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.9.1.tgz" + integrity sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw== + dependencies: + "@babel/runtime" "^7.16.7" + "@types/base16" "^1.0.2" + "@types/lodash" "^4.14.178" + base16 "^1.0.0" + color "^3.2.1" + csstype "^3.0.10" + lodash.curry "^4.1.1" + +react-d3-tree@^3.6.2: + version "3.6.2" + resolved "https://registry.npmjs.org/react-d3-tree/-/react-d3-tree-3.6.2.tgz" + integrity sha512-1ExQlmEnv5iOw9XfZ3EcESDjzGXVKPAmyDJTJbvVfiwkplZtP7CcNEY0tKZf4XSW0FzYJf4aFXprGJen+95yuw== + dependencies: + "@bkrem/react-transition-group" "^1.3.3" + "@types/d3-hierarchy" "^1.1.8" + clone "^2.1.1" + d3-hierarchy "^1.1.9" + d3-selection "^3.0.0" + d3-shape "^1.3.7" + d3-zoom "^3.0.0" + dequal "^2.0.2" + uuid "^8.3.1" + +"react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^18.0.0, react-dom@^18.2.0, "react-dom@>= 16.3.0", react-dom@>=16.13, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, "react-dom@16.x || 17.x || 18.x": + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-draggable@^4.4.6: + version "4.4.6" + resolved "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz" + integrity sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw== + dependencies: + clsx "^1.1.1" + prop-types "^15.8.1" + +react-error-boundary@^4.0.11: + version "4.0.13" + resolved "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz" + integrity sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ== + dependencies: + "@babel/runtime" "^7.12.5" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0, react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-json-tree@^0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.18.0.tgz" + integrity sha512-Qe6HKSXrr++n9Y31nkRJ3XvQMATISpqigH1vEKhLwB56+nk5thTP0ITThpjxY6ZG/ubpVq/aEHIcyLP/OPHxeA== + dependencies: + "@babel/runtime" "^7.20.6" + "@types/lodash" "^4.14.191" + react-base16-styling "^0.9.1" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-refresh@^0.14.0: + version "0.14.0" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz" + integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== + +react-remove-scroll-bar@^2.3.6: + version "2.3.6" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@^2.5.5: + version "2.5.9" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.9.tgz" + integrity sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA== + dependencies: + react-remove-scroll-bar "^2.3.6" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-resizable-panels@^0.0.54: + version "0.0.54" + resolved "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-0.0.54.tgz" + integrity sha512-f8hHdQrqvXoiZGdRNuoOi/C2cdYT2nEpaOb1KIWVWorSTPZmnE+ZQiamGeu+AMx3iZ/tqBtlAkBOpKXzTnDCoA== + +react-router-dom@^6.16.0: + version "6.23.1" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz" + integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ== + dependencies: + "@remix-run/router" "1.16.1" + react-router "6.23.1" + +react-router@6.23.1: + version "6.23.1" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz" + integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ== + dependencies: + "@remix-run/router" "1.16.1" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react-textarea-autosize@8.3.4: + version "8.3.4" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz" + integrity sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ== + dependencies: + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react-use-measure@^2.0.4: + version "2.1.1" + resolved "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz" + integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig== + dependencies: + debounce "^1.2.1" + +react-window@^1.8.9: + version "1.8.10" + resolved "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz" + integrity sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg== + dependencies: + "@babel/runtime" "^7.0.0" + memoize-one ">=3.1.1 <6" + +react-zoomable-ui@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/react-zoomable-ui/-/react-zoomable-ui-0.11.0.tgz" + integrity sha512-2msg8DyZUToHNTek3WfvlvZ6mumWyocp7xPzUvMaYpQAwjXvenRYR9nlmmITLymJdZReNqR2nDW8I5yUC8mXiQ== + dependencies: + hammerjs "^2.0.8" + ts-invariant "^0.10.3" + +react@*, "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0", "react@^16.14.0 || ^17.0.0 || ^18.0.0", "react@^16.3.0-0 || ^17.0.0 || ^18.0.0", "react@^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0", "react@^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.3.0", "react@>= 16.8.0", react@>=0.14.9, react@>=16.13, react@>=16.13.1, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=17.0.0, "react@16 - 18", "react@16.x || 17.x || 18.x": + version "18.3.1" + resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^4.5.2: + version "4.5.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +reduce-css-calc@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz" + integrity sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA== + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz" + integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== + dependencies: + balanced-match "^1.0.0" + +"redux@^3.1.0 || ^4.0.0 || ^5.0.0": + version "5.0.1" + resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz" + integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requireindex@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +reselect@^4.1.8: + version "4.1.8" + resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz" + integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.11.1, resolve@^1.19.0, resolve@^1.20.0: + version "1.22.8" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +robust-predicates@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== + +rollup-plugin-node-resolve@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz" + integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== + dependencies: + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.11.1" + rollup-pluginutils "^2.8.1" + +rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^2.77.2: + version "2.79.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +rollup@^3.27.1, rollup@>=1.11.0: + version "3.29.4" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== + optionalDependencies: + fsevents "~2.3.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rw@1: + version "1.3.3" + resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.4.1" + resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +schema-utils@^3.1.1: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.3: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.4: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +set-cookie-parser@^2.4.6: + version "2.6.0" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz" + integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +strict-event-emitter@^0.2.4: + version "0.2.8" + resolved "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz" + integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== + dependencies: + events "^3.3.0" + +strict-event-emitter@^0.4.3: + version "0.4.6" + resolved "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz" + integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== + +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.10: + version "4.0.11" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tabbable@^6.0.1: + version "6.2.0" + resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.26.0, terser@^5.4.0: + version "5.29.2" + resolved "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz" + integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-invariant@^0.10.3: + version "0.10.3" + resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz" + integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== + dependencies: + tslib "^2.1.0" + +ts-jest@^29.1.1: + version "29.1.2" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz" + integrity sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + +ts-loader@^9.4.4: + version "9.5.1" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz" + integrity sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + source-map "^0.7.4" + +tsconfck@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.3.tgz" + integrity sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA== + +tsconfig-paths-webpack-plugin@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz" + integrity sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.1.2" + +tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.0.0, tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz" + integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@*, typescript@^5.0.0, typescript@^5.2.2, "typescript@>= 4.4.x", typescript@>=4.2.0, "typescript@>=4.3 <6": + version "5.4.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +underscore@1.x: + version "1.13.7" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz" + integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-callback-ref@^1.3.0: + version "1.3.2" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== + dependencies: + tslib "^2.0.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.3: + version "0.12.5" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +uuid@^8.3.1: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-to-istanbul@^9.0.1: + version "9.2.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +vite-plugin-eslint@^1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz" + integrity sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang== + dependencies: + "@rollup/pluginutils" "^4.2.1" + "@types/eslint" "^8.4.5" + rollup "^2.77.2" + +vite-tsconfig-paths@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz" + integrity sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA== + dependencies: + debug "^4.1.1" + globrex "^0.1.2" + tsconfck "^3.0.3" + +vite@*, "vite@^4.2.0 || ^5.0.0", vite@^4.4.5, vite@>=2: + version "4.5.2" + resolved "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz" + integrity sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w== + dependencies: + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" + optionalDependencies: + fsevents "~2.3.2" + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +warning@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz" + integrity sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ== + dependencies: + loose-envify "^1.0.0" + +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web-encoding@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.0.0, webpack@^5.1.0, webpack@>=5: + version "5.91.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.16.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +winston-transport@^4.7.0: + version "4.8.0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.8.0.tgz" + integrity sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA== + dependencies: + logform "^2.6.1" + readable-stream "^4.5.2" + triple-beam "^1.3.0" + +winston@^3.2.1: + version "3.15.0" + resolved "https://registry.npmjs.org/winston/-/winston-3.15.0.tgz" + integrity sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.6.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^8.11.0: + version "8.16.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xml2js@^0.4.19: + version "0.4.23" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== From 80a043f5905d3429fb79c6392b0ce2d47765c8f8 Mon Sep 17 00:00:00 2001 From: bdls-jamal Date: Tue, 8 Oct 2024 12:35:39 -0400 Subject: [PATCH 10/97] testing cluster view --- Eplant/config.ts | 2 + Eplant/views/KobiTestView/NavigatorView.tsx | 2 - Eplant/views/TestClusterView/Dendrogram.tsx | 86 +++++++++++++++++++ .../data.tsx | 0 Eplant/views/TestClusterView/index.tsx | 31 +++++++ 5 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 Eplant/views/TestClusterView/Dendrogram.tsx rename Eplant/views/{KobiTestView => TestClusterView}/data.tsx (100%) create mode 100644 Eplant/views/TestClusterView/index.tsx diff --git a/Eplant/config.ts b/Eplant/config.ts index 6ac90ecc..71587784 100644 --- a/Eplant/config.ts +++ b/Eplant/config.ts @@ -3,6 +3,7 @@ import { createContext, useContext } from 'react' import CellEFP from './views/CellEFP' import ChromosomeViewer from './views/ChromosomeViewer' import DebugView from './views/DebugView' +import Dendrogram from './views/TestClusterView' import ExperimentEFP from './views/ExperimentEFP' import FallbackView from './views/FallbackView' import GeneInfoView from './views/GeneInfoView' @@ -35,6 +36,7 @@ const userViews = [ ExperimentEFP, ChromosomeViewer, NavigatorView, + Dendrogram, ] // List of views that are used to lookup a view by id diff --git a/Eplant/views/KobiTestView/NavigatorView.tsx b/Eplant/views/KobiTestView/NavigatorView.tsx index 3235b64e..6bceeadb 100644 --- a/Eplant/views/KobiTestView/NavigatorView.tsx +++ b/Eplant/views/KobiTestView/NavigatorView.tsx @@ -69,8 +69,6 @@ const NavigatorView = () => { !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) ); - - const formatTreeData = (vertex: any): NodeData => { const childArcs = Array.from(parsedTree.graph[1]) .filter(arc => arc[0] === vertex); diff --git a/Eplant/views/TestClusterView/Dendrogram.tsx b/Eplant/views/TestClusterView/Dendrogram.tsx new file mode 100644 index 00000000..dcb01c77 --- /dev/null +++ b/Eplant/views/TestClusterView/Dendrogram.tsx @@ -0,0 +1,86 @@ +import { useMemo } from "react"; +import {data} from "./data"; +import { Tree } from "./data"; +import * as d3 from "d3"; + +const MARGIN = { top: 60, right: 60, bottom: 60, left: 60 }; + + +export const Dendrogram = () => { + const width = 600; + const height = 400; + const boundsWidth = width - MARGIN.right - MARGIN.left; + const boundsHeight = height - MARGIN.top - MARGIN.bottom; + + const hierarchy = useMemo(() => { + return d3.hierarchy(data).sum((d) => d.value); + }, [data]); + + const dendrogram = useMemo(() => { + const dendrogramGenerator = d3 + .cluster() + .size([boundsHeight, boundsWidth]); + return dendrogramGenerator(hierarchy); + }, [hierarchy, width, height]); + + const allNodes = dendrogram.descendants().map((node) => { + return ( + + + {!node.children && ( + + {node.data.name} + + )} + + ); + }); + + const horizontalLinkGenerator = d3.linkHorizontal(); + + const allEdges = dendrogram.descendants().map((node) => { + if (!node.parent) { + return; + } + return ( + + ); + }); + + return ( +
    + + + {allNodes} + {allEdges} + + +
    + ); +}; + +export default Dendrogram; diff --git a/Eplant/views/KobiTestView/data.tsx b/Eplant/views/TestClusterView/data.tsx similarity index 100% rename from Eplant/views/KobiTestView/data.tsx rename to Eplant/views/TestClusterView/data.tsx diff --git a/Eplant/views/TestClusterView/index.tsx b/Eplant/views/TestClusterView/index.tsx new file mode 100644 index 00000000..af2dc4b5 --- /dev/null +++ b/Eplant/views/TestClusterView/index.tsx @@ -0,0 +1,31 @@ +// index.tsx +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import Dendrogram from './Dendrogram'; +import { data } from "./data"; + +import { View } from '@eplant/View'; +import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; + + +// const App = () => ( +//
    +//

    Horizontal Dendrogram

    +// +//
    +// ); + +// const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); +// root.render(); + +const TestClusterView: View = { + name: 'Cluster View', + component: Dendrogram, + async getInitialData() { + return null; + }, + id: 'cluster-view', + icon: () => , +}; + +export default TestClusterView; From c844be54febf56fbc7590fb992c0753fe5b31de1 Mon Sep 17 00:00:00 2001 From: bdls-jamal Date: Tue, 8 Oct 2024 13:41:37 -0400 Subject: [PATCH 11/97] working version of cluster tree --- Eplant/config.ts | 2 +- Eplant/views/TestClusterView/Dendrogram.tsx | 225 ++++++++++++++----- Eplant/views/TestClusterView/index.tsx | 5 +- Eplant/views/TestClusterView/placeholder.tsx | 189 ++++++++++++++++ 4 files changed, 357 insertions(+), 64 deletions(-) create mode 100644 Eplant/views/TestClusterView/placeholder.tsx diff --git a/Eplant/config.ts b/Eplant/config.ts index 71587784..e6be2479 100644 --- a/Eplant/config.ts +++ b/Eplant/config.ts @@ -3,7 +3,6 @@ import { createContext, useContext } from 'react' import CellEFP from './views/CellEFP' import ChromosomeViewer from './views/ChromosomeViewer' import DebugView from './views/DebugView' -import Dendrogram from './views/TestClusterView' import ExperimentEFP from './views/ExperimentEFP' import FallbackView from './views/FallbackView' import GeneInfoView from './views/GeneInfoView' @@ -11,6 +10,7 @@ import GetStartedView from './views/GetStartedView' import NavigatorView from './views/KobiTestView' import PlantEFP from './views/PlantEFP' import PublicationViewer from './views/PublicationViewer' +import Dendrogram from './views/TestClusterView' import { type View } from './View' export type EplantConfig = { diff --git a/Eplant/views/TestClusterView/Dendrogram.tsx b/Eplant/views/TestClusterView/Dendrogram.tsx index dcb01c77..05495817 100644 --- a/Eplant/views/TestClusterView/Dendrogram.tsx +++ b/Eplant/views/TestClusterView/Dendrogram.tsx @@ -1,86 +1,189 @@ -import { useMemo } from "react"; -import {data} from "./data"; -import { Tree } from "./data"; +import { useEffect, useMemo, useRef, useState } from "react"; +import React from "react"; import * as d3 from "d3"; -const MARGIN = { top: 60, right: 60, bottom: 60, left: 60 }; +import { data } from "./data"; +import { Tree } from "./data"; +const MARGIN = { top: 60, right: 60, bottom: 60, left: 60 }; +const MIN_NODE_SPACING = 100; // Minimum pixels between nodes vertically export const Dendrogram = () => { - const width = 600; - const height = 400; - const boundsWidth = width - MARGIN.right - MARGIN.left; - const boundsHeight = height - MARGIN.top - MARGIN.bottom; + const containerRef = useRef(null); + const svgRef = useRef(null); + const gRef = useRef(null); + const [dimensions, setDimensions] = useState({ + width: 0, + height: 0, + boundsWidth: 0, + boundsHeight: 0 + }); + + // Create hierarchy once const hierarchy = useMemo(() => { - return d3.hierarchy(data).sum((d) => d.value); - }, [data]); + return d3.hierarchy(data); + }, []); + + // Calculate leaf count once + const leafCount = useMemo(() => { + return hierarchy.leaves().length; + }, [hierarchy]); + + // Update dimensions when window resizes + useEffect(() => { + const updateDimensions = () => { + if (!containerRef.current) return; + + const { width } = containerRef.current.getBoundingClientRect(); + // Base height calculation + const baseHeight = Math.max(400, width * 0.6); + // Minimum height needed for the tree + const minHeight = Math.max( + baseHeight, + leafCount * MIN_NODE_SPACING + MARGIN.top + MARGIN.bottom + ); + setDimensions({ + width, + height: minHeight, + boundsWidth: width - MARGIN.right - MARGIN.left, + boundsHeight: minHeight - MARGIN.top - MARGIN.bottom + }); + }; + + updateDimensions(); + window.addEventListener('resize', updateDimensions); + return () => window.removeEventListener('resize', updateDimensions); + }, [leafCount]); + + // Create the dendrogram layout const dendrogram = useMemo(() => { + if (!dimensions.boundsHeight || !dimensions.boundsWidth) return null; + const dendrogramGenerator = d3 .cluster() - .size([boundsHeight, boundsWidth]); - return dendrogramGenerator(hierarchy); - }, [hierarchy, width, height]); + .size([dimensions.boundsHeight, dimensions.boundsWidth]); - const allNodes = dendrogram.descendants().map((node) => { - return ( - - - {!node.children && ( - - {node.data.name} - - )} - - ); - }); + const root = dendrogramGenerator(hierarchy); + return root; + }, [hierarchy, dimensions.boundsWidth, dimensions.boundsHeight]); + + // Setup zoom behavior + useEffect(() => { + if (!svgRef.current || !gRef.current || !dimensions.width) return; + + const svg = d3.select(svgRef.current); + const g = d3.select(gRef.current); - const horizontalLinkGenerator = d3.linkHorizontal(); + const setZoomBounds = (transform: d3.ZoomTransform) => { + const padding = 100; + const xMin = -(dimensions.width * transform.k - padding); + const xMax = padding; + const yMin = -(dimensions.height * transform.k - padding); + const yMax = padding; - const allEdges = dendrogram.descendants().map((node) => { - if (!node.parent) { - return; - } + return transform.translate( + Math.min(xMax, Math.max(xMin, transform.x)), + Math.min(yMax, Math.max(yMin, transform.y)) + ); + }; + + const zoom = d3.zoom() + .scaleExtent([0.5, 5]) + .on("zoom", (event) => { + const constrainedTransform = setZoomBounds(event.transform); + g.attr("transform", constrainedTransform.toString()); + }); + + svg.call(zoom); + + svg.on("dblclick.zoom", () => { + svg.transition() + .duration(750) + .call(zoom.transform, d3.zoomIdentity.translate(MARGIN.left, MARGIN.top)); + }); + + svg.call(zoom.transform, d3.zoomIdentity.translate(MARGIN.left, MARGIN.top)); + + return () => { + svg.on(".zoom", null); + }; + }, [dimensions]); + + const rightAngledLinkGenerator = (source: any, target: any) => { + const offset = 100; + return `M${source.y},${source.x} + L${source.y + offset},${source.x} + L${source.y + offset},${target.x} + L${target.y},${target.x}`; + }; + + // Only render if we have dimensions and dendrogram data + if (!dimensions.width || !dendrogram) { return ( - +
    ); - }); + } - return ( -
    - - ( + + + {!node.children && ( + - {allNodes} + {node.data.name} + + )} + + )); + + const allEdges = dendrogram.links().map((link) => ( + + )); + + return ( +
    + + {allEdges} + {allNodes}
    ); }; -export default Dendrogram; +export default Dendrogram; \ No newline at end of file diff --git a/Eplant/views/TestClusterView/index.tsx b/Eplant/views/TestClusterView/index.tsx index af2dc4b5..8bb6b6ab 100644 --- a/Eplant/views/TestClusterView/index.tsx +++ b/Eplant/views/TestClusterView/index.tsx @@ -1,12 +1,13 @@ // index.tsx import React from 'react'; import ReactDOM from 'react-dom/client'; -import Dendrogram from './Dendrogram'; -import { data } from "./data"; import { View } from '@eplant/View'; import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; +import { data } from "./data"; +import Dendrogram from './Dendrogram'; + // const App = () => ( //
    diff --git a/Eplant/views/TestClusterView/placeholder.tsx b/Eplant/views/TestClusterView/placeholder.tsx new file mode 100644 index 00000000..05495817 --- /dev/null +++ b/Eplant/views/TestClusterView/placeholder.tsx @@ -0,0 +1,189 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import React from "react"; +import * as d3 from "d3"; + +import { data } from "./data"; +import { Tree } from "./data"; + +const MARGIN = { top: 60, right: 60, bottom: 60, left: 60 }; +const MIN_NODE_SPACING = 100; // Minimum pixels between nodes vertically + +export const Dendrogram = () => { + const containerRef = useRef(null); + const svgRef = useRef(null); + const gRef = useRef(null); + + const [dimensions, setDimensions] = useState({ + width: 0, + height: 0, + boundsWidth: 0, + boundsHeight: 0 + }); + + // Create hierarchy once + const hierarchy = useMemo(() => { + return d3.hierarchy(data); + }, []); + + // Calculate leaf count once + const leafCount = useMemo(() => { + return hierarchy.leaves().length; + }, [hierarchy]); + + // Update dimensions when window resizes + useEffect(() => { + const updateDimensions = () => { + if (!containerRef.current) return; + + const { width } = containerRef.current.getBoundingClientRect(); + // Base height calculation + const baseHeight = Math.max(400, width * 0.6); + // Minimum height needed for the tree + const minHeight = Math.max( + baseHeight, + leafCount * MIN_NODE_SPACING + MARGIN.top + MARGIN.bottom + ); + + setDimensions({ + width, + height: minHeight, + boundsWidth: width - MARGIN.right - MARGIN.left, + boundsHeight: minHeight - MARGIN.top - MARGIN.bottom + }); + }; + + updateDimensions(); + window.addEventListener('resize', updateDimensions); + return () => window.removeEventListener('resize', updateDimensions); + }, [leafCount]); + + // Create the dendrogram layout + const dendrogram = useMemo(() => { + if (!dimensions.boundsHeight || !dimensions.boundsWidth) return null; + + const dendrogramGenerator = d3 + .cluster() + .size([dimensions.boundsHeight, dimensions.boundsWidth]); + + const root = dendrogramGenerator(hierarchy); + return root; + }, [hierarchy, dimensions.boundsWidth, dimensions.boundsHeight]); + + // Setup zoom behavior + useEffect(() => { + if (!svgRef.current || !gRef.current || !dimensions.width) return; + + const svg = d3.select(svgRef.current); + const g = d3.select(gRef.current); + + const setZoomBounds = (transform: d3.ZoomTransform) => { + const padding = 100; + const xMin = -(dimensions.width * transform.k - padding); + const xMax = padding; + const yMin = -(dimensions.height * transform.k - padding); + const yMax = padding; + + return transform.translate( + Math.min(xMax, Math.max(xMin, transform.x)), + Math.min(yMax, Math.max(yMin, transform.y)) + ); + }; + + const zoom = d3.zoom() + .scaleExtent([0.5, 5]) + .on("zoom", (event) => { + const constrainedTransform = setZoomBounds(event.transform); + g.attr("transform", constrainedTransform.toString()); + }); + + svg.call(zoom); + + svg.on("dblclick.zoom", () => { + svg.transition() + .duration(750) + .call(zoom.transform, d3.zoomIdentity.translate(MARGIN.left, MARGIN.top)); + }); + + svg.call(zoom.transform, d3.zoomIdentity.translate(MARGIN.left, MARGIN.top)); + + return () => { + svg.on(".zoom", null); + }; + }, [dimensions]); + + const rightAngledLinkGenerator = (source: any, target: any) => { + const offset = 100; + return `M${source.y},${source.x} + L${source.y + offset},${source.x} + L${source.y + offset},${target.x} + L${target.y},${target.x}`; + }; + + // Only render if we have dimensions and dendrogram data + if (!dimensions.width || !dendrogram) { + return ( +
    + ); + } + + const allNodes = dendrogram.descendants().map((node) => ( + + + {!node.children && ( + + {node.data.name} + + )} + + )); + + const allEdges = dendrogram.links().map((link) => ( + + )); + + return ( +
    + + + {allEdges} + {allNodes} + + +
    + ); +}; + +export default Dendrogram; \ No newline at end of file From 895d26f52e5ad5fbcd52c7e14711b96f493003a2 Mon Sep 17 00:00:00 2001 From: "k.jamal" Date: Tue, 8 Oct 2024 22:22:46 -0400 Subject: [PATCH 12/97] working with newick data cluster tree --- Eplant/views/TestClusterView/Dendrogram.tsx | 120 ++++++++++++++++---- Eplant/views/TestClusterView/index.tsx | 12 -- 2 files changed, 95 insertions(+), 37 deletions(-) diff --git a/Eplant/views/TestClusterView/Dendrogram.tsx b/Eplant/views/TestClusterView/Dendrogram.tsx index 05495817..41d130cd 100644 --- a/Eplant/views/TestClusterView/Dendrogram.tsx +++ b/Eplant/views/TestClusterView/Dendrogram.tsx @@ -2,11 +2,61 @@ import { useEffect, useMemo, useRef, useState } from "react"; import React from "react"; import * as d3 from "d3"; -import { data } from "./data"; -import { Tree } from "./data"; - const MARGIN = { top: 60, right: 60, bottom: 60, left: 60 }; const MIN_NODE_SPACING = 100; // Minimum pixels between nodes vertically +const NEWICK_STRING = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; // Default Newick string +const DEFAULT_WIDTH = undefined; // Set to number for fixed width, undefined for responsive +const DEFAULT_HEIGHT = undefined; // Set to number for fixed height, undefined for responsive + +interface D3Node { + name: string; + value?: number; + children?: D3Node[]; +} + +function newickToD3(newickString: string): D3Node { + const cleaned = newickString.trim().replace(/;$/, ""); + + function parseNode(str: string): D3Node { + if (!str.includes("(")) { + const [name, lengthStr] = str.split(":"); + return { + name: name, + value: lengthStr ? parseFloat(lengthStr) : undefined + }; + } + + const matches = str.match(/\((.*)\)(.*)/); + if (!matches) throw new Error("Invalid Newick format"); + + const [_, childrenStr, remainingStr] = matches; + const children: D3Node[] = []; + let buffer = ""; + let parenthesesCount = 0; + + for (const char of childrenStr) { + if (char === "(") parenthesesCount++; + if (char === ")") parenthesesCount--; + if (char === "," && parenthesesCount === 0) { + children.push(parseNode(buffer.trim())); + buffer = ""; + } else { + buffer += char; + } + } + if (buffer.trim()) children.push(parseNode(buffer.trim())); + + const [name, lengthStr] = remainingStr.split(":"); + + return { + name: name || "internal", + value: lengthStr ? parseFloat(lengthStr) : undefined, + children + }; + } + + return parseNode(cleaned); +} export const Dendrogram = () => { const containerRef = useRef(null); @@ -14,20 +64,26 @@ export const Dendrogram = () => { const gRef = useRef(null); const [dimensions, setDimensions] = useState({ - width: 0, - height: 0, + width: DEFAULT_WIDTH || 0, + height: DEFAULT_HEIGHT || 0, boundsWidth: 0, boundsHeight: 0 }); // Create hierarchy once const hierarchy = useMemo(() => { - return d3.hierarchy(data); + try { + const d3Data = newickToD3(NEWICK_STRING); + return d3.hierarchy(d3Data); + } catch (error) { + console.error("Error parsing Newick string:", error); + return null; + } }, []); // Calculate leaf count once const leafCount = useMemo(() => { - return hierarchy.leaves().length; + return hierarchy?.leaves().length || 0; }, [hierarchy]); // Update dimensions when window resizes @@ -35,34 +91,34 @@ export const Dendrogram = () => { const updateDimensions = () => { if (!containerRef.current) return; - const { width } = containerRef.current.getBoundingClientRect(); - // Base height calculation - const baseHeight = Math.max(400, width * 0.6); - // Minimum height needed for the tree + const containerWidth = DEFAULT_WIDTH || containerRef.current.getBoundingClientRect().width; + const baseHeight = DEFAULT_HEIGHT || Math.max(400, containerWidth * 0.6); const minHeight = Math.max( baseHeight, leafCount * MIN_NODE_SPACING + MARGIN.top + MARGIN.bottom ); setDimensions({ - width, + width: containerWidth, height: minHeight, - boundsWidth: width - MARGIN.right - MARGIN.left, + boundsWidth: containerWidth - MARGIN.right - MARGIN.left, boundsHeight: minHeight - MARGIN.top - MARGIN.bottom }); }; updateDimensions(); - window.addEventListener('resize', updateDimensions); - return () => window.removeEventListener('resize', updateDimensions); + if (!DEFAULT_WIDTH || !DEFAULT_HEIGHT) { + window.addEventListener('resize', updateDimensions); + return () => window.removeEventListener('resize', updateDimensions); + } }, [leafCount]); // Create the dendrogram layout const dendrogram = useMemo(() => { - if (!dimensions.boundsHeight || !dimensions.boundsWidth) return null; + if (!dimensions.boundsHeight || !dimensions.boundsWidth || !hierarchy) return null; const dendrogramGenerator = d3 - .cluster() + .cluster() .size([dimensions.boundsHeight, dimensions.boundsWidth]); const root = dendrogramGenerator(hierarchy); @@ -112,14 +168,28 @@ export const Dendrogram = () => { }, [dimensions]); const rightAngledLinkGenerator = (source: any, target: any) => { - const offset = 100; - return `M${source.y},${source.x} - L${source.y + offset},${source.x} - L${source.y + offset},${target.x} - L${target.y},${target.x}`; + const sourceX = source.x; + const sourceY = source.y; + const targetX = target.x; + const targetY = target.y; + + const offset = Math.abs(targetY - sourceY) * 0.5; + return `M${sourceY},${sourceX} + L${sourceY + offset},${sourceX} + L${sourceY + offset},${targetX} + L${targetY},${targetX}`; }; - // Only render if we have dimensions and dendrogram data + // Error handling for invalid Newick string + if (!hierarchy) { + return ( +
    + Invalid Newick format. Please check the input string. +
    + ); + } + + // Loading state if (!dimensions.width || !dendrogram) { return (
    @@ -162,8 +232,8 @@ export const Dendrogram = () => {
    ( -//
    -//

    Horizontal Dendrogram

    -// -//
    -// ); - -// const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); -// root.render(); - const TestClusterView: View = { name: 'Cluster View', component: Dendrogram, From 492634bb32c7ccf6d9b76fae5896e0ae56d2b764 Mon Sep 17 00:00:00 2001 From: Yonah Aviv Date: Thu, 10 Oct 2024 12:10:40 -0400 Subject: [PATCH 13/97] nothing is working --- Eplant/views/InteractionsViewer/Topbar.tsx | 69 ++++++++----------- Eplant/views/InteractionsViewer/index.tsx | 2 +- .../InteractionsViewer/scripts/filterLogic.ts | 6 +- 3 files changed, 34 insertions(+), 43 deletions(-) diff --git a/Eplant/views/InteractionsViewer/Topbar.tsx b/Eplant/views/InteractionsViewer/Topbar.tsx index b4f1f7b4..e85b68b3 100644 --- a/Eplant/views/InteractionsViewer/Topbar.tsx +++ b/Eplant/views/InteractionsViewer/Topbar.tsx @@ -30,16 +30,20 @@ const Topbar: FC = ({ gene }) => { interConfSelector: '[interolog_conf <=', // PPPI correlation EPDISelector: '[type = "PDI"][method = "E"]', PPDISelector: '[type = "PDI"][method = "P"]', - fimoConfSelector: '[fimo_conf >= ' -} + fimoConfSelector: '[fimo_conf >= ', + } const zoomValue = 1000 - const applyFilters = () =>{ + const applyFilters = () => { // Create selectors - const eppiCorr = selectors.EPPISelector + selectors.corrSelector + EPPICorrValue + ']'; - const pppiCorr = selectors.PPPISelector + selectors.corrSelector + PPPICorrValue + ']'; - const pppiConf = selectors.PPPISelector + selectors.interConfSelector + PPPIConfValue + ']'; - const ppdiConf = selectors.PPDISelector + selectors.fimoConfSelector + PPDIConfValue + ']'; + const eppiCorr = + selectors.EPPISelector + selectors.corrSelector + EPPICorrValue + ']' + const pppiCorr = + selectors.PPPISelector + selectors.corrSelector + PPPICorrValue + ']' + const pppiConf = + selectors.PPPISelector + selectors.interConfSelector + PPPIConfValue + ']' + const ppdiConf = + selectors.PPDISelector + selectors.fimoConfSelector + PPDIConfValue + ']' } const handleLegendClick = () => { setShowLegend(!showLegend) @@ -84,7 +88,7 @@ const Topbar: FC = ({ gene }) => { - + @@ -102,50 +106,37 @@ const Topbar: FC = ({ gene }) => { id='filter-option-1' primary='Hide ALL experimentally determined Protein-Protein interactions' /> - {}} - checked={false} - - /> + {}} checked={false} /> - - {}} - checked={false} - + + {}} checked={false} /> - - {}} - checked={false} - + 0.5' /> + {}} checked={false} /> - - {}} - checked={false} - + + {}} checked={false} /> - - {}} - checked={false} - + + {}} checked={false} /> diff --git a/Eplant/views/InteractionsViewer/index.tsx b/Eplant/views/InteractionsViewer/index.tsx index 93135dc8..f8e9ccaa 100644 --- a/Eplant/views/InteractionsViewer/index.tsx +++ b/Eplant/views/InteractionsViewer/index.tsx @@ -20,7 +20,7 @@ import loadInteractions from './scripts/loadInteractions' import loadSublocalizations from './scripts/loadSublocalizations' import cytoStyles from './cytoStyles' import { InteractionsIcon } from './icon' -import Topbar from './Topbar.1' +import Topbar from './Topbar' // import GeneDialog from './GeneDialog' import { Interaction, diff --git a/Eplant/views/InteractionsViewer/scripts/filterLogic.ts b/Eplant/views/InteractionsViewer/scripts/filterLogic.ts index 32b9ec64..aaf7d36d 100644 --- a/Eplant/views/InteractionsViewer/scripts/filterLogic.ts +++ b/Eplant/views/InteractionsViewer/scripts/filterLogic.ts @@ -17,9 +17,9 @@ export const applyFilter = (cy: Core, selector: string) => { /** - * Clears interaction view of nodes without associated edges - * @returns {void} - */ + * Clears interaction view of nodes without associated edges + * @returns {void} + */ export const cleanNodes = (cy: Core) => { // Get all nodes in interaction view const nodes = cy.nodes(); From c573d0a62c0858c2832f96546502005b4133d3e8 Mon Sep 17 00:00:00 2001 From: bdls-jamal Date: Thu, 10 Oct 2024 15:07:36 -0400 Subject: [PATCH 14/97] changes to use on desktop pc --- Eplant/views/KobiTestView/NavigatorView.tsx | 4 +- Eplant/views/TestClusterView/Dendrogram.tsx | 328 ++++++++++------ Eplant/views/TestClusterView/placeholder.tsx | 373 +++++++++++++------ Eplant/views/TestClusterView/placeholder2 | 339 +++++++++++++++++ 4 files changed, 813 insertions(+), 231 deletions(-) create mode 100644 Eplant/views/TestClusterView/placeholder2 diff --git a/Eplant/views/KobiTestView/NavigatorView.tsx b/Eplant/views/KobiTestView/NavigatorView.tsx index 6bceeadb..d0196766 100644 --- a/Eplant/views/KobiTestView/NavigatorView.tsx +++ b/Eplant/views/KobiTestView/NavigatorView.tsx @@ -58,10 +58,10 @@ const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { const NavigatorView = () => { const [treeData, setTreeData] = useState(null); - + console.log(treeData); useEffect(() => { const newickData = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; - + try { const parsedTree = parse(newickData); const vertices = Array.from(parsedTree.graph[0]); diff --git a/Eplant/views/TestClusterView/Dendrogram.tsx b/Eplant/views/TestClusterView/Dendrogram.tsx index 41d130cd..655dc3ff 100644 --- a/Eplant/views/TestClusterView/Dendrogram.tsx +++ b/Eplant/views/TestClusterView/Dendrogram.tsx @@ -2,27 +2,68 @@ import { useEffect, useMemo, useRef, useState } from "react"; import React from "react"; import * as d3 from "d3"; -const MARGIN = { top: 60, right: 60, bottom: 60, left: 60 }; -const MIN_NODE_SPACING = 100; // Minimum pixels between nodes vertically -const NEWICK_STRING = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; // Default Newick string -const DEFAULT_WIDTH = undefined; // Set to number for fixed width, undefined for responsive -const DEFAULT_HEIGHT = undefined; // Set to number for fixed height, undefined for responsive +const MARGIN = { top: 50, right: 400, bottom: 50, left: 50 }; +const MIN_NODE_SPACING = 30; +const DEFAULT_WIDTH = 1200; +const DEFAULT_HEIGHT = 600; + +// Constants for visualization +const BAR_WIDTH = 100; +const BAR_HEIGHT = 12; +const BAR_SPACING = 2; +const LABEL_OFFSET = 10; +const NODE_RADIUS = 4; + +// Default API URL - can be modified later for dynamic updates +const DEFAULT_API_URL = 'https://bar.utoronto.ca/webservices/eplant_navigator/cgi-bin/eplant_navigator_service.cgi?primaryGene=AT3G24650&species=Arabidopsis&dataset=Developmental&checkedspecies=arabidopsis_poplar_medicago_soybean_rice_barley_maize_potato_tomato_grape'; + +// Helper function to extract primary gene from URL +function extractPrimaryGene(url: string): string { + const match = url.match(/primaryGene=([^&]+)/); + return match ? match[1] : ""; +} + +interface TreeData { + tree: string; + efp_links: Record; + genomes: Record; + SCC_values: Record; + sequence_similarity: Record; + maximum_values: Record; +} interface D3Node { name: string; value?: number; children?: D3Node[]; + metadata?: { + genome?: string; + scc_value?: number; + sequence_similarity?: number; + efp_link?: string; + }; } -function newickToD3(newickString: string): D3Node { +// Convert newick format data into D3 applicable data +// Convert TreeData obj to D3Node obj +function newickToD3(newickString: string, metadata: TreeData): D3Node { const cleaned = newickString.trim().replace(/;$/, ""); function parseNode(str: string): D3Node { if (!str.includes("(")) { const [name, lengthStr] = str.split(":"); + const cleanName = name.trim(); + const upperName = cleanName.toUpperCase(); + return { - name: name, - value: lengthStr ? parseFloat(lengthStr) : undefined + name: cleanName, + value: lengthStr ? parseFloat(lengthStr) : undefined, + metadata: { + genome: metadata.genomes[upperName], + scc_value: metadata.SCC_values[upperName], + sequence_similarity: metadata.sequence_similarity[upperName], + efp_link: metadata.efp_links[upperName] + } }; } @@ -58,172 +99,221 @@ function newickToD3(newickString: string): D3Node { return parseNode(cleaned); } +// For SVG Element Appending +const MetadataVisualizations = ({ + x, + y, + metadata, + isPrimaryGene +}: { + x: number; + y: number; + metadata: D3Node['metadata']; + isPrimaryGene: boolean; +}) => { + if (!metadata) return null; + + // Dynamically set bar widths based on metadata, but limit width to avoid full span bars + const sequenceSimilarity = Math.min(isPrimaryGene ? 1 : (metadata.sequence_similarity || 0), 1); + const expressionLevel = Math.min(isPrimaryGene ? 1 : (metadata.scc_value || 0), 1); + + return ( + + + {/* Expression Level Bar */} + + {/* Grey background bar for the primary gene only */} + + {/* Foreground black bar with dynamic width */} + + {/* Center line for expression comparison */} + + + + ); +}; + +// Export main dendrogram tree export const Dendrogram = () => { const containerRef = useRef(null); const svgRef = useRef(null); const gRef = useRef(null); + const [treeData, setTreeData] = useState(null); + const [error, setError] = useState(null); + const [apiUrl, setApiUrl] = useState(DEFAULT_API_URL); + const [primaryGene, setPrimaryGene] = useState(extractPrimaryGene(DEFAULT_API_URL)); const [dimensions, setDimensions] = useState({ - width: DEFAULT_WIDTH || 0, - height: DEFAULT_HEIGHT || 0, - boundsWidth: 0, - boundsHeight: 0 + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + boundsWidth: DEFAULT_WIDTH - MARGIN.left - MARGIN.right, + boundsHeight: DEFAULT_HEIGHT - MARGIN.top - MARGIN.bottom }); - // Create hierarchy once + useEffect(() => { + setPrimaryGene(extractPrimaryGene(apiUrl)); + }, [apiUrl]); + + // Fetch api data + useEffect(() => { + const fetchData = async () => { + try { + const response = await fetch(apiUrl); + if (!response.ok) throw new Error('Network response was not ok'); + const data = await response.json(); + if (data.status === "success") { + setTreeData(data); + setError(null); + } else { + setError("Failed to load tree data"); + } + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to fetch data"); + } + }; + fetchData(); + }, [apiUrl]); + + // Usememo for caching for efficient rendering const hierarchy = useMemo(() => { + if (!treeData) return null; try { - const d3Data = newickToD3(NEWICK_STRING); + const d3Data = newickToD3(treeData.tree, treeData); return d3.hierarchy(d3Data); } catch (error) { console.error("Error parsing Newick string:", error); return null; } - }, []); - - // Calculate leaf count once - const leafCount = useMemo(() => { - return hierarchy?.leaves().length || 0; - }, [hierarchy]); - - // Update dimensions when window resizes - useEffect(() => { - const updateDimensions = () => { - if (!containerRef.current) return; - - const containerWidth = DEFAULT_WIDTH || containerRef.current.getBoundingClientRect().width; - const baseHeight = DEFAULT_HEIGHT || Math.max(400, containerWidth * 0.6); - const minHeight = Math.max( - baseHeight, - leafCount * MIN_NODE_SPACING + MARGIN.top + MARGIN.bottom - ); - - setDimensions({ - width: containerWidth, - height: minHeight, - boundsWidth: containerWidth - MARGIN.right - MARGIN.left, - boundsHeight: minHeight - MARGIN.top - MARGIN.bottom - }); - }; - - updateDimensions(); - if (!DEFAULT_WIDTH || !DEFAULT_HEIGHT) { - window.addEventListener('resize', updateDimensions); - return () => window.removeEventListener('resize', updateDimensions); - } - }, [leafCount]); + }, [treeData]); - // Create the dendrogram layout const dendrogram = useMemo(() => { if (!dimensions.boundsHeight || !dimensions.boundsWidth || !hierarchy) return null; const dendrogramGenerator = d3 .cluster() - .size([dimensions.boundsHeight, dimensions.boundsWidth]); + .size([dimensions.boundsHeight * 0.8, dimensions.boundsWidth * 0.4]); - const root = dendrogramGenerator(hierarchy); - return root; + return dendrogramGenerator(hierarchy); }, [hierarchy, dimensions.boundsWidth, dimensions.boundsHeight]); - // Setup zoom behavior + // Zoom and drag effects useEffect(() => { if (!svgRef.current || !gRef.current || !dimensions.width) return; const svg = d3.select(svgRef.current); const g = d3.select(gRef.current); - const setZoomBounds = (transform: d3.ZoomTransform) => { - const padding = 100; - const xMin = -(dimensions.width * transform.k - padding); - const xMax = padding; - const yMin = -(dimensions.height * transform.k - padding); - const yMax = padding; - - return transform.translate( - Math.min(xMax, Math.max(xMin, transform.x)), - Math.min(yMax, Math.max(yMin, transform.y)) - ); - }; - const zoom = d3.zoom() .scaleExtent([0.5, 5]) .on("zoom", (event) => { - const constrainedTransform = setZoomBounds(event.transform); - g.attr("transform", constrainedTransform.toString()); + g.attr("transform", event.transform.toString()); }); svg.call(zoom); - svg.on("dblclick.zoom", () => { - svg.transition() - .duration(750) - .call(zoom.transform, d3.zoomIdentity.translate(MARGIN.left, MARGIN.top)); - }); - - svg.call(zoom.transform, d3.zoomIdentity.translate(MARGIN.left, MARGIN.top)); + svg.on("dblclick.zoom", null); + + // Initial transform to center the visualization + svg.call( + zoom.transform, + d3.zoomIdentity.translate(MARGIN.left, MARGIN.top) + ); return () => { svg.on(".zoom", null); }; }, [dimensions]); + if (error) { + return
    Error: {error}
    ; + } + + if (!treeData || !hierarchy || !dimensions.width || !dendrogram) { + return ( +
    + Loading... +
    + ); + } + + // Generates the tree at a right-angle rather than curved lines const rightAngledLinkGenerator = (source: any, target: any) => { const sourceX = source.x; const sourceY = source.y; const targetX = target.x; const targetY = target.y; - const offset = Math.abs(targetY - sourceY) * 0.5; + const midY = (sourceY + targetY) / 2; return `M${sourceY},${sourceX} - L${sourceY + offset},${sourceX} - L${sourceY + offset},${targetX} + L${midY},${sourceX} + L${midY},${targetX} L${targetY},${targetX}`; }; - // Error handling for invalid Newick string - if (!hierarchy) { - return ( -
    - Invalid Newick format. Please check the input string. -
    - ); - } - - // Loading state - if (!dimensions.width || !dendrogram) { + // Draw nodes and draw SVG/node values + const allNodes = dendrogram.descendants().map((node) => { + const isPrimaryGene = node.data.name === primaryGene; return ( -
    + + + {!node.children && ( + <> + + {/* Display name + genome name */} + {`${node.data.name}${node.data.metadata?.genome ? ` (${node.data.metadata.genome})` : ''}`} + + + + )} + ); - } - - const allNodes = dendrogram.descendants().map((node) => ( - - - {!node.children && ( - - {node.data.name} - - )} - - )); + }); const allEdges = dendrogram.links().map((link) => ( )); @@ -232,10 +322,8 @@ export const Dendrogram = () => {
    @@ -243,9 +331,7 @@ export const Dendrogram = () => { ref={svgRef} width={dimensions.width} height={dimensions.height} - style={{ cursor: "grab" }} - viewBox={`0 0 ${dimensions.width} ${dimensions.height}`} - preserveAspectRatio="xMidYMid meet" + style={{ cursor: "grab", backgroundColor: '#ffffff' }} > {allEdges} diff --git a/Eplant/views/TestClusterView/placeholder.tsx b/Eplant/views/TestClusterView/placeholder.tsx index 05495817..045f254e 100644 --- a/Eplant/views/TestClusterView/placeholder.tsx +++ b/Eplant/views/TestClusterView/placeholder.tsx @@ -2,71 +2,222 @@ import { useEffect, useMemo, useRef, useState } from "react"; import React from "react"; import * as d3 from "d3"; -import { data } from "./data"; -import { Tree } from "./data"; +const MARGIN = { top: 50, right: 400, bottom: 50, left: 50 }; +const MIN_NODE_SPACING = 30; +const DEFAULT_WIDTH = 1200; +const DEFAULT_HEIGHT = 600; -const MARGIN = { top: 60, right: 60, bottom: 60, left: 60 }; -const MIN_NODE_SPACING = 100; // Minimum pixels between nodes vertically +// Constants for visualization +const BAR_WIDTH = 100; +const BAR_HEIGHT = 12; +const BAR_SPACING = 2; +const LABEL_OFFSET = 10; +const NODE_RADIUS = 4; + +// Default API URL - can be modified later for dynamic updates +const DEFAULT_API_URL = 'https://bar.utoronto.ca/webservices/eplant_navigator/cgi-bin/eplant_navigator_service.cgi?primaryGene=AT3G24650&species=Arabidopsis&dataset=Developmental&checkedspecies=arabidopsis_poplar_medicago_soybean_rice_barley_maize_potato_tomato_grape'; + +// Helper function to extract primary gene from URL +function extractPrimaryGene(url: string): string { + const match = url.match(/primaryGene=([^&]+)/); + return match ? match[1] : ""; +} + +interface TreeData { + tree: string; + efp_links: Record; + genomes: Record; + SCC_values: Record; + sequence_similarity: Record; + maximum_values: Record; +} + +interface D3Node { + name: string; + value?: number; + children?: D3Node[]; + metadata?: { + genome?: string; + scc_value?: number; + sequence_similarity?: number; + efp_link?: string; + }; +} + +// Convert newick format data into D3 applicable data +function newickToD3(newickString: string, metadata: TreeData): D3Node { + const cleaned = newickString.trim().replace(/;$/, ""); + + function parseNode(str: string): D3Node { + if (!str.includes("(")) { + const [name, lengthStr] = str.split(":"); + const cleanName = name.trim(); + const upperName = cleanName.toUpperCase(); + + return { + name: cleanName, + value: lengthStr ? parseFloat(lengthStr) : undefined, + metadata: { + genome: metadata.genomes[upperName], + scc_value: metadata.SCC_values[upperName], + sequence_similarity: metadata.sequence_similarity[upperName], + efp_link: metadata.efp_links[upperName] + } + }; + } + + const matches = str.match(/\((.*)\)(.*)/); + if (!matches) throw new Error("Invalid Newick format"); + + const [_, childrenStr, remainingStr] = matches; + const children: D3Node[] = []; + let buffer = ""; + let parenthesesCount = 0; + + for (const char of childrenStr) { + if (char === "(") parenthesesCount++; + if (char === ")") parenthesesCount--; + if (char === "," && parenthesesCount === 0) { + children.push(parseNode(buffer.trim())); + buffer = ""; + } else { + buffer += char; + } + } + if (buffer.trim()) children.push(parseNode(buffer.trim())); + + const [name, lengthStr] = remainingStr.split(":"); + + return { + name: name || "internal", + value: lengthStr ? parseFloat(lengthStr) : undefined, + children + }; + } + + return parseNode(cleaned); +} + +// For SVG Element Appending +const MetadataVisualizations = ({ + x, + y, + metadata +}: { + x: number; + y: number; + metadata: D3Node['metadata'] +}) => { + if (!metadata) return null; + + const spacing = 25; + + return ( + + {/* SCC Value Visualization */} + {metadata.scc_value !== undefined && ( + + + + SCC: {metadata.scc_value.toFixed(2)} + + + )} + + {/* Sequence Similarity Visualization */} + {metadata.sequence_similarity !== undefined && ( + + + + Sim: {(metadata.sequence_similarity * 100).toFixed(1)}% + + + )} + + ); +}; export const Dendrogram = () => { const containerRef = useRef(null); const svgRef = useRef(null); const gRef = useRef(null); + const [treeData, setTreeData] = useState(null); + const [error, setError] = useState(null); + const [apiUrl, setApiUrl] = useState(DEFAULT_API_URL); + const [primaryGene, setPrimaryGene] = useState(extractPrimaryGene(DEFAULT_API_URL)); const [dimensions, setDimensions] = useState({ - width: 0, - height: 0, - boundsWidth: 0, - boundsHeight: 0 + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + boundsWidth: DEFAULT_WIDTH - MARGIN.left - MARGIN.right, + boundsHeight: DEFAULT_HEIGHT - MARGIN.top - MARGIN.bottom }); - // Create hierarchy once - const hierarchy = useMemo(() => { - return d3.hierarchy(data); - }, []); - - // Calculate leaf count once - const leafCount = useMemo(() => { - return hierarchy.leaves().length; - }, [hierarchy]); + useEffect(() => { + setPrimaryGene(extractPrimaryGene(apiUrl)); + }, [apiUrl]); - // Update dimensions when window resizes useEffect(() => { - const updateDimensions = () => { - if (!containerRef.current) return; - - const { width } = containerRef.current.getBoundingClientRect(); - // Base height calculation - const baseHeight = Math.max(400, width * 0.6); - // Minimum height needed for the tree - const minHeight = Math.max( - baseHeight, - leafCount * MIN_NODE_SPACING + MARGIN.top + MARGIN.bottom - ); - - setDimensions({ - width, - height: minHeight, - boundsWidth: width - MARGIN.right - MARGIN.left, - boundsHeight: minHeight - MARGIN.top - MARGIN.bottom - }); + const fetchData = async () => { + try { + const response = await fetch(apiUrl); + if (!response.ok) throw new Error('Network response was not ok'); + const data = await response.json(); + if (data.status === "success") { + setTreeData(data); + setError(null); + } else { + setError("Failed to load tree data"); + } + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to fetch data"); + } }; + fetchData(); + }, [apiUrl]); - updateDimensions(); - window.addEventListener('resize', updateDimensions); - return () => window.removeEventListener('resize', updateDimensions); - }, [leafCount]); + const hierarchy = useMemo(() => { + if (!treeData) return null; + try { + const d3Data = newickToD3(treeData.tree, treeData); + return d3.hierarchy(d3Data); + } catch (error) { + console.error("Error parsing Newick string:", error); + return null; + } + }, [treeData]); - // Create the dendrogram layout const dendrogram = useMemo(() => { - if (!dimensions.boundsHeight || !dimensions.boundsWidth) return null; + if (!dimensions.boundsHeight || !dimensions.boundsWidth || !hierarchy) return null; const dendrogramGenerator = d3 - .cluster() - .size([dimensions.boundsHeight, dimensions.boundsWidth]); + .cluster() + .size([dimensions.boundsHeight * 0.8, dimensions.boundsWidth * 0.4]); - const root = dendrogramGenerator(hierarchy); - return root; + return dendrogramGenerator(hierarchy); }, [hierarchy, dimensions.boundsWidth, dimensions.boundsHeight]); // Setup zoom behavior @@ -76,84 +227,94 @@ export const Dendrogram = () => { const svg = d3.select(svgRef.current); const g = d3.select(gRef.current); - const setZoomBounds = (transform: d3.ZoomTransform) => { - const padding = 100; - const xMin = -(dimensions.width * transform.k - padding); - const xMax = padding; - const yMin = -(dimensions.height * transform.k - padding); - const yMax = padding; - - return transform.translate( - Math.min(xMax, Math.max(xMin, transform.x)), - Math.min(yMax, Math.max(yMin, transform.y)) - ); - }; - const zoom = d3.zoom() .scaleExtent([0.5, 5]) .on("zoom", (event) => { - const constrainedTransform = setZoomBounds(event.transform); - g.attr("transform", constrainedTransform.toString()); + g.attr("transform", event.transform.toString()); }); svg.call(zoom); - svg.on("dblclick.zoom", () => { - svg.transition() - .duration(750) - .call(zoom.transform, d3.zoomIdentity.translate(MARGIN.left, MARGIN.top)); - }); - - svg.call(zoom.transform, d3.zoomIdentity.translate(MARGIN.left, MARGIN.top)); + svg.on("dblclick.zoom", null); + + // Initial transform to center the visualization + svg.call( + zoom.transform, + d3.zoomIdentity.translate(MARGIN.left, MARGIN.top) + ); return () => { svg.on(".zoom", null); }; }, [dimensions]); - const rightAngledLinkGenerator = (source: any, target: any) => { - const offset = 100; - return `M${source.y},${source.x} - L${source.y + offset},${source.x} - L${source.y + offset},${target.x} - L${target.y},${target.x}`; - }; + if (error) { + return
    Error: {error}
    ; + } - // Only render if we have dimensions and dendrogram data - if (!dimensions.width || !dendrogram) { + if (!treeData || !hierarchy || !dimensions.width || !dendrogram) { return ( -
    +
    + Loading... +
    ); } - const allNodes = dendrogram.descendants().map((node) => ( - - - {!node.children && ( - - {node.data.name} - - )} - - )); + const rightAngledLinkGenerator = (source: any, target: any) => { + const sourceX = source.x; + const sourceY = source.y; + const targetX = target.x; + const targetY = target.y; + + const midY = (sourceY + targetY) / 2; + return `M${sourceY},${sourceX} + L${midY},${sourceX} + L${midY},${targetX} + L${targetY},${targetX}`; + }; + + const allNodes = dendrogram.descendants().map((node) => { + const isPrimaryGene = node.data.name === primaryGene; + return ( + + + {!node.children && ( + <> + + {/* Display name + genome name */} + {`${node.data.name}${node.data.metadata?.genome ? ` (${node.data.metadata.genome})` : ''}`} + + + + )} + + ); + }); const allEdges = dendrogram.links().map((link) => ( )); @@ -162,10 +323,8 @@ export const Dendrogram = () => {
    @@ -173,9 +332,7 @@ export const Dendrogram = () => { ref={svgRef} width={dimensions.width} height={dimensions.height} - style={{ cursor: "grab" }} - viewBox={`0 0 ${dimensions.width} ${dimensions.height}`} - preserveAspectRatio="xMidYMid meet" + style={{ cursor: "grab", backgroundColor: '#ffffff' }} > {allEdges} diff --git a/Eplant/views/TestClusterView/placeholder2 b/Eplant/views/TestClusterView/placeholder2 new file mode 100644 index 00000000..80a8fd22 --- /dev/null +++ b/Eplant/views/TestClusterView/placeholder2 @@ -0,0 +1,339 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import React from "react"; +import * as d3 from "d3"; + +const MARGIN = { top: 50, right: 400, bottom: 50, left: 50 }; +const MIN_NODE_SPACING = 30; +const DEFAULT_WIDTH = 1200; +const DEFAULT_HEIGHT = 600; + +// Constants for visualization +const BAR_WIDTH = 100; +const BAR_HEIGHT = 12; +const BAR_SPACING = 2; +const LABEL_OFFSET = 10; +const NODE_RADIUS = 4; + +// Default API URL - can be modified later for dynamic updates +const DEFAULT_API_URL = 'https://bar.utoronto.ca/webservices/eplant_navigator/cgi-bin/eplant_navigator_service.cgi?primaryGene=AT3G24650&species=Arabidopsis&dataset=Developmental&checkedspecies=arabidopsis_poplar_medicago_soybean_rice_barley_maize_potato_tomato_grape'; + +// Helper function to extract primary gene from URL +function extractPrimaryGene(url: string): string { + const match = url.match(/primaryGene=([^&]+)/); + return match ? match[1] : ""; +} + +interface TreeData { + tree: string; + efp_links: Record; + genomes: Record; + SCC_values: Record; + sequence_similarity: Record; + maximum_values: Record; +} + +interface D3Node { + name: string; + value?: number; + children?: D3Node[]; + metadata?: { + genome?: string; + scc_value?: number; + sequence_similarity?: number; + efp_link?: string; + }; +} + +// Convert newick format data into D3 applicable data +function newickToD3(newickString: string, metadata: TreeData): D3Node { + const cleaned = newickString.trim().replace(/;$/, ""); + + function parseNode(str: string): D3Node { + if (!str.includes("(")) { + const [name, lengthStr] = str.split(":"); + const cleanName = name.trim(); + const upperName = cleanName.toUpperCase(); + + return { + name: cleanName, + value: lengthStr ? parseFloat(lengthStr) : undefined, + metadata: { + genome: metadata.genomes[upperName], + scc_value: metadata.SCC_values[upperName], + sequence_similarity: metadata.sequence_similarity[upperName], + efp_link: metadata.efp_links[upperName] + } + }; + } + + const matches = str.match(/\((.*)\)(.*)/); + if (!matches) throw new Error("Invalid Newick format"); + + const [_, childrenStr, remainingStr] = matches; + const children: D3Node[] = []; + let buffer = ""; + let parenthesesCount = 0; + + for (const char of childrenStr) { + if (char === "(") parenthesesCount++; + if (char === ")") parenthesesCount--; + if (char === "," && parenthesesCount === 0) { + children.push(parseNode(buffer.trim())); + buffer = ""; + } else { + buffer += char; + } + } + if (buffer.trim()) children.push(parseNode(buffer.trim())); + + const [name, lengthStr] = remainingStr.split(":"); + + return { + name: name || "internal", + value: lengthStr ? parseFloat(lengthStr) : undefined, + children + }; + } + + return parseNode(cleaned); +} + +// For SVG Element Appending +const MetadataVisualizations = ({ + x, + y, + metadata, + isPrimaryGene +}: { + x: number; + y: number; + metadata: D3Node['metadata']; + isPrimaryGene: boolean; +}) => { + if (!metadata) return null; + + // Dynamically set bar widths based on metadata, but limit width to avoid full span bars + const sequenceSimilarity = Math.min(isPrimaryGene ? 1 : (metadata.sequence_similarity || 0), 1); + const expressionLevel = Math.min(isPrimaryGene ? 1 : (metadata.scc_value || 0), 1); + + return ( + + + {/* Expression Level Bar */} + + {/* Grey background bar for the primary gene only */} + + {/* Foreground black bar with dynamic width */} + + {/* Center line for expression comparison */} + + + + ); +}; + +export const Dendrogram = () => { + const containerRef = useRef(null); + const svgRef = useRef(null); + const gRef = useRef(null); + const [treeData, setTreeData] = useState(null); + const [error, setError] = useState(null); + const [apiUrl, setApiUrl] = useState(DEFAULT_API_URL); + const [primaryGene, setPrimaryGene] = useState(extractPrimaryGene(DEFAULT_API_URL)); + + const [dimensions, setDimensions] = useState({ + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + boundsWidth: DEFAULT_WIDTH - MARGIN.left - MARGIN.right, + boundsHeight: DEFAULT_HEIGHT - MARGIN.top - MARGIN.bottom + }); + + useEffect(() => { + setPrimaryGene(extractPrimaryGene(apiUrl)); + }, [apiUrl]); + + useEffect(() => { + const fetchData = async () => { + try { + const response = await fetch(apiUrl); + if (!response.ok) throw new Error('Network response was not ok'); + const data = await response.json(); + if (data.status === "success") { + setTreeData(data); + setError(null); + } else { + setError("Failed to load tree data"); + } + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to fetch data"); + } + }; + fetchData(); + }, [apiUrl]); + + const hierarchy = useMemo(() => { + if (!treeData) return null; + try { + const d3Data = newickToD3(treeData.tree, treeData); + return d3.hierarchy(d3Data); + } catch (error) { + console.error("Error parsing Newick string:", error); + return null; + } + }, [treeData]); + + const dendrogram = useMemo(() => { + if (!dimensions.boundsHeight || !dimensions.boundsWidth || !hierarchy) return null; + + const dendrogramGenerator = d3 + .cluster() + .size([dimensions.boundsHeight * 0.8, dimensions.boundsWidth * 0.4]); + + return dendrogramGenerator(hierarchy); + }, [hierarchy, dimensions.boundsWidth, dimensions.boundsHeight]); + + // Zoom and drag effects + useEffect(() => { + if (!svgRef.current || !gRef.current || !dimensions.width) return; + + const svg = d3.select(svgRef.current); + const g = d3.select(gRef.current); + + const zoom = d3.zoom() + .scaleExtent([0.5, 5]) + .on("zoom", (event) => { + g.attr("transform", event.transform.toString()); + }); + + svg.call(zoom); + + svg.on("dblclick.zoom", null); + + // Initial transform to center the visualization + svg.call( + zoom.transform, + d3.zoomIdentity.translate(MARGIN.left, MARGIN.top) + ); + + return () => { + svg.on(".zoom", null); + }; + }, [dimensions]); + + if (error) { + return
    Error: {error}
    ; + } + + if (!treeData || !hierarchy || !dimensions.width || !dendrogram) { + return ( +
    + Loading... +
    + ); + } + + const rightAngledLinkGenerator = (source: any, target: any) => { + const sourceX = source.x; + const sourceY = source.y; + const targetX = target.x; + const targetY = target.y; + + const midY = (sourceY + targetY) / 2; + return `M${sourceY},${sourceX} + L${midY},${sourceX} + L${midY},${targetX} + L${targetY},${targetX}`; + }; + + const allNodes = dendrogram.descendants().map((node) => { + const isPrimaryGene = node.data.name === primaryGene; + return ( + + + {!node.children && ( + <> + + {/* Display name + genome name */} + {`${node.data.name}${node.data.metadata?.genome ? ` (${node.data.metadata.genome})` : ''}`} + + + + )} + + ); + }); + + const allEdges = dendrogram.links().map((link) => ( + + )); + + return ( +
    + + + {allEdges} + {allNodes} + + +
    + ); +}; + +export default Dendrogram; \ No newline at end of file From e0f0d05120cc4b5e53584778a66716214d01de6a Mon Sep 17 00:00:00 2001 From: "k.jamal" Date: Thu, 10 Oct 2024 21:15:11 -0400 Subject: [PATCH 15/97] working but failed nav view --- Eplant/views/KobiTestView/NavigatorView.tsx | 62 ++++++++++++--------- Eplant/views/KobiTestView/placeholder.tsx | 3 - 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/Eplant/views/KobiTestView/NavigatorView.tsx b/Eplant/views/KobiTestView/NavigatorView.tsx index 6bceeadb..54f52875 100644 --- a/Eplant/views/KobiTestView/NavigatorView.tsx +++ b/Eplant/views/KobiTestView/NavigatorView.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { parse } from "newick-js"; import Tree from 'react-d3-tree'; @@ -6,9 +6,9 @@ interface NodeData { name: string; attributes?: { length?: number; + depth?: number; }; children?: NodeData[]; - depth?: number; // Add depth to interface } interface CustomNodeProps { @@ -55,10 +55,28 @@ const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { ); }; - const NavigatorView = () => { - const [treeData, setTreeData] = useState(null); - + + const [treeData, setTreeData] = useState(); + + const drawStepPath = (linkData: any, orientation: any) => { + const { source, target } = linkData; + const deltaY = target.y - source.y; + return orientation === 'horizontal' + ? `M${source.y},${source.x} H${source.y + deltaY / 2} V${target.x} H${target.y}` + : `M${source.x},${source.y} V${source.y + deltaY / 2} H${target.x} V${target.y}`; + }; + + const alignLeafNodes = (node: NodeData, depth: number, maxDepth: number) => { + // If it's a leaf node, set its y position to max depth. + if (!node.children || node.children.length === 0) { + node.attributes = { ...node.attributes, depth: maxDepth }; + } else { + // For non-leaf nodes, recurse for each child. + node.children.forEach(child => alignLeafNodes(child, depth + 1, maxDepth)); + } + }; + useEffect(() => { const newickData = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; @@ -68,42 +86,34 @@ const NavigatorView = () => { const rootVertex = vertices.find(vertex => !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) ); - - const formatTreeData = (vertex: any): NodeData => { + + const formatTreeData = (vertex: any, depth = 0): NodeData => { const childArcs = Array.from(parsedTree.graph[1]) .filter(arc => arc[0] === vertex); const node: NodeData = { name: vertex.label || vertex.name || "", attributes: { - length: 1 + length: vertex.length || 1, + depth, }, children: [], }; - - childArcs.sort((a, b) => { - const aLabel = a[1].label || ""; - const bLabel = b[1].label || ""; - return aLabel.localeCompare(bLabel); - }); - - childArcs.forEach(arc => { - const childVertex = arc[1]; - const childNode = formatTreeData(childVertex); - node.children?.push(childNode); - }); - + + node.children = childArcs.map(arc => formatTreeData(arc[1], depth + 1)); return node; }; - + if (rootVertex) { const formattedData = formatTreeData(rootVertex); - - setTreeData(formattedData); + if (formattedData && formattedData.children) { + const maxDepth = Math.max(...formattedData.children.map(child => child.attributes?.depth || 0)); + alignLeafNodes(formattedData, 0, maxDepth); + setTreeData(formattedData); + } } } catch (error) { console.error("Error parsing Newick data:", error); - setTreeData(null); } }, []); @@ -123,7 +133,7 @@ const NavigatorView = () => { { !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) ); - - const formatTreeData = (vertex: any): NodeData => { const childArcs = Array.from(parsedTree.graph[1]) .filter(arc => arc[0] === vertex); From 8855fd305b38dc2dd36a6b4b9de587dc764a73e4 Mon Sep 17 00:00:00 2001 From: Yonah Aviv Date: Mon, 21 Oct 2024 12:33:44 -0400 Subject: [PATCH 16/97] Updated filter dialog to actually contain all the neccesary elements required for filtering genes in interactions view --- .../views/InteractionsViewer/FilterDialog.tsx | 271 ++++++++++++++---- Eplant/views/InteractionsViewer/Topbar.tsx | 50 +--- .../scripts/eventHandlers.ts | 2 +- 3 files changed, 225 insertions(+), 98 deletions(-) diff --git a/Eplant/views/InteractionsViewer/FilterDialog.tsx b/Eplant/views/InteractionsViewer/FilterDialog.tsx index 1a63dd2c..7f54de8a 100644 --- a/Eplant/views/InteractionsViewer/FilterDialog.tsx +++ b/Eplant/views/InteractionsViewer/FilterDialog.tsx @@ -1,15 +1,65 @@ import { FC, useState } from 'react' -import { ListItemText, ListSubheader, Switch } from '@mui/material' import Box from '@mui/material/Box' -import List from '@mui/material/List' -import ListItem from '@mui/material/ListItem' +import Button from '@mui/material/Button' +import Checkbox from '@mui/material/Checkbox' +import FormControlLabel from '@mui/material/FormControlLabel' +import FormGroup from '@mui/material/FormGroup' +import InputAdornment from '@mui/material/InputAdornment' +import TextField from '@mui/material/TextField' -export const FilterDialog: FC = () => { - const [EPPICorrValue, setEPPICorrValue] = useState() - const [PPPICorrValue, setPPPICorrValue] = useState() - const [PPPIConfValue, setPPPIConfValue] = useState() - const [PPDIConfValue, setPPDIConfValue] = useState() +type numberInputProps = { + label: string + changeFunc: (event: object) => void + prefix?: string +} +const NumberInput = (props: numberInputProps) => { + return ( + <> + { + props.changeFunc(event) + }} + inputProps={{ + defaultValue: 0, + step: 0.1, + min: -1, + max: 1, + }} + InputProps={ + props.prefix + ? { + startAdornment: ( + + {props.prefix} + + ), + } + : {} + } + /> + + ) +} +const FilterDialog: FC = () => { + const [eppiSelected, setEppiSelected] = useState(false) + const [eppiCorrSelected, setEppiCorrSelected] = useState(false) + const [eppiCorrValue, setEppiCorrValue] = useState() + const [pppiSelected, setPppiSelected] = useState(false) + const [pppiCorrSelected, setPppiCorrSelected] = useState(false) + const [pppiCorrValue, setPppiCorrValue] = useState() + const [pppiConfSelected, setPppiConfSelected] = useState(false) + const [pppiConfValue, setPppiConfValue] = useState() + const [epdiSelected, setEpdiSelected] = useState(false) + const [ppdiSelected, setPpdiSelected] = useState(false) + const [ppdiConfSelected, setPpdiConfSelected] = useState(false) + const [ppdiConfValue, setPpdiConfValue] = useState() const selectors = { EPPISelector: '[type = "PPI"][method = "E"]', // checkbox corrSelector: '[correlation <= ', // eppi-correlation spinner + checkbox @@ -23,62 +73,183 @@ export const FilterDialog: FC = () => { const applyFilters = () => { // Create selectors const eppiCorr = - selectors.EPPISelector + selectors.corrSelector + EPPICorrValue + ']' + selectors.EPPISelector + selectors.corrSelector + eppiCorrValue + ']' const pppiCorr = - selectors.PPPISelector + selectors.corrSelector + PPPICorrValue + ']' + selectors.PPPISelector + selectors.corrSelector + pppiCorrValue + ']' const pppiConf = - selectors.PPPISelector + selectors.interConfSelector + PPPIConfValue + ']' + selectors.PPPISelector + selectors.interConfSelector + pppiConfValue + ']' const ppdiConf = - selectors.PPDISelector + selectors.fimoConfSelector + PPDIConfValue + ']' + selectors.PPDISelector + + selectors.fimoConfSelector + + '1e-' + + ppdiConfValue + + ']' } return ( - ({ - maxWidth: 360, - bgcolor: theme.palette.background.default, + maxWidth: 600, + padding: 3, + mr: 10, + bgcolor: theme.palette.background.transparentOverlay, + color: 'white', })} - subheader={Filter Interactions} > - - - {}} checked={false} /> - - - setEppiSelected(!eppiSelected)} + /> + } + label='Hide ALL experimentally determined Protein-Protein interactions' + /> + + setEppiCorrSelected(!eppiCorrSelected)} + /> + } + label='Hide only with correlation less than: ' /> - {}} checked={false} /> - - - { + let value = parseFloat(event.target.value) + if (value > 1) { + value = 1 + } else if (value < -1) { + value = -1 + } + setEppiCorrValue(value) + }} + /> + )} + + + setPppiSelected(!pppiSelected)} + /> + } + label='Hide ALL predicted Protein-Protein interactions' + /> + + {/* pppi (correlation <=) */} + setPppiCorrSelected(!pppiCorrSelected)} + /> + } + label='Hide only with correlation less than: ' /> - {}} checked={false} /> - - - { + let value = parseFloat(event.target.value) + if (value > 1) { + value = 1 + } else if (value < -1) { + value = -1 + } + setPppiCorrValue(value) + }} + /> + )} + + + {/* pppi (interolog_conf <=)*/} + setPppiConfSelected(!pppiConfSelected)} + /> + } + label='Hide only with confidence less than: ' /> - {}} checked={false} /> - - - { + let value = parseFloat(event.target.value) + if (value > 1) { + value = 1 + } else if (value < -1) { + value = -1 + } + setEppiCorrValue(value) + }} + /> + )} + + + setEpdiSelected(!epdiSelected)} + /> + } + label='Hide ALL experimentall determined Protein-DNA interactions' + /> + + setPpdiSelected(!ppdiSelected)} + /> + } + label='Hide ALL predicted Protien-DNA interactions' + /> + + {/* ppdi (interolog_conf <=)*/} + setPpdiConfSelected(!ppdiConfSelected)} + /> + } + label='Hide only with confidence greater than' /> - {}} checked={false} /> - - + {/* ppdi conf number input */} + {ppdiConfSelected && ( + { + let value = parseFloat(event.target.value) + if (value > 1) { + value = 1 + } else if (value < -1) { + value = -1 + } + setPpdiConfValue(value) + }} + prefix='1e-' + /> + )} + + {/* Hide only with confidence greater than */} + + + ) } +export default FilterDialog diff --git a/Eplant/views/InteractionsViewer/Topbar.tsx b/Eplant/views/InteractionsViewer/Topbar.tsx index e85b68b3..4f29e01e 100644 --- a/Eplant/views/InteractionsViewer/Topbar.tsx +++ b/Eplant/views/InteractionsViewer/Topbar.tsx @@ -14,6 +14,8 @@ import ListItem from '@mui/material/ListItem' import Toolbar from '@mui/material/Toolbar' import Typography from '@mui/material/Typography' +import FilterDialog from './FilterDialog' + interface TopbarProps { gene: string } @@ -93,53 +95,7 @@ const Topbar: FC = ({ gene }) => { - - ({ - maxWidth: 360, - bgcolor: theme.palette.background.default, - })} - subheader={Filter Interactions} - > - - - {}} checked={false} /> - - - - {}} checked={false} /> - - - - {}} checked={false} /> - - - - {}} checked={false} /> - - - - {}} checked={false} /> - - - + ) diff --git a/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts b/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts index 7dc5d48d..19b83841 100644 --- a/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts +++ b/Eplant/views/InteractionsViewer/scripts/eventHandlers.ts @@ -111,7 +111,7 @@ const nodeMouseOverHandler = (cy: Core, event) => { - +
    ` From 048ad81be7c0983ee4b2cf48d267bd3b71088fba Mon Sep 17 00:00:00 2001 From: "k.jamal" Date: Tue, 22 Oct 2024 06:10:11 -0400 Subject: [PATCH 17/97] m --- Eplant/views/KobiTestView/d3.phylogram.js | 34 +- Eplant/views/KobiTestView/ghostnodetest.tsx | 172 -------- Eplant/views/KobiTestView/placeholder.tsx | 63 +-- Eplant/views/TestClusterView/Dendrogram.tsx | 386 +++--------------- Eplant/views/TestClusterView/d3.phylogram.ts | 151 +++++++ Eplant/views/TestClusterView/index.tsx | 35 +- .../TestClusterView/indexplaceholder.tsx | 20 + Eplant/views/TestClusterView/placeholder.tsx | 145 +++---- Eplant/views/TestClusterView/placeholder2 | 339 --------------- .../views/TestClusterView/zoomplaceholder.tsx | 36 ++ package-lock.json | 76 +++- package.json | 6 + yarn.lock | 56 ++- 13 files changed, 506 insertions(+), 1013 deletions(-) delete mode 100644 Eplant/views/KobiTestView/ghostnodetest.tsx create mode 100644 Eplant/views/TestClusterView/d3.phylogram.ts create mode 100644 Eplant/views/TestClusterView/indexplaceholder.tsx delete mode 100644 Eplant/views/TestClusterView/placeholder2 create mode 100644 Eplant/views/TestClusterView/zoomplaceholder.tsx diff --git a/Eplant/views/KobiTestView/d3.phylogram.js b/Eplant/views/KobiTestView/d3.phylogram.js index 862564e6..c6df17bb 100644 --- a/Eplant/views/KobiTestView/d3.phylogram.js +++ b/Eplant/views/KobiTestView/d3.phylogram.js @@ -255,7 +255,6 @@ if (!d3) { throw "d3 wasn't included!"}; var showAll = vis.select("#button") .append("svg:svg") -// var hover = leafNode // .on({ // "mouseover": function(d) { // d3.select(this).style("cursor", "auto") @@ -288,8 +287,6 @@ if (!d3) { throw "d3 wasn't included!"}; // } // }); var first = true; - -// d3.select("#button").text("clear all"); // d3.select("#button") // .on("click", function() { // if (icons.style("visibility") == "visible") { @@ -410,12 +407,9 @@ if (!d3) { throw "d3 wasn't included!"}; return "black"; } }) - //.style("visibility", "visible") + .text(function(d) { - // if (d.name == query) { - // return "QUERY"; - // } - // else + if (d.name.substr(0,2) == "AT") { return "ARABIDOPSIS"; } @@ -428,7 +422,6 @@ if (!d3) { throw "d3 wasn't included!"}; .attr("x", 320) .attr("y", -11) .attr("align", "right"); - // .style("visibility", "visible"); ///hidden var seqTip = d3.tip() .attr('class', 'd3-tip') @@ -573,29 +566,6 @@ if (!d3) { throw "d3 wasn't included!"}; .attr("y", -7) .attr("height", 10); -// var sccBars = scc.append("rect") -// .attr("x", 402) -// .attr("y", -7) -// .attr("fill", "black") -// .attr("width", function(d) { -// if (sccValues[d.name] < 0) { -// return Math.abs(sccValues[d.name]) * 50; -// } -// else if (sccValues[d.name] > 0) { -// return (sccValues[d.name] * 25 + 1) * 2; -// } -// else if (d.name == query) { -// return 50; -// } -// else { -// return 0; -// } -// }) -// .attr("height", 10); - - - - var worldTip = d3.tip() .attr('class', 'd3-tip') diff --git a/Eplant/views/KobiTestView/ghostnodetest.tsx b/Eplant/views/KobiTestView/ghostnodetest.tsx deleted file mode 100644 index 84f79aac..00000000 --- a/Eplant/views/KobiTestView/ghostnodetest.tsx +++ /dev/null @@ -1,172 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { parse } from "newick-js"; -import Tree from 'react-d3-tree'; - -interface NodeData { - name: string; - attributes?: { - length?: number; - }; - children?: NodeData[]; - depth?: number; // Add depth to interface -} - -interface CustomNodeProps { - nodeDatum: NodeData; - toggleNode: () => void; -} - -const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { - const isLeafNode = !nodeDatum.children || nodeDatum.children.length === 0; - - // Ignore ghost nodes - if (nodeDatum.name === "ghost") return null; - - return ( - - - {nodeDatum.name && nodeDatum.name !== "Unnamed" && ( - - {nodeDatum.name} - - )} - {isLeafNode && ( - -
    -
    - Expression Data -
    -
    -
    - )} -
    - ); -}; - - -const NavigatorView = () => { - const [treeData, setTreeData] = useState(null); - - useEffect(() => { - const newickData = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; - - try { - const parsedTree = parse(newickData); - const vertices = Array.from(parsedTree.graph[0]); - const rootVertex = vertices.find(vertex => - !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) - ); - - // Function to find the maximum depth in the tree - const findMaxDepth = (node: NodeData): number => { - if (!node.children || node.children.length === 0) return 0; - return 1 + Math.max(...node.children.map(child => findMaxDepth(child))); - }; - - // Function to set all leaf nodes to the same depth - const alignLeafNodes = (node: NodeData, maxDepth: number, currentDepth = 0): NodeData => { - const isLeaf = !node.children || node.children.length === 0; - - if (isLeaf) { - - const depthNeeded = maxDepth - currentDepth; - let tempNode = node; - for (let i = 0; i < depthNeeded; i++) { - tempNode.children = [{ name: "ghost", attributes: { length: 0 }, children: [] }]; - tempNode = tempNode.children[0]; - } - return node; // Return modified node - } else { - node.children = node.children?.map(child => alignLeafNodes(child, maxDepth, currentDepth + 1)) || []; - return node; // Return modified non-leaf node - } - }; - - const formatTreeData = (vertex: any): NodeData => { - const childArcs = Array.from(parsedTree.graph[1]) - .filter(arc => arc[0] === vertex); - - const node: NodeData = { - name: vertex.label || vertex.name || "", - attributes: { - length: 1 - }, - children: [], - }; - - childArcs.sort((a, b) => { - const aLabel = a[1].label || ""; - const bLabel = b[1].label || ""; - return aLabel.localeCompare(bLabel); - }); - - childArcs.forEach(arc => { - const childVertex = arc[1]; - const childNode = formatTreeData(childVertex); - node.children?.push(childNode); - }); - - return node; - }; - - if (rootVertex) { - let formattedData = formatTreeData(rootVertex); - const maxDepth = findMaxDepth(formattedData); - formattedData = alignLeafNodes(formattedData, maxDepth); // Align with ghost nodes - setTreeData(formattedData); - } - } catch (error) { - console.error("Error parsing Newick data:", error); - setTreeData(null); - } - }, []); - - const renderCustomNode = (props: CustomNodeProps) => ; - - return ( -
    -

    Phylogenetic Tree

    -
    - {treeData && ( - - )} -
    -
    - ); -}; - -export default NavigatorView; \ No newline at end of file diff --git a/Eplant/views/KobiTestView/placeholder.tsx b/Eplant/views/KobiTestView/placeholder.tsx index 040428b6..04dde47b 100644 --- a/Eplant/views/KobiTestView/placeholder.tsx +++ b/Eplant/views/KobiTestView/placeholder.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { parse } from "newick-js"; import Tree from 'react-d3-tree'; @@ -6,6 +6,7 @@ interface NodeData { name: string; attributes?: { length?: number; + depth?: number; }; children?: NodeData[]; } @@ -54,55 +55,65 @@ const CustomNode: React.FC = ({ nodeDatum, toggleNode }) => { ); }; - const NavigatorView = () => { - const [treeData, setTreeData] = useState(null); - + + const [treeData, setTreeData] = useState(); + + const drawStepPath = (linkData: any, orientation: any) => { + const { source, target } = linkData; + const deltaY = target.y - source.y; + return orientation === 'horizontal' + ? `M${source.y},${source.x} H${source.y + deltaY / 2} V${target.x} H${target.y}` + : `M${source.x},${source.y} V${source.y + deltaY / 2} H${target.x} V${target.y}`; + }; + + const alignLeafNodes = (node: NodeData, depth: number, maxDepth: number) => { + // If it's a leaf node, set its y position to max depth. + if (!node.children || node.children.length === 0) { + node.attributes = { ...node.attributes, depth: maxDepth }; + } else { + // For non-leaf nodes, recurse for each child. + node.children.forEach(child => alignLeafNodes(child, depth + 1, maxDepth)); + } + }; + useEffect(() => { const newickData = "((AT3G24650:0.54188,((Potri.002G252000.1:0.43277,VIT_07s0005g05400:0.43277):0.07324,(Medtr7g059330.1:0.40126,(Glyma.08G357600:0.09194,Glyma.18G176100:0.09194):0.30932):0.10475):0.03587):0.03552,((PGSC0003DMP400034979:0.06033,Solyc06g083600:0.06033):0.24363,(PGSC0003DMP400034841:0.09346,Solyc06g083590:0.09346):0.21050):0.27344);"; - + try { const parsedTree = parse(newickData); const vertices = Array.from(parsedTree.graph[0]); const rootVertex = vertices.find(vertex => !Array.from(parsedTree.graph[1]).some(arc => arc[1] === vertex) ); - - const formatTreeData = (vertex: any): NodeData => { + + const formatTreeData = (vertex: any, depth = 0): NodeData => { const childArcs = Array.from(parsedTree.graph[1]) .filter(arc => arc[0] === vertex); const node: NodeData = { name: vertex.label || vertex.name || "", attributes: { - length: 1 + length: vertex.length || 1, + depth, }, children: [], }; - - childArcs.sort((a, b) => { - const aLabel = a[1].label || ""; - const bLabel = b[1].label || ""; - return aLabel.localeCompare(bLabel); - }); - - childArcs.forEach(arc => { - const childVertex = arc[1]; - const childNode = formatTreeData(childVertex); - node.children?.push(childNode); - }); - + + node.children = childArcs.map(arc => formatTreeData(arc[1], depth + 1)); return node; }; - + if (rootVertex) { const formattedData = formatTreeData(rootVertex); - - setTreeData(formattedData); + if (formattedData && formattedData.children) { + const maxDepth = Math.max(...formattedData.children.map(child => child.attributes?.depth || 0)); + alignLeafNodes(formattedData, 0, maxDepth); + setTreeData(formattedData); + } } } catch (error) { console.error("Error parsing Newick data:", error); - setTreeData(null); } }, []); @@ -122,7 +133,7 @@ const NavigatorView = () => { ; - genomes: Record; - SCC_values: Record; - sequence_similarity: Record; - maximum_values: Record; -} - -interface D3Node { - name: string; - value?: number; - children?: D3Node[]; - metadata?: { - genome?: string; - scc_value?: number; - sequence_similarity?: number; - efp_link?: string; - }; -} - -// Convert newick format data into D3 applicable data -// Convert TreeData obj to D3Node obj -function newickToD3(newickString: string, metadata: TreeData): D3Node { - const cleaned = newickString.trim().replace(/;$/, ""); - - function parseNode(str: string): D3Node { - if (!str.includes("(")) { - const [name, lengthStr] = str.split(":"); - const cleanName = name.trim(); - const upperName = cleanName.toUpperCase(); - - return { - name: cleanName, - value: lengthStr ? parseFloat(lengthStr) : undefined, - metadata: { - genome: metadata.genomes[upperName], - scc_value: metadata.SCC_values[upperName], - sequence_similarity: metadata.sequence_similarity[upperName], - efp_link: metadata.efp_links[upperName] - } - }; - } - - const matches = str.match(/\((.*)\)(.*)/); - if (!matches) throw new Error("Invalid Newick format"); - - const [_, childrenStr, remainingStr] = matches; - const children: D3Node[] = []; - let buffer = ""; - let parenthesesCount = 0; - - for (const char of childrenStr) { - if (char === "(") parenthesesCount++; - if (char === ")") parenthesesCount--; - if (char === "," && parenthesesCount === 0) { - children.push(parseNode(buffer.trim())); - buffer = ""; - } else { - buffer += char; - } - } - if (buffer.trim()) children.push(parseNode(buffer.trim())); - - const [name, lengthStr] = remainingStr.split(":"); - - return { - name: name || "internal", - value: lengthStr ? parseFloat(lengthStr) : undefined, - children - }; - } - - return parseNode(cleaned); +// Define the interface for your component's props +interface DendrogramProps { + newick: string; + eFPLinks: any; + seq: any; + scc: any; + genomes: any; } -// For SVG Element Appending -const MetadataVisualizations = ({ - x, - y, - metadata, - isPrimaryGene -}: { - x: number; - y: number; - metadata: D3Node['metadata']; - isPrimaryGene: boolean; -}) => { - if (!metadata) return null; - - // Dynamically set bar widths based on metadata, but limit width to avoid full span bars - const sequenceSimilarity = Math.min(isPrimaryGene ? 1 : (metadata.sequence_similarity || 0), 1); - const expressionLevel = Math.min(isPrimaryGene ? 1 : (metadata.scc_value || 0), 1); - - return ( - - - {/* Expression Level Bar */} - - {/* Grey background bar for the primary gene only */} - - {/* Foreground black bar with dynamic width */} - - {/* Center line for expression comparison */} - - - - ); -}; - -// Export main dendrogram tree -export const Dendrogram = () => { - const containerRef = useRef(null); - const svgRef = useRef(null); - const gRef = useRef(null); - const [treeData, setTreeData] = useState(null); - const [error, setError] = useState(null); - const [apiUrl, setApiUrl] = useState(DEFAULT_API_URL); - const [primaryGene, setPrimaryGene] = useState(extractPrimaryGene(DEFAULT_API_URL)); - - const [dimensions, setDimensions] = useState({ - width: DEFAULT_WIDTH, - height: DEFAULT_HEIGHT, - boundsWidth: DEFAULT_WIDTH - MARGIN.left - MARGIN.right, - boundsHeight: DEFAULT_HEIGHT - MARGIN.top - MARGIN.bottom - }); +const Dendrogram: React.FC = ({ newick, eFPLinks, seq, scc, genomes }) => { + const containerRef = useRef(null); + const data: DendrogramProps = {newick, eFPLinks, seq, scc, genomes}; useEffect(() => { - setPrimaryGene(extractPrimaryGene(apiUrl)); - }, [apiUrl]); + if (!containerRef.current || !data) return; - // Fetch api data - useEffect(() => { - const fetchData = async () => { - try { - const response = await fetch(apiUrl); - if (!response.ok) throw new Error('Network response was not ok'); - const data = await response.json(); - if (data.status === "success") { - setTreeData(data); - setError(null); - } else { - setError("Failed to load tree data"); - } - } catch (err) { - setError(err instanceof Error ? err.message : "Failed to fetch data"); + // We'll need to wait for d3.phylogram to be available + const initializePhylogram = () => { + if (!(window as any).d3?.phylogram) { + setTimeout(initializePhylogram, 100); + return; } - }; - fetchData(); - }, [apiUrl]); - - // Usememo for caching for efficient rendering - const hierarchy = useMemo(() => { - if (!treeData) return null; - try { - const d3Data = newickToD3(treeData.tree, treeData); - return d3.hierarchy(d3Data); - } catch (error) { - console.error("Error parsing Newick string:", error); - return null; - } - }, [treeData]); - - const dendrogram = useMemo(() => { - if (!dimensions.boundsHeight || !dimensions.boundsWidth || !hierarchy) return null; - - const dendrogramGenerator = d3 - .cluster() - .size([dimensions.boundsHeight * 0.8, dimensions.boundsWidth * 0.4]); - - return dendrogramGenerator(hierarchy); - }, [hierarchy, dimensions.boundsWidth, dimensions.boundsHeight]); - - // Zoom and drag effects - useEffect(() => { - if (!svgRef.current || !gRef.current || !dimensions.width) return; - const svg = d3.select(svgRef.current); - const g = d3.select(gRef.current); - - const zoom = d3.zoom() - .scaleExtent([0.5, 5]) - .on("zoom", (event) => { - g.attr("transform", event.transform.toString()); - }); - - svg.call(zoom); - - svg.on("dblclick.zoom", null); - - // Initial transform to center the visualization - svg.call( - zoom.transform, - d3.zoomIdentity.translate(MARGIN.left, MARGIN.top) - ); - - return () => { - svg.on(".zoom", null); + const lineHeight = 30; + const numLines = Object.keys(data.genomes).length + 1; + + // Clear previous content + containerRef.current!.innerHTML = ''; + + // Use d3.phylogram + (window as any).d3.phylogram.build( + containerRef.current, + (window as any).Newick.parse(data.newick), + 'query', // Replace with actual query + data.eFPLinks, + data.genomes, + data.scc, + data.seq, + { + width: 160, + height: lineHeight * numLines, + } + ); }; - }, [dimensions]); - - if (error) { - return
    Error: {error}
    ; - } - - if (!treeData || !hierarchy || !dimensions.width || !dendrogram) { - return ( -
    - Loading... -
    - ); - } - - // Generates the tree at a right-angle rather than curved lines - const rightAngledLinkGenerator = (source: any, target: any) => { - const sourceX = source.x; - const sourceY = source.y; - const targetX = target.x; - const targetY = target.y; - - const midY = (sourceY + targetY) / 2; - return `M${sourceY},${sourceX} - L${midY},${sourceX} - L${midY},${targetX} - L${targetY},${targetX}`; - }; - - // Draw nodes and draw SVG/node values - const allNodes = dendrogram.descendants().map((node) => { - const isPrimaryGene = node.data.name === primaryGene; - return ( - - - {!node.children && ( - <> - - {/* Display name + genome name */} - {`${node.data.name}${node.data.metadata?.genome ? ` (${node.data.metadata.genome})` : ''}`} - - - - )} - - ); - }); - const allEdges = dendrogram.links().map((link) => ( - - )); + initializePhylogram(); + }, [data]); return ( -
    - - - {allEdges} - {allNodes} - - -
    + <> + +