From 6276c4739e06aa928c74d61646d16b9632d614e7 Mon Sep 17 00:00:00 2001 From: hzrd149 Date: Sat, 23 Sep 2023 19:47:15 -0500 Subject: [PATCH] add contacts mute graph --- package.json | 10 +- src/app.tsx | 4 +- src/helpers/user-metadata.ts | 2 + src/hooks/use-user-network.ts | 29 ++ src/views/tools/index.tsx | 3 + src/views/tools/network-mute-graph.tsx | 132 +++++++++ src/views/tools/network.tsx | 4 +- yarn.lock | 371 ++++++++++++++++++++++++- 8 files changed, 547 insertions(+), 8 deletions(-) create mode 100644 src/views/tools/network-mute-graph.tsx diff --git a/package.json b/package.json index 67cc760f8..a36a19dab 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@getalby/bitcoin-connect-react": "^1.1.0", + "@types/three": "^0.156.0", "@webscopeio/react-textarea-autocomplete": "^4.9.2", "bech32": "^2.0.0", "cheerio": "^1.0.0-rc.12", @@ -40,12 +41,17 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-error-boundary": "^4.0.11", + "react-force-graph-2d": "^1.25.1", + "react-force-graph-3d": "^1.23.1", "react-hook-form": "^7.45.4", "react-photo-album": "^2.3.0", "react-qr-barcode-scanner": "^1.0.6", "react-router-dom": "^6.15.0", "react-singleton-hook": "^4.0.1", "react-use": "^17.4.0", + "react-virtualized-auto-sizer": "^1.0.20", + "three": "^0.156.1", + "three-spritetext": "^1.8.1", "webln": "^0.3.2", "yet-another-react-lightbox": "^3.12.1" }, @@ -58,7 +64,7 @@ "@types/leaflet.locatecontrol": "^0.74.1", "@types/lodash.throttle": "^4.1.7", "@types/ngeohash": "^0.6.4", - "@types/react": "^18.2.20", + "@types/react": "^18.2.22", "@types/react-dom": "^18.2.7", "@types/webscopeio__react-textarea-autocomplete": "^4.7.2", "@vitejs/plugin-react": "^4.0.4", @@ -69,7 +75,7 @@ "vite-plugin-pwa": "^0.16.4" }, "resolutions": { - "@types/react": "^18.2.20", + "@types/react": "^18.2.22", "@types/react-dom": "^18.2.7" } } diff --git a/src/app.tsx b/src/app.tsx index af631f2a3..aec417962 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -49,7 +49,6 @@ import GoalsView from "./views/goals"; import GoalsBrowseView from "./views/goals/browse"; import GoalDetailsView from "./views/goals/goal-details"; import UserGoalsTab from "./views/user/goals"; -import NetworkView from "./views/tools/network"; import MutedByView from "./views/user/muted-by"; import BadgesView from "./views/badges"; import BadgesBrowseView from "./views/badges/browse"; @@ -60,6 +59,8 @@ import CommunitiesHomeView from "./views/communities"; import CommunityFindByNameView from "./views/community/find-by-name"; import CommunityView from "./views/community/index"; +const NetworkView = React.lazy(() => import("./views/tools/network")); +const NetworkGraphView = React.lazy(() => import("./views/tools/network-mute-graph")); const StreamsView = React.lazy(() => import("./views/streams")); const StreamView = React.lazy(() => import("./views/streams/stream")); const SearchView = React.lazy(() => import("./views/search")); @@ -171,6 +172,7 @@ const router = createHashRouter([ children: [ { path: "", element: }, { path: "network", element: }, + { path: "network-graph", element: }, ], }, { diff --git a/src/helpers/user-metadata.ts b/src/helpers/user-metadata.ts index 9adbd676e..4768e6905 100644 --- a/src/helpers/user-metadata.ts +++ b/src/helpers/user-metadata.ts @@ -3,6 +3,7 @@ import { NostrEvent } from "../types/nostr-event"; import { truncatedId } from "./nostr/events"; export type Kind0ParsedContent = { + pubkey?: string, name?: string; display_name?: string; about?: string; @@ -18,6 +19,7 @@ export function parseKind0Event(event: NostrEvent): Kind0ParsedContent { if (event.kind !== 0) throw new Error("expected a kind 0 event"); try { const metadata = JSON.parse(event.content) as Kind0ParsedContent; + metadata.pubkey = event.pubkey // ensure nip05 is a string if (metadata.nip05 && typeof metadata.nip05 !== "string") metadata.nip05 = String(metadata.nip05); diff --git a/src/hooks/use-user-network.ts b/src/hooks/use-user-network.ts index b14ffb24f..ba9d97c49 100644 --- a/src/hooks/use-user-network.ts +++ b/src/hooks/use-user-network.ts @@ -1,10 +1,31 @@ import { useMemo } from "react"; import { Kind } from "nostr-tools"; + import { getPubkeysFromList } from "../helpers/nostr/lists"; import useUserContactList from "./use-user-contact-list"; import replaceableEventLoaderService from "../services/replaceable-event-requester"; import { useReadRelayUrls } from "./use-client-relays"; import useSubjects from "./use-subjects"; +import userMetadataService from "../services/user-metadata"; +import { Kind0ParsedContent } from "../helpers/user-metadata"; + +export function useUsersMetadata(pubkeys: string[], additionalRelays: string[] = []) { + const readRelays = useReadRelayUrls(additionalRelays); + const metadataSubjects = useMemo(() => { + return pubkeys.map((pubkey) => userMetadataService.requestMetadata(pubkey, readRelays)); + }, [pubkeys]); + const metadataArray = useSubjects(metadataSubjects); + const metadataDir = useMemo(() => { + const dir: Record = {}; + for (const metadata of metadataArray) { + if (!metadata.pubkey) continue; + dir[metadata.pubkey] = metadata; + } + return dir; + }, [metadataArray]); + + return metadataDir; +} export default function useUserNetwork(pubkey: string, additionalRelays: string[] = []) { const readRelays = useReadRelayUrls(additionalRelays); @@ -18,6 +39,14 @@ export default function useUserNetwork(pubkey: string, additionalRelays: string[ }, [contactsPubkeys, readRelays.join("|")]); const lists = useSubjects(subjects); + const metadata = useUsersMetadata(lists.map((list) => list.pubkey).concat(pubkey)); + + return { lists, contacts, metadata }; +} + +export function useNetworkConnectionCount(pubkey: string, additionalRelays: string[] = []) { + const { lists, contacts } = useUserNetwork(pubkey, additionalRelays); + const contactsPubkeys = contacts ? getPubkeysFromList(contacts) : []; return useMemo(() => { const pubkeys = new Map(); diff --git a/src/views/tools/index.tsx b/src/views/tools/index.tsx index 3cbad4900..ab875f3d9 100644 --- a/src/views/tools/index.tsx +++ b/src/views/tools/index.tsx @@ -14,6 +14,9 @@ export default function ToolsHomeView() { + diff --git a/src/views/tools/network-mute-graph.tsx b/src/views/tools/network-mute-graph.tsx new file mode 100644 index 000000000..0cf75a584 --- /dev/null +++ b/src/views/tools/network-mute-graph.tsx @@ -0,0 +1,132 @@ +import { useMemo, useRef } from "react"; +import { Box } from "@chakra-ui/react"; +import AutoSizer from "react-virtualized-auto-sizer"; +import ForceGraph, { LinkObject, NodeObject } from "react-force-graph-3d"; +import { + Group, + Mesh, + MeshBasicMaterial, + SRGBColorSpace, + SphereGeometry, + Sprite, + SpriteMaterial, + TextureLoader, +} from "three"; + +import { useCurrentAccount } from "../../hooks/use-current-account"; +import RequireCurrentAccount from "../../providers/require-current-account"; +import { useUsersMetadata } from "../../hooks/use-user-network"; +import { MUTE_LIST_KIND, getPubkeysFromList, isPubkeyInList } from "../../helpers/nostr/lists"; +import useUserContactList from "../../hooks/use-user-contact-list"; +import { useReadRelayUrls } from "../../hooks/use-client-relays"; +import replaceableEventLoaderService from "../../services/replaceable-event-requester"; +import useSubjects from "../../hooks/use-subjects"; +import { useUserMetadata } from "../../hooks/use-user-metadata"; + +export function useUsersMuteLists(pubkeys: string[], additionalRelays: string[] = []) { + const readRelays = useReadRelayUrls(additionalRelays); + const muteListSubjects = useMemo(() => { + return pubkeys.map((pubkey) => replaceableEventLoaderService.requestEvent(readRelays, MUTE_LIST_KIND, pubkey)); + }, [pubkeys]); + return useSubjects(muteListSubjects); +} + +type NodeType = { id: string; image?: string; name?: string }; + +function NetworkGraphPage() { + const account = useCurrentAccount()!; + + const selfMetadata = useUserMetadata(account.pubkey); + const contacts = useUserContactList(account.pubkey); + const contactsPubkeys = useMemo( + () => (contacts ? getPubkeysFromList(contacts).map((p) => p.pubkey) : []), + [contacts], + ); + const usersMetadata = useUsersMetadata(contactsPubkeys); + const usersMuteLists = useUsersMuteLists(contactsPubkeys); + + const graphData = useMemo(() => { + if (!contacts) return { nodes: [], links: [] }; + + const nodes: Record> = {}; + const links: Record> = {}; + + const getOrCreateNode = (pubkey: string) => { + if (!nodes[pubkey]) { + const node: NodeType = { + id: pubkey, + }; + + const metadata = usersMetadata[pubkey]; + if (metadata) { + node.image = metadata.picture; + node.name = metadata.name; + } + + nodes[pubkey] = node; + } + return nodes[pubkey]; + }; + + for (const muteList of usersMuteLists) { + const author = muteList.pubkey; + for (const user of getPubkeysFromList(muteList)) { + if (isPubkeyInList(contacts, user.pubkey)) { + const keyA = [author, user.pubkey].join("|"); + links[keyA] = { source: getOrCreateNode(author), target: getOrCreateNode(user.pubkey) }; + } + } + } + + return { nodes: Object.values(nodes), links: Object.values(links) }; + }, [contacts, usersMuteLists, usersMetadata, selfMetadata]); + + return ( + + + {({ height, width }) => ( + + graphData={graphData} + enableNodeDrag={false} + width={width} + height={height} + linkDirectionalArrowLength={3.5} + linkDirectionalArrowRelPos={1} + linkCurvature={0.25} + nodeThreeObject={(node: NodeType) => { + if (!node.image) { + return new Mesh(new SphereGeometry(10, 12, 6), new MeshBasicMaterial({ color: 0xaa0f0f })); + } + + const group = new Group(); + + const imgTexture = new TextureLoader().load(node.image); + imgTexture.colorSpace = SRGBColorSpace; + const material = new SpriteMaterial({ map: imgTexture }); + const sprite = new Sprite(material); + sprite.scale.set(10, 10, 10); + + group.children.push(sprite); + + // if (node.name) { + // const text = new SpriteText(node.name, 8, "ffffff"); + // text.position.set(0, 0, 16); + // group.children.push(text); + // } + + return sprite; + }} + /> + )} + + + ); +} + +export default function NetworkGraphView() { + return ( + + + + ); +} diff --git a/src/views/tools/network.tsx b/src/views/tools/network.tsx index 1c6087604..417b1507a 100644 --- a/src/views/tools/network.tsx +++ b/src/views/tools/network.tsx @@ -3,7 +3,7 @@ import { memo, useMemo, useState } from "react"; import { useCurrentAccount } from "../../hooks/use-current-account"; import RequireCurrentAccount from "../../providers/require-current-account"; -import useUserNetwork from "../../hooks/use-user-network"; +import { useNetworkConnectionCount } from "../../hooks/use-user-network"; import { UserAvatarLink } from "../../components/user-avatar-link"; import { UserLink } from "../../components/user-link"; import { ArrowLeftSIcon } from "../../components/icons"; @@ -23,7 +23,7 @@ function NetworkPage() { const account = useCurrentAccount()!; const [range, setRange] = useState("50-100"); - const network = useUserNetwork(account.pubkey); + const network = useNetworkConnectionCount(account.pubkey); const filteredPubkeys = useMemo(() => { if (range.endsWith("+")) { const min = parseInt(range.replace("+", "")); diff --git a/yarn.lock b/yarn.lock index ffda58b77..80997c53a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,17 @@ # yarn lockfile v1 +"3d-force-graph@1": + version "1.72.3" + resolved "https://registry.yarnpkg.com/3d-force-graph/-/3d-force-graph-1.72.3.tgz#cdc300cc45463a8cdd27d6af3cd844c63408ae62" + integrity sha512-yyY5fg5DzEJqnHoxIkRM5U6dnBg3dI02CIu9vON/73wUESEC4AJLySrhIquGxjlj57uhkm/LzMgh2QdL2IWbVw== + dependencies: + accessor-fn "1" + kapsule "1" + three ">=0.118 <1" + three-forcegraph "1" + three-render-objects "1" + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -916,7 +927,7 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== @@ -2484,6 +2495,11 @@ lz-string "^1.5.0" pretty-format "^27.0.2" +"@tweenjs/tween.js@18 - 21": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-21.0.0.tgz#73f993c2d1de37b78b4c1246163e20bc6ae3b75e" + integrity sha512-qVfOiFh0U8ZSkLgA6tf7kj2MciqRbSCWaJZRwftVO7UbtVDNsZAXpWXqvCDtIefvjC83UJB+vHTDOGm5ibXjEA== + "@types/aria-query@^5.0.1": version "5.0.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.2.tgz#6f1225829d89794fd9f891989c9ce667422d7f64" @@ -2627,7 +2643,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.35", "@types/react@^18.2.20": +"@types/react@*", "@types/react@^16.9.35", "@types/react@^18.2.22": version "18.2.22" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.22.tgz#abe778a1c95a07fa70df40a52d7300a40b949ccb" integrity sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA== @@ -2663,6 +2679,21 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== +"@types/stats.js@*": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@types/stats.js/-/stats.js-0.17.0.tgz#0ed81d48e03b590c24da85540c1d952077a9fe20" + integrity sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w== + +"@types/three@^0.156.0": + version "0.156.0" + resolved "https://registry.yarnpkg.com/@types/three/-/three-0.156.0.tgz#cd49f2a12e858400962ea818d1e1c45e638141a8" + integrity sha512-733bXDSRdlrxqOmQuOmfC1UBRuJ2pREPk8sWnx9MtIJEVDQMx8U0NQO5MVVaOrjzDPyLI+cFPim2X/ss9v0+LQ== + dependencies: + "@types/stats.js" "*" + "@types/webxr" "*" + fflate "~0.6.10" + meshoptimizer "~0.18.1" + "@types/trusted-types@^2.0.2": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" @@ -2675,6 +2706,11 @@ dependencies: "@types/react" "*" +"@types/webxr@*": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.4.tgz#3d55a6427f9281d456843d754c99bf7804657fe3" + integrity sha512-41gfGLTtqXZhcmoDlLDHqMJDuwAMwhHwXf9Q2job3TUBsvkNfPNI/3IWVEtLH4tyY1ElWtfwIaoNeqeEX238/Q== + "@types/yauzl@^2.9.1": version "2.10.0" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" @@ -2736,6 +2772,11 @@ resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== +accessor-fn@1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/accessor-fn/-/accessor-fn-1.5.0.tgz#9353e10194da404366657f47177cd9bcb4463ee7" + integrity sha512-dml7D96DY/K5lt4Ra2jMnpL9Bhw5HEGws4p1OAIxFFj9Utd/RxNfEO3T3f0QIWFNwQU7gNxH9snUfqF/zNkP/w== + acorn@^8.8.2: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" @@ -2971,6 +3012,11 @@ better-path-resolve@1.0.0: dependencies: is-windows "^1.0.0" +"bezier-js@3 - 6": + version "6.1.4" + resolved "https://registry.yarnpkg.com/bezier-js/-/bezier-js-6.1.4.tgz#c7828f6c8900562b69d5040afb881bcbdad82001" + integrity sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg== + blob-util@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" @@ -3085,6 +3131,13 @@ caniuse-lite@^1.0.30001538: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== +canvas-color-tracker@1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/canvas-color-tracker/-/canvas-color-tracker-1.2.1.tgz#c552872f8f254bac3e74ea4cc7fed3bb19859bf1" + integrity sha512-i5clg2pEdaWqHuEM/B74NZNLkHh5+OkXbA/T4iaBiaNDagkOCXkLNrhqUfdUugsRwuaNRU20e/OygzxWRor3yg== + dependencies: + tinycolor2 "^1.6.0" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -3450,6 +3503,139 @@ cypress@^12.17.4: untildify "^4.0.0" yauzl "^2.10.0" +"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3": + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-binarytree@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d3-binarytree/-/d3-binarytree-1.0.2.tgz#ed43ebc13c70fbabfdd62df17480bc5a425753cc" + integrity sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw== + +"d3-color@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +"d3-dispatch@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3": + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-ease@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +"d3-force-3d@2 - 3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/d3-force-3d/-/d3-force-3d-3.0.5.tgz#9c8931b49acc3554f9110e128bc580cd3ab830f2" + integrity sha512-tdwhAhoTYZY/a6eo9nR7HP3xSW/C6XvJTbeRpR92nlPzH6OiE+4MliN9feuSFd0tPtEUo+191qOhCTWx3NYifg== + dependencies: + d3-binarytree "1" + d3-dispatch "1 - 3" + d3-octree "1" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-octree@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d3-octree/-/d3-octree-1.0.2.tgz#b39026b82701e45c7163e34ee056dc492035a017" + integrity sha512-Qxg4oirJrNXauiuC94uKMbgxwnhdda9xRLl9ihq45srlJ4Ga3CSgqGcAL8iW7N5CIv4Oz8x3E734ulxyvHPvwA== + +"d3-quadtree@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +"d3-scale-chromatic@1 - 3": + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" + integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +"d3-scale@1 - 4": + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + 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@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +"d3-time-format@2 - 4": + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + 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-zoom@2 - 3": + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + 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" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -3457,6 +3643,13 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-joint@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/data-joint/-/data-joint-1.3.1.tgz#d134950322c90f531e81bbbe8454277549031466" + integrity sha512-tMK0m4OVGqiA3zkn8JmO6YAqD8UwJqIAx4AAwFl1SKTtKAqcXePuT+n2aayiX9uITtlN3DFtKKTOxJRUc2+HvQ== + dependencies: + index-array-by "^1.4.0" + dayjs@^1.10.4, dayjs@^1.11.9: version "1.11.10" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" @@ -3929,6 +4122,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fflate@~0.6.10: + version "0.6.10" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.6.10.tgz#5f40f9659205936a2d18abf88b2e7781662b6d43" + integrity sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg== + figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -3993,6 +4191,26 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +force-graph@1: + version "1.43.4" + resolved "https://registry.yarnpkg.com/force-graph/-/force-graph-1.43.4.tgz#4cbf7948d67b536bc4e42957ad71168c60fc1fb1" + integrity sha512-xIKcxTpUN12tq8+2ptbWUV68qbCufprNyJEkONzR6R2rmD8E7GljLa5zWqgavXcSQ+GxQOJ21rV8SDQMBB3uGg== + dependencies: + "@tweenjs/tween.js" "18 - 21" + accessor-fn "1" + bezier-js "3 - 6" + canvas-color-tracker "1" + d3-array "1 - 3" + d3-drag "2 - 3" + d3-force-3d "2 - 3" + d3-scale "1 - 4" + d3-scale-chromatic "1 - 3" + d3-selection "2 - 3" + d3-zoom "2 - 3" + index-array-by "1" + kapsule "^1.14" + lodash-es "4" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -4023,6 +4241,11 @@ framesync@6.1.2: dependencies: tslib "2.4.0" +fromentries@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -4349,6 +4572,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +index-array-by@1, index-array-by@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/index-array-by/-/index-array-by-1.4.1.tgz#425f26cf0c744a47ebadf47366692e52043cf17b" + integrity sha512-Zu6THdrxQdyTuT2uA5FjUoBEsFHPzHcPIj18FszN6yXKHxSfGcR4TPLabfuT//E25q1Igyx9xta2WMvD/x9P/g== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -4384,6 +4612,11 @@ internal-slot@^1.0.4, internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -4639,6 +4872,11 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" +jerrypick@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jerrypick/-/jerrypick-1.1.1.tgz#db0b15841a53cfe492de2db9544eecf8de73203c" + integrity sha512-XTtedPYEyVp4t6hJrXuRKr/jHj8SC4z+4K0b396PMkov6muL+i8IIamJIvZWe3jUspgIJak0P+BaWKawMYNBLg== + jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -4737,6 +4975,13 @@ jsprim@^2.0.2: json-schema "0.4.0" verror "1.10.0" +kapsule@1, kapsule@^1.14: + version "1.14.4" + resolved "https://registry.yarnpkg.com/kapsule/-/kapsule-1.14.4.tgz#55f19fe7a04dfe111e9efc7d85a895e6440ef828" + integrity sha512-Ro1US5B5mtyZMM+NqW/0fqcBf9oEO7fG0gYY9FY+BVGo4KaonVsplFfuYx3pZ/GLCQfYE5cONduILLktsYjUpQ== + dependencies: + lodash-es "4" + kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -4842,6 +5087,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -4986,6 +5236,11 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +meshoptimizer@~0.18.1: + version "0.18.1" + resolved "https://registry.yarnpkg.com/meshoptimizer/-/meshoptimizer-0.18.1.tgz#cdb90907f30a7b5b1190facd3b7ee6b7087797d8" + integrity sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw== + micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -5088,6 +5343,37 @@ ngeohash@^0.6.3: resolved "https://registry.yarnpkg.com/ngeohash/-/ngeohash-0.6.3.tgz#10b1e80be5488262ec95c56cf2dbb6c45fbdf245" integrity sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw== +ngraph.events@^1.0.0, ngraph.events@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ngraph.events/-/ngraph.events-1.2.2.tgz#3ceb92d676a04a4e7ce60a09fa8e17a4f0346d7f" + integrity sha512-JsUbEOzANskax+WSYiAPETemLWYXmixuPAlmZmhIbIj6FH/WDgEGCGnRwUQBK0GjOnVm8Ui+e5IJ+5VZ4e32eQ== + +ngraph.forcelayout@3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/ngraph.forcelayout/-/ngraph.forcelayout-3.3.1.tgz#981e1baee5e0593c490bc27219169f9cedfa4f8b" + integrity sha512-MKBuEh1wujyQHFTW57y5vd/uuEOK0XfXYxm3lC7kktjJLRdt/KEKEknyOlc6tjXflqBKEuYBBcu7Ax5VY+S6aw== + dependencies: + ngraph.events "^1.0.0" + ngraph.merge "^1.0.0" + ngraph.random "^1.0.0" + +ngraph.graph@20: + version "20.0.1" + resolved "https://registry.yarnpkg.com/ngraph.graph/-/ngraph.graph-20.0.1.tgz#579470d1d805583239704dc913e2095540aaf371" + integrity sha512-VFsQ+EMkT+7lcJO1QP8Ik3w64WbHJl27Q53EO9hiFU9CRyxJ8HfcXtfWz/U8okuoYKDctbciL6pX3vG5dt1rYA== + dependencies: + ngraph.events "^1.2.1" + +ngraph.merge@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ngraph.merge/-/ngraph.merge-1.0.0.tgz#d763cdfa48b1bbd4270ea246f06c9c8ff5d3477c" + integrity sha512-5J8YjGITUJeapsomtTALYsw7rFveYkM+lBj3QiYZ79EymQcuri65Nw3knQtFxQBU1r5iOaVRXrSwMENUPK62Vg== + +ngraph.random@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ngraph.random/-/ngraph.random-1.1.0.tgz#5345c4bb63865c85d98ee6f13eab1395d8545a90" + integrity sha512-h25UdUN/g8U7y29TzQtRm/GvGr70lK37yQPvPKXXuVfs7gCm82WipYFZcksQfeKumtOemAzBIcT7lzzyK/edLw== + noble-secp256k1@^1.2.14: version "1.2.14" resolved "https://registry.yarnpkg.com/noble-secp256k1/-/noble-secp256k1-1.2.14.tgz#39429c941d51211ca40161569cee03e61d72599e" @@ -5353,6 +5639,13 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +polished@4: + version "4.2.2" + resolved "https://registry.yarnpkg.com/polished/-/polished-4.2.2.tgz#2529bb7c3198945373c52e34618c8fe7b1aa84d1" + integrity sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ== + dependencies: + "@babel/runtime" "^7.17.8" + postcss@^8.4.27: version "8.4.30" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" @@ -5406,7 +5699,7 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -prop-types@^15.6.2: +prop-types@15, prop-types@^15.6.2: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -5511,6 +5804,24 @@ react-focus-lock@^2.9.4: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-force-graph-2d@^1.25.1: + version "1.25.1" + resolved "https://registry.yarnpkg.com/react-force-graph-2d/-/react-force-graph-2d-1.25.1.tgz#8637e6d8eb78895dd1669087d5357db6cb055e6c" + integrity sha512-ghUw8qNUnw1Tl363drzQGK4iyyXaQM2CNCJpnyYgceQhv7ARCo+6dB2DKjZ4WcXwR6bJyDk/jscISEs3ugQiLQ== + dependencies: + force-graph "1" + prop-types "15" + react-kapsule "2" + +react-force-graph-3d@^1.23.1: + version "1.23.1" + resolved "https://registry.yarnpkg.com/react-force-graph-3d/-/react-force-graph-3d-1.23.1.tgz#61b0ae4bbcbd956e3871638c53e3a08c716cfd27" + integrity sha512-2WvLq1AFogDqAi0btowqP+7/cBnTJDC4eMe/XJLu8jVQXCEDJZanqm12noYRHkd8croTPhQpUhUDcOm1uHmFAQ== + dependencies: + "3d-force-graph" "1" + prop-types "15" + react-kapsule "2" + react-hook-form@^7.45.4: version "7.46.2" resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.46.2.tgz#051e3cb2a73f3e86de739f2198c6042902158c43" @@ -5526,6 +5837,14 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-kapsule@2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/react-kapsule/-/react-kapsule-2.4.0.tgz#50d296ed2872a6db89f2de176eebb1a4ce2cccb8" + integrity sha512-w4Yv9CgWdj8kWGQEPNWFGJJ08dYEZHZpiaFR/DgZjCMBNqv9wus2Gy1qvHVJmJbzvAZbq6jdvFC+NYzEqAlNhQ== + dependencies: + fromentries "^1.3.2" + jerrypick "^1.1.1" + react-photo-album@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/react-photo-album/-/react-photo-album-2.3.0.tgz#262afa60691d8ed5e25b8c8a73cec339ec515652" @@ -5618,6 +5937,11 @@ react-use@^17.4.0: ts-easing "^0.2.0" tslib "^2.1.0" +react-virtualized-auto-sizer@^1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.20.tgz#d9a907253a7c221c52fa57dc775a6ef40c182645" + integrity sha512-OdIyHwj4S4wyhbKHOKM1wLSj/UDXm839Z3Cvfg2a9j+He6yDa6i5p0qQvEiCnyQlGO/HyfSnigQwuxvYalaAXA== + react-webcam@^5.0.1: version "5.2.4" resolved "https://registry.yarnpkg.com/react-webcam/-/react-webcam-5.2.4.tgz#714b4460ea43ac7ed081824299cd2a580f764478" @@ -6299,6 +6623,42 @@ textarea-caret@3.0.2: resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.0.2.tgz#f360c48699aa1abf718680a43a31a850665c2caf" integrity sha512-gRzeti2YS4did7UJnPQ47wrjD+vp+CJIe9zbsu0bJ987d8QVLvLNG9757rqiQTIy4hGIeFauTTJt5Xkn51UkXg== +three-forcegraph@1: + version "1.41.10" + resolved "https://registry.yarnpkg.com/three-forcegraph/-/three-forcegraph-1.41.10.tgz#a162263b5c5db957c88cb496baff057f12bb26ef" + integrity sha512-XrrH0HzlWQiY5A30RMtlu+SpAM/LOoHMyaQouCFgavTSLrSsP4UIUP3eWrfJ0be1xDPuMGt3iofSYjgu4UT2NA== + dependencies: + accessor-fn "1" + d3-array "1 - 3" + d3-force-3d "2 - 3" + d3-scale "1 - 4" + d3-scale-chromatic "1 - 3" + data-joint "1" + kapsule "1" + ngraph.forcelayout "3" + ngraph.graph "20" + tinycolor2 "1" + +three-render-objects@1: + version "1.28.6" + resolved "https://registry.yarnpkg.com/three-render-objects/-/three-render-objects-1.28.6.tgz#96386dcafd270e509606691139018c4a093ff495" + integrity sha512-e1Dls7NbT9XvKByueLRFRFKIAnNRL9sz7Ul318uXkP/f9uZjUFmelgloBAK3PSQ5xJd++FsKCf7ZIteSWNzTpA== + dependencies: + "@tweenjs/tween.js" "18 - 21" + accessor-fn "1" + kapsule "1" + polished "4" + +three-spritetext@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/three-spritetext/-/three-spritetext-1.8.1.tgz#e554230b6f80c75251e0275b8408b8cf2dc2b101" + integrity sha512-pohv5CcdeUtAPLi9KhG0kcDLj3gmzdIFK/QlgsTJe+U07oQFSj+K0DLPQKbNDPWAK+7YzhulkRcjWdVIQ5F7nw== + +"three@>=0.118 <1", three@^0.156.1: + version "0.156.1" + resolved "https://registry.yarnpkg.com/three/-/three-0.156.1.tgz#bab4fec121a5b3975eb4f4d227d9c912171eb399" + integrity sha512-kP7H0FK9d/k6t/XvQ9FO6i+QrePoDcNhwl0I02+wmUJRNSLCUIDMcfObnzQvxb37/0Uc9TDT0T1HgsRRrO6SYQ== + throttle-debounce@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" @@ -6319,6 +6679,11 @@ tiny-invariant@^1.0.6: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== +tinycolor2@1, tinycolor2@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" + integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"