diff --git a/CODEBASE_REVIEW.md b/CODEBASE_REVIEW.md new file mode 100644 index 00000000..a26a6e02 --- /dev/null +++ b/CODEBASE_REVIEW.md @@ -0,0 +1,198 @@ +# Codebase review — 23 October 2026 + +The site has a sensible shape for a personal technical blog: content lives in Git, most work happens at build time, and React is available for interactive examples. The biggest opportunity is to make content generation and verification dependable. Several of the planned features can then share that foundation. + +This review covers application routes, the content generators, shared components, demos, tests, CI, deployment configuration, dependencies, and the separate diagram tool. Recommendations below distinguish reproduced defects from improvements and future failure cases. Application code and TODO.md were left unchanged. + +## How the codebase works + +There are **83 published posts, 10 drafts, and 7 test articles** under `src/routes`. Those directories contain content, despite the name; Next.js routing lives under `src/app`. + +```mermaid +flowchart TD + Source[MDX content in src/routes] --> Compile[Compile MDX with remark and rehype] + Source --> Metadata[Extract and validate frontmatter] + Compile --> Modules[src/generated/mdx] + Metadata --> Indexes[Frontmatter JSON, barrel files, tags] + Assets[src/assets] --> Images[Generated image registry] + Modules --> Routes[Next.js App Router] + Indexes --> Routes + Images --> Routes + Indexes --> Feed[public/rss.xml] + Indexes --> Sitemap[public/sitemap.xml] + Routes --> Netlify[Netlify deployment] +``` + +| Area | Main files | Responsibility | +| --- | --- | --- | +| Content compilation | [transformMdx.ts](utils/transformMdx.ts) | Compile MDX into JavaScript; syntax highlighting, heading IDs, exported frontmatter. | +| Content indexing | [extractFrontMatter.ts](utils/extractFrontMatter.ts), [frontmatterTypings.ts](utils/frontmatterTypings.ts) | Parse YAML, validate it with Zod, write JSON and export indexes, build tag membership. | +| Content access | [blogPosts.tsx](src/utils/blogPosts.tsx) | Load compiled posts, look up metadata, sort posts, assemble series, produce social metadata. | +| Routes | [src/app](src/app) | Home, post/tag listings, article pages, gated draft/test pages, informational pages, demos. | +| Article chrome | [BlogPostFrame](src/components/BlogPostFrame/BlogPostFrame.tsx), [FrontmatterBox](src/components/FrontmatterBox/FrontmatterBox.tsx) | Title/date, series navigation, GitHub edit link, comments. | +| Interactive examples | [src/demos](src/demos) | Rendering behaviour, cookies, caching, confirmation dialogs, state encapsulation. | +| External integrations | [layout.tsx](src/app/layout.tsx), instrumentation files, [PostComments](src/components/PostComments/PostComments.tsx) | GitHub code embeds, margin highlights, Utterances, Google Analytics, Sentry. | +| Diagram authoring | [src/image-gen](src/image-gen/README.md) | Separate package that bundles diagram modules and uses headless Chrome to export PNG and editable Excalidraw files. | +| Verification/deployment | [static-checks.yml](.github/workflows/static-checks.yml), [netlify.toml](netlify.toml) | Build, lint, types, unit tests, Netlify hosting. Browser-test workflow currently disabled. | + +There is no database or general application backend. The route handlers are small demonstrations of caching and cookies. Some article content is request-dependent, notably the server-cookie example, so the site should not be assumed to be entirely static. + +Useful existing choices include strict TypeScript, schema validation at the content boundary, real article fixtures for browser tests, shared article framing, and editable source files alongside generated diagrams. These are good foundations to retain. + +## What I verified + +| Check | Result and limits | +| --- | --- | +| Unit tests | `npm test -- --run`: **4 tests passed**, across the two generator test files. | +| Lint | `npm run lint`: **0 errors, 6 warnings**, concerning fonts, analytics script loading, and error-page images. | +| Types | Failed in the three Sentry initialization files because the installed SDK does not recognise `enableLogs`. The first TypeScript command fails, so the Cypress type check is not reached. | +| Content generation | All five generation stages completed in a temporary copy, invoked through `node --import tsx` because the sandbox prevents the tsx CLI's IPC socket. Generated RSS and sitemap each contain **83 entries** and parse as XML. | +| Production build | Attempted in the temporary copy using the existing installed dependencies. Failed fetching Inter from `fonts.googleapis.com` because DNS/network access is unavailable here. This does not establish a production build defect. | +| Browser tests | Not run. No claim of browser, deployment, visual, or accessibility verification. | +| Content checks | All current content has parseable dates and existing social-image references. A lightweight scan found no broken internal post links; it was not a complete MDX link/anchor validator. | + +The dependency state matters when interpreting these results: + +| Package | Manifest/lockfile target | Installed locally | +| --- | --- | --- | +| Next.js | `^16.2.6` / `16.2.6` | `15.5.4` | +| Sentry Next.js SDK | `^10.53.1` / `10.53.1` | `9.34.0` | +| Next MDX package | `^14.2.4` / `14.2.4` | `14.2.4` | +| Next ESLint configuration | `14.2.4` | `14.2.4` | + +The manifest and lockfile agree on the upgraded Next/Sentry versions; local `node_modules` is behind them. A fresh installation of the locked dependency tree was not performed. Therefore the observed Sentry type failures should first be investigated as installation drift, rather than by deleting valid options from the source. + +## Work to prioritise + +### 1. Repair the exported Next.js configuration + +**Confirmed defect; small change, with build verification required.** + +[next.config.js](next.config.js) declares `nextConfig`, but passes `module.exports` into `withSentryConfig`. At that point `module.exports` is the initial empty object. I evaluated the configuration with a stub wrapper and confirmed its input is `{}`. + +Consequently the declared compiler settings, external packages, and custom webpack warning handling are discarded. Pass the declared configuration to the wrapper. + +Make this part of finishing the Next 16 migration: `reactCompiler` moved to the top level, and Next 16 defaults to Turbopack. Restoring the custom webpack function requires an explicit bundler decision. Keep annotation mode deliberately scoped because automatic memoization could change the behaviour being illustrated by the React rendering demos. See the official [Next 16 migration guide](https://nextjs.org/docs/app/guides/upgrading/version-16) and [compiler configuration](https://nextjs.org/docs/app/api-reference/config/next-config-js/reactCompiler). + +**Done when:** a fresh locked install passes build/types and the effective configuration contains the intended options; rendering demos still illustrate their documented behaviour. + +### 2. Make generation await writes and produce repeatable output + +**Confirmed defect plus robustness improvements; medium scope.** + +The default writer in [transformMdx.ts](utils/transformMdx.ts) calls `fs.writeFile` without returning or awaiting its promise. I delayed those writes and observed compilation return with **four writes pending and zero completed**. Callers cannot rely on completion, and write failures are detached from the compiler's promise. + +Other generation issues become especially relevant to live reload: + +- Frontmatter barrel files are appended to. The npm command removes the old directory first, but the underlying generator cannot safely be rerun against existing output. +- Concurrent file processing appends exports in completion order. Sort records and write each index once for stable output. +- Generated exports use filenames directly as JavaScript identifiers. A conventional new filename such as `my-post.mdx` would produce an invalid named export. Support string-keyed records or validate naming constraints clearly. +- The MDX compiler traverses arbitrary nesting, while frontmatter extraction requires exactly two path segments beneath the content root. Decide on one supported layout. +- `generate:all` deletes `.next`, coupling content refresh to clearing the entire framework cache. + +**Done when:** generation twice produces identical output, renames/deletions remove stale files, failures reject the command, and tests exercise real temporary-file writes as well as injected callbacks. + +### 3. Restore browser checks as part of the Playwright migration + +**Confirmed coverage gap; medium scope.** + +[cypress.yml](.github/workflows/cypress.yml) has `if: false`. Current browser tests also suppress broad classes of React errors, including any message containing “Minified React error”, and assert exact hashed asset filenames. + +Preserve useful coverage while migrating: article navigation, metadata, series, images, comments, and 404s. Add tag filtering, production draft/test gating, and at least one interactive demo. Assert that images load, not just that an element exists: the image fixture currently passes an imported image object directly into a raw ``'s `src`. + +Run most tests against a locally built server, then use a smaller deployed smoke suite to check Netlify-specific behaviour. Playwright supports a managed [web server](https://playwright.dev/docs/test-webserver) and [trace configuration](https://playwright.dev/docs/test-configuration). + +If retaining the deploy polling script, fix its error check: it compares the HTTP response's `status` to the string `"error"` instead of checking the deployment's `state`. The runner also invokes Yarn despite this being an npm project. + +**Done when:** PRs run browser tests, uncaught application errors fail them, failures include diagnostic artifacts, and assertions survive regenerated image hashes. + +### 4. Keep missing content separate from broken content + +**Confirmed error-handling problems; small to medium scope.** + +[getBlogContent](src/utils/blogPosts.tsx) converts every caught import or synchronous component error into `notFound()`. An existing post with a broken import can therefore look like a missing page. `getMetadata` similarly hides all failures behind generic metadata. + +Look up whether a slug exists before importing it; let unexpected failures reach the error boundary and Sentry. Render a useful fallback in [global-error.tsx](src/app/global-error.tsx), whose body currently contains only a placeholder comment. Consider making the existing route-level error page's `reset` action available too. + +**Done when:** an unknown slug returns 404, a deliberately broken known post reaches a useful error screen, and the original error is observable. + +### 5. Establish one validated content model + +**Confirmed inconsistencies; medium scope with benefits across several TODOs.** + +Frontmatter is parsed twice: once from YAML, once by extracting JSON-shaped text from compiled JavaScript with a regex. One phase requires a publication date before another phase can supply its Git fallback. + +[getFileGitTimestamps.ts](utils/getFileGitTimestamps.ts) returns `Invalid Date` for a path without history: splitting empty output yields an array with one empty string, so its empty-history check never triggers. I reproduced this. Git history is queried for every article even when a publication date is already explicit. This also makes generation depend on a Git checkout unnecessarily. + +The Zod schema accepts any string as a date; I confirmed `"not-a-date"` passes. Series parts can be fractional, negative, or duplicated. “Next” navigation indexes the sorted series array by part number, assuming uninterrupted numbering from one. + +Parse and normalise metadata once, validate actual date values, and build a typed manifest that all consumers share. Validate duplicate series positions and derive the next post from the current post's position. Treat publication date and substantive update date as separate fields; decide explicitly whether Git timestamps are appropriate fallbacks. + +This manifest can supply tags, series, RSS, sitemap, search, Markdown exports, and diagram/image metadata. + +### 6. Correct public indexes, RSS, and sitemap semantics + +**One current indexing defect, one RSS conformance defect, plus preventative work; small to medium scope.** + +The tag generator mixes all three content groups. Currently `untagged` contains **5 published posts, 10 drafts, and 7 test articles**. The component compensates by moving that tag last. Generate public tags from published content instead; future draft-specific tags should not appear on the public homepage. + +The generated RSS is well-formed XML today, but: + +- It is not sorted newest first. +- Titles and descriptions are interpolated without XML escaping. Current metadata happens not to contain the problematic `<` or `&` characters; a future ordinary title could break the feed. +- Its channel image omits required `title` and `link` children. See the [RSS specification](https://www.rssboard.org/rss-specification). + +The sitemap uses creation date as `lastmod`, so edits do not change it, and it lists only posts. Include appropriate public informational pages and use an accurate update date, or omit `lastmod` when unavailable. Add RSS autodiscovery, article canonicals, and article-specific metadata through the existing metadata helper. The [Next metadata API](https://nextjs.org/docs/app/api-reference/functions/generate-metadata) supports these fields. + +**Done when:** feeds are parsed and validated in tests, punctuation is escaped correctly, sorting is explicit, and public indexes exclude drafts/tests. + +### 7. Make builds and checks reproducible + +**Observed environment drift and maintenance improvements; small to medium scope.** + +Use a locked installation in CI; the current static workflow uses `npm i`. Pin the selected runtime/package manager consistently across local development, CI, and Netlify. Make CI's unit command explicitly noninteractive. Run cheap checks before the production build where their generated-input dependencies allow it. + +Review the old Next MDX and lint packages against actual usage. MDX is compiled by the custom utility, so some loader packages may be removable. Do not equate an old version number with a proven incompatibility. + +Font handling deserves a specific task: the layout downloads Inter at build time while also loading Open Sans and Material Symbols from Google at runtime. Determine the intended font stack, remove redundant requests, and consider local font assets if offline builds matter. Similarly, syntax-highlighting CSS can be bundled instead of fetched from a CDN. + +Remove tracked `tsconfig.tsbuildinfo`, which changes when type checking runs. Clean up unused migration-era utilities such as `buildTimeUtils/generateListOfArticles.ts`, the commented Remix loader, the old social-meta helper, and the unused starter CSS after checking references. Expand the README to explain generation, environment flags, GitHub embeds, tests, deployment, and diagram authoring. `npm start` also relies on a Netlify CLI not declared in this package. + +## How I would refine your existing TODOs + +| Existing item | Suggested concrete scope | +| --- | --- | +| Switch to Bun | Pin Bun, migrate the lockfile, update CI/Netlify/scripts, verify the Git dependency and install scripts. Decide separately whether Bun is the package manager, script runner, or production runtime. Use a frozen install in CI; see [Bun installation behaviour](https://bun.sh/docs/pm/cli/install) and [lifecycle scripts](https://bun.sh/docs/pm/lifecycle). | +| Switch to Oxlint | Preserve the intent of the current Next rules; explicitly enable appropriate Next/React/accessibility rules and compare diagnostics before removing ESLint. Oxlint has native plugin configuration, including `nextjs`; see its [configuration reference](https://oxc.rs/docs/guide/usage/linter/config). | +| Switch to Playwright | Restore CI coverage, improve assertions, expose runtime errors, capture traces, and test both local builds and a small deployed smoke suite. | +| Add live reload | Watch MDX additions/edits/deletions and relevant assets; refresh compiled content and derived metadata together. Preserve `.next`, report errors without losing the last valid preview, and clean up the watcher on exit. | +| Image panel with description/AI disclaimer | Extend the existing `ImagePanel`, already used by posts. Use `figure`/`figcaption`, concise alt text, visible provenance/credit fields, dimensions, and optional source downloads. | +| Add `.md` page variants | Define readable output for React demos, highlights, GitHub embeds, images, and diagrams. Raw MDX with imports removed still contains JSX. Give unsupported interactive content a descriptive fallback and link to the live page; reuse the same content manifest. | +| Add Mermaid renderer | Prefer generated SVG for ordinary static diagrams; retain Mermaid source for Markdown export. The [official CLI](https://github.com/mermaid-js/mermaid-cli) produces SVG/PNG/PDF. If a client renderer is needed, load it only on relevant pages. | +| Excalidraw renderer? | Much of this exists in `src/image-gen`: Chrome export, local fonts, editable scenes, temporary server cleanup. Extend it with a stable authoring/component interface, previews, source downloads, and regeneration commands before introducing another renderer. | +| Add AGENTS.md files | Start with root instructions explaining setup, generation, checks, and the distinction between content and application routes. Add scoped instructions for content and diagram authoring where needed; include preserving the rendering demos' intended behaviour. Verify commands from a fresh install so agents inherit working instructions. | + +For the rendering features, a shared diagram presentation component could provide caption, alt text, source link, and Markdown fallback for both Mermaid and Excalidraw. Prefer keeping the existing heavy diagram dependencies in the authoring package rather than loading an editor for every reader. + +## Additional reader-facing work + +These are improvements, rather than claims that an observed reader journey failed: + +- **Search and an archive.** With 83 posts, title/description/tag search and a year archive would complement the existing topic links. A generated index can do this without a backend. Full-text search can follow if needed. +- **On-page contents and better code reading.** Heading IDs already exist through `rehype-slug`; expose them in a table of contents for long posts. Consider a copy button and preserving code formatting with horizontal scrolling instead of forced wrapping. +- **Accessibility and print layout.** Add a main landmark and skip link; check keyboard focus, long tables/code on mobile, margin annotations, contrast, captions, and printing. The Game of Life cells are clickable divs with `role="button"` but no keyboard handler, accessible name, or tab stop. +- **Image delivery.** Several originals are 1–3 MB and many posts use raw images. Measure actual transfer/layout behaviour before changing formats, then add responsive sizes, dimensions, and appropriate loading behaviour through a shared component. The generated image registry currently excludes nested folders and uppercase extensions such as `.JPG`. +- **External-content resilience.** Test code embeds and comments with third-party requests blocked. Provide meaningful links/fallbacks and make sure article text remains readable. Check comments across navigation and development remounts. +- **Environment-specific telemetry.** Sentry currently sets a trace rate of 1, session replay rate of 0.1, and `sendDefaultPii: true`. Review these explicit choices against the desired diagnostics, data collection, payload, and operating cost; keep preview/development traffic distinguishable. +- **Fix the Game of Life rule.** The implementation kills a live cell with four neighbours but leaves cells with five through eight alive. I exercised the pure logic and reproduced this. Use survival only at two or three neighbours, with small pattern tests for overcrowding, still lifes, and oscillators. + +## Suggested delivery order + +1. Establish a fresh locked dependency baseline; fix Next config export and finish the bundler/compiler migration. +2. Fix awaited writes, error handling, and metadata/date contracts; make generated output repeatable. +3. Restore browser checks through Playwright and correct public tags/RSS/sitemap behaviour. +4. Add content watching on top of the reliable generator. +5. Share image/diagram metadata and presentation; connect existing Excalidraw tooling and add Mermaid. +6. Add Markdown variants and search using the shared content model; then measure and improve reader performance/accessibility. + +Bun and Oxlint can be independent, reviewable changes once the baseline is known. Their speed benefits are useful, but the confirmed configuration, generation, and verification defects deserve earlier attention. diff --git a/TODO.md b/TODO.md new file mode 100644 index 00000000..ad2ad275 --- /dev/null +++ b/TODO.md @@ -0,0 +1,10 @@ +- Switch to bun +- Switch to oxlint +- Switch to playwright +- Add live reload +- Add an image panel that includes: + - Description, include AI disclaimer. +- Add .md variants of pages. +- Add mermaidjs renderer +- Excalidar renderer? +- Add in AGENTs.md files and make sure everything still works \ No newline at end of file diff --git a/next-env.d.ts b/next-env.d.ts index c4b7818f..830fb594 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +/// // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/src/app/ai-policy/page.tsx b/src/app/ai-policy/page.tsx index a7fef84d..3bea5a21 100644 --- a/src/app/ai-policy/page.tsx +++ b/src/app/ai-policy/page.tsx @@ -1,28 +1,38 @@ export default function AiPolicyPage() { return
-

AI Policy

+

AI ContentPolicy

-

Last updated: 7th July 2025

+

Last updated: 23rd October 2023

The text content of the blog posts is entirely written by myself.

- I use AI (Github Copilot code review) to detect and correct typos and spelling errors. + I use AI to detect and correct typos and spelling errors.

- I do sometimes use AI as a research tool (e.g. 'tell me what technologies solve X problem') and suggestions from AI may make it into a blog post. However the content and subject of blog posts always respresents my genuine thoughts, opinions or experiences on a topic; I do not use AI to suggest topic ideas. + The content and subject of blog posts always respresents my genuine thoughts, opinions or experiences on a topic.

+

+ I do not use AI to suggest topic ideas. +

+

Since 2026, I increasingly use AI as a research tool. Where I am repeating a factual or technical claim from AI, I will make best efforts to cite a canonical source for the claim.

- Images may be AI generated - when they are, the alt text reflects it. + Images may be AI generated - when they are, the alt text reflects it.

- Code snippets may or may not be generated with AI assistance; code snippets are a genuine representation the code I write in both professional and personal contexts. + Diagrams are generated by prompting AI. Text content of the diagrams is generated by AI, subject to my reprompting or not.

-
+

+ Code snippets may or may not be generated with AI assistance; code snippets are a genuine representation the code I write in both professional and personal contexts. +

+ + + + } \ No newline at end of file diff --git a/src/app/globals.css b/src/app/globals.css index 60307eae..fcbc7199 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -510,6 +510,7 @@ img { .blog-image { max-width: 100%; + height: auto; display: block; margin: 0 auto; } diff --git a/src/assets/corporate_value_funnel.excalidraw b/src/assets/corporate_value_funnel.excalidraw new file mode 100644 index 00000000..e05a3a91 --- /dev/null +++ b/src/assets/corporate_value_funnel.excalidraw @@ -0,0 +1,2670 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "corporate-value-1", + "type": "rectangle", + "x": 0, + "y": 0, + "width": 1760, + "height": 1400, + "angle": 0, + "strokeColor": "#fffdf8", + "backgroundColor": "#fffdf8", + "fillStyle": "solid", + "strokeWidth": 0, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0", + "roundness": null, + "seed": 1146, + "version": 2, + "versionNonce": 1205330797, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": true + }, + { + "id": "title", + "type": "text", + "x": 410.39813232421875, + "y": 48, + "width": 939.2037353515625, + "height": 52.5, + "angle": 0, + "strokeColor": "#263238", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 1283, + "version": 2, + "versionNonce": 748426723, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "text": "the corporation as a value extraction funnel", + "fontSize": 42, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "the corporation as a value extraction funnel", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-value-3", + "type": "line", + "x": 880, + "y": 330, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "#fff7dc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": null, + "seed": 1420, + "version": 2, + "versionNonce": 188935629, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 109.09090909090912, + 175 + ], + [ + -109.09090909090912, + 175 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-4", + "type": "line", + "x": 770.9090909090909, + "y": 505, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "#f3eefb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a3", + "roundness": null, + "seed": 1557, + "version": 2, + "versionNonce": 1896178051, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 218.18181818181824, + 0 + ], + [ + 336.62337662337666, + 190 + ], + [ + -118.44155844155841, + 190 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-5", + "type": "line", + "x": 652.4675324675325, + "y": 695, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "#ede6f7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4", + "roundness": null, + "seed": 1694, + "version": 2, + "versionNonce": 362654765, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 455.06493506493507, + 0 + ], + [ + 582.8571428571429, + 205 + ], + [ + -127.79220779220782, + 205 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-6", + "type": "line", + "x": 524.6753246753246, + "y": 900, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "#e7f5ee", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": null, + "seed": 1831, + "version": 2, + "versionNonce": 1568946467, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 710.6493506493507, + 0 + ], + [ + 835.3246753246754, + 200 + ], + [ + -124.67532467532465, + 200 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-7", + "type": "line", + "x": 880, + "y": 330, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#93958d", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.3, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6", + "roundness": null, + "seed": 1968, + "version": 2, + "versionNonce": 1456578189, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 480, + 770 + ], + [ + -480, + 770 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-8", + "type": "line", + "x": 770.9090909090909, + "y": 505, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#b7b7ac", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.3, + "strokeStyle": "solid", + "roughness": 0.6, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7", + "roundness": null, + "seed": 2105, + "version": 2, + "versionNonce": 1871125699, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 218.18181818181824, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-9", + "type": "line", + "x": 652.4675324675325, + "y": 695, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#b7b7ac", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.3, + "strokeStyle": "solid", + "roughness": 0.6, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a8", + "roundness": null, + "seed": 2242, + "version": 2, + "versionNonce": 93865197, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 455.06493506493507, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-10", + "type": "line", + "x": 524.6753246753246, + "y": 900, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#b7b7ac", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.3, + "strokeStyle": "solid", + "roughness": 0.6, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a9", + "roundness": null, + "seed": 2379, + "version": 2, + "versionNonce": 1923910755, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 710.6493506493507, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-11", + "type": "arrow", + "x": 535, + "y": 955, + "width": 125, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aA", + "roundness": null, + "seed": 2516, + "version": 2, + "versionNonce": 1165696845, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 124.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-12", + "type": "arrow", + "x": 650, + "y": 955, + "width": 10, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aB", + "roundness": null, + "seed": 2653, + "version": 2, + "versionNonce": 985860099, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 9.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-13", + "type": "arrow", + "x": 765, + "y": 955, + "width": 115, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aC", + "roundness": null, + "seed": 2790, + "version": 2, + "versionNonce": 215199149, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 114.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-14", + "type": "arrow", + "x": 880, + "y": 955, + "width": 0, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aD", + "roundness": null, + "seed": 2927, + "version": 2, + "versionNonce": 499716003, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + -0.5 + ], + [ + 0, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-15", + "type": "arrow", + "x": 995, + "y": 955, + "width": 115, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aE", + "roundness": null, + "seed": 3064, + "version": 2, + "versionNonce": 1254846477, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -114.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-16", + "type": "arrow", + "x": 1110, + "y": 955, + "width": 10, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aF", + "roundness": null, + "seed": 3201, + "version": 2, + "versionNonce": 770515779, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -9.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-17", + "type": "arrow", + "x": 1225, + "y": 955, + "width": 125, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aG", + "roundness": null, + "seed": 3338, + "version": 2, + "versionNonce": 1297868397, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -124.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-18", + "type": "arrow", + "x": 660, + "y": 784, + "width": 120, + "height": 130, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.8, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aH", + "roundness": null, + "seed": 3475, + "version": 2, + "versionNonce": 864928483, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 119.5, + -129.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-19", + "type": "arrow", + "x": 880, + "y": 784, + "width": 100, + "height": 130, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.8, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aI", + "roundness": null, + "seed": 3612, + "version": 2, + "versionNonce": 1733202125, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -99.5, + -129.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-20", + "type": "arrow", + "x": 1100, + "y": 784, + "width": 120, + "height": 130, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.8, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aJ", + "roundness": null, + "seed": 3749, + "version": 2, + "versionNonce": 1731817091, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -119.5, + -129.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-21", + "type": "arrow", + "x": 780, + "y": 587, + "width": 65, + "height": 97, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3.2, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aK", + "roundness": null, + "seed": 3886, + "version": 2, + "versionNonce": 1446833965, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 64.5, + -96.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-22", + "type": "arrow", + "x": 980, + "y": 587, + "width": 65, + "height": 97, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3.2, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aL", + "roundness": null, + "seed": 4023, + "version": 2, + "versionNonce": 1806607907, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -64.5, + -96.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-23", + "type": "rectangle", + "x": 825, + "y": 420, + "width": 110, + "height": 60, + "angle": 0, + "strokeColor": "#825513", + "backgroundColor": "#fff0b8", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aM", + "roundness": { + "type": 3 + }, + "seed": 4160, + "version": 2, + "versionNonce": 1754300813, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "a_sJxmy3TtHVebFD9fyBd" + } + ], + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-24", + "type": "rectangle", + "x": 725, + "y": 592, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aN", + "roundness": { + "type": 3 + }, + "seed": 4297, + "version": 2, + "versionNonce": 131852739, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-25", + "type": "rectangle", + "x": 925, + "y": 592, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aO", + "roundness": { + "type": 3 + }, + "seed": 4434, + "version": 2, + "versionNonce": 1669515245, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-26", + "type": "rectangle", + "x": 605, + "y": 790, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aP", + "roundness": { + "type": 3 + }, + "seed": 4571, + "version": 2, + "versionNonce": 551532899, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-27", + "type": "rectangle", + "x": 825, + "y": 790, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aQ", + "roundness": { + "type": 3 + }, + "seed": 4708, + "version": 2, + "versionNonce": 689783373, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-28", + "type": "rectangle", + "x": 1045, + "y": 790, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aR", + "roundness": { + "type": 3 + }, + "seed": 4845, + "version": 2, + "versionNonce": 1946719491, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-29", + "type": "ellipse", + "x": 505, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aS", + "roundness": null, + "seed": 4982, + "version": 2, + "versionNonce": 507080877, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-30", + "type": "ellipse", + "x": 528, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aT", + "roundness": null, + "seed": 5119, + "version": 2, + "versionNonce": 282393763, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-31", + "type": "line", + "x": 520, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aU", + "roundness": { + "type": 2 + }, + "seed": 5256, + "version": 2, + "versionNonce": 1350619917, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-32", + "type": "ellipse", + "x": 620, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aV", + "roundness": null, + "seed": 5393, + "version": 2, + "versionNonce": 317943875, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-33", + "type": "ellipse", + "x": 643, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aW", + "roundness": null, + "seed": 5530, + "version": 2, + "versionNonce": 1550641517, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-34", + "type": "line", + "x": 635, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aX", + "roundness": { + "type": 2 + }, + "seed": 5667, + "version": 2, + "versionNonce": 474116067, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-35", + "type": "ellipse", + "x": 735, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aY", + "roundness": null, + "seed": 5804, + "version": 2, + "versionNonce": 323433421, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-36", + "type": "ellipse", + "x": 758, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aZ", + "roundness": null, + "seed": 5941, + "version": 2, + "versionNonce": 248544131, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-37", + "type": "line", + "x": 750, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aa", + "roundness": { + "type": 2 + }, + "seed": 6078, + "version": 2, + "versionNonce": 1630089773, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-38", + "type": "ellipse", + "x": 850, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ab", + "roundness": null, + "seed": 6215, + "version": 2, + "versionNonce": 115086115, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-39", + "type": "ellipse", + "x": 873, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ac", + "roundness": null, + "seed": 6352, + "version": 2, + "versionNonce": 1929143437, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-40", + "type": "line", + "x": 865, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ad", + "roundness": { + "type": 2 + }, + "seed": 6489, + "version": 2, + "versionNonce": 349419203, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-41", + "type": "ellipse", + "x": 965, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ae", + "roundness": null, + "seed": 6626, + "version": 2, + "versionNonce": 477776621, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-42", + "type": "ellipse", + "x": 988, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "af", + "roundness": null, + "seed": 6763, + "version": 2, + "versionNonce": 928376419, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-43", + "type": "line", + "x": 980, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ag", + "roundness": { + "type": 2 + }, + "seed": 6900, + "version": 2, + "versionNonce": 2116838733, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-44", + "type": "ellipse", + "x": 1080, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ah", + "roundness": null, + "seed": 7037, + "version": 2, + "versionNonce": 355541507, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-45", + "type": "ellipse", + "x": 1103, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ai", + "roundness": null, + "seed": 7174, + "version": 2, + "versionNonce": 1802253229, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-46", + "type": "line", + "x": 1095, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aj", + "roundness": { + "type": 2 + }, + "seed": 7311, + "version": 2, + "versionNonce": 2003036579, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-47", + "type": "ellipse", + "x": 1195, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ak", + "roundness": null, + "seed": 7448, + "version": 2, + "versionNonce": 274937357, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-48", + "type": "ellipse", + "x": 1218, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "al", + "roundness": null, + "seed": 7585, + "version": 2, + "versionNonce": 52215107, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-49", + "type": "line", + "x": 1210, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "am", + "roundness": { + "type": 2 + }, + "seed": 7722, + "version": 2, + "versionNonce": 1477110893, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "workers-label", + "type": "text", + "x": 741.0240325927734, + "y": 1048, + "width": 277.9519348144531, + "height": 40, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "an", + "roundness": null, + "seed": 7859, + "version": 2, + "versionNonce": 867835107, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "text": "Front line workers", + "fontSize": 32, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Front line workers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-value-51", + "type": "line", + "x": 1270, + "y": 550, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ao", + "roundness": null, + "seed": 7996, + "version": 2, + "versionNonce": 304928461, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 30, + 0 + ], + [ + 30, + 315 + ], + [ + 0, + 315 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-value-52", + "type": "text", + "x": 1330, + "y": 678, + "width": 286.49591064453125, + "height": 40, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ap", + "roundness": null, + "seed": 8133, + "version": 2, + "versionNonce": 348817539, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "text": "Bureaucracy layer", + "fontSize": 32, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Bureaucracy layer", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-value-53", + "type": "text", + "x": 1333, + "y": 720, + "width": 235.03689575195312, + "height": 57.5, + "angle": 0, + "strokeColor": "#807194", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aq", + "roundness": null, + "seed": 8270, + "version": 2, + "versionNonce": 1499624749, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "text": "needed to enact the\nwill of the CEO", + "fontSize": 23, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "needed to enact the\nwill of the CEO", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-value-54", + "type": "rectangle", + "x": 510, + "y": 1230, + "width": 300, + "height": 86, + "angle": 0, + "strokeColor": "#805d48", + "backgroundColor": "#f9eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ar", + "roundness": { + "type": 3 + }, + "seed": 8407, + "version": 2, + "versionNonce": 1007452195, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "8kffh-1JrE6QAiKMLkNyI" + } + ], + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-55", + "type": "rectangle", + "x": 950, + "y": 1230, + "width": 300, + "height": 86, + "angle": 0, + "strokeColor": "#805d48", + "backgroundColor": "#f9eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "as", + "roundness": { + "type": 3 + }, + "seed": 8544, + "version": 2, + "versionNonce": 957695885, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "YbzQtw585uAp1TOxTp92e" + } + ], + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-56", + "type": "arrow", + "x": 660, + "y": 1215, + "width": 0, + "height": 125, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "at", + "roundness": null, + "seed": 8681, + "version": 2, + "versionNonce": 57574339, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + -0.5 + ], + [ + 0, + -124.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-57", + "type": "arrow", + "x": 1100, + "y": 1215, + "width": 0, + "height": 125, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "au", + "roundness": null, + "seed": 8818, + "version": 2, + "versionNonce": 327077357, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + -0.5 + ], + [ + 0, + -124.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-58", + "type": "text", + "x": 690, + "y": 1148, + "width": 61.6319580078125, + "height": 30, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "av", + "roundness": null, + "seed": 8955, + "version": 2, + "versionNonce": 51319651, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "text": "value", + "fontSize": 24, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "value", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-value-59", + "type": "text", + "x": 1130, + "y": 1148, + "width": 61.6319580078125, + "height": 30, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aw", + "roundness": null, + "seed": 9092, + "version": 2, + "versionNonce": 1202227277, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "text": "value", + "fontSize": 24, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "value", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-value-60", + "type": "rectangle", + "x": 710, + "y": 158, + "width": 340, + "height": 88, + "angle": 0, + "strokeColor": "#825513", + "backgroundColor": "#fff0b8", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ax", + "roundness": { + "type": 3 + }, + "seed": 9229, + "version": 2, + "versionNonce": 1262268163, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "KQ2tjSwRxhpBnibwjIWSv" + } + ], + "updated": 1792730060423, + "link": null, + "locked": false + }, + { + "id": "corporate-value-61", + "type": "arrow", + "x": 880, + "y": 407, + "width": 0, + "height": 149, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ay", + "roundness": null, + "seed": 9366, + "version": 2, + "versionNonce": 392951469, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "points": [ + [ + 0, + -0.5 + ], + [ + 0, + -148.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-value-62", + "type": "text", + "x": 918, + "y": 276, + "width": 92.11993408203125, + "height": 35, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "az", + "roundness": null, + "seed": 9503, + "version": 2, + "versionNonce": 1584780963, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060423, + "link": null, + "locked": false, + "text": "profits", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "profits", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "a_sJxmy3TtHVebFD9fyBd", + "type": "text", + "x": 849.3400115966797, + "y": 431.25, + "width": 61.319976806640625, + "height": 37.5, + "angle": 0, + "strokeColor": "#825513", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b00", + "roundness": null, + "seed": 1299355917, + "version": 3, + "versionNonce": 2111515277, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060425, + "link": null, + "locked": false, + "text": "CEO", + "fontSize": 30, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-value-23", + "originalText": "CEO", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8kffh-1JrE6QAiKMLkNyI", + "type": "text", + "x": 581.8400268554688, + "y": 1253, + "width": 156.3199462890625, + "height": 40, + "angle": 0, + "strokeColor": "#805d48", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": null, + "seed": 590737261, + "version": 3, + "versionNonce": 1085034691, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060425, + "link": null, + "locked": false, + "text": "customers", + "fontSize": 32, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-value-54", + "originalText": "customers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YbzQtw585uAp1TOxTp92e", + "type": "text", + "x": 1034.416030883789, + "y": 1253, + "width": 131.16793823242188, + "height": 40, + "angle": 0, + "strokeColor": "#805d48", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 1728018893, + "version": 3, + "versionNonce": 730878189, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060425, + "link": null, + "locked": false, + "text": "suppliers", + "fontSize": 32, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-value-55", + "originalText": "suppliers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "KQ2tjSwRxhpBnibwjIWSv", + "type": "text", + "x": 775.5180435180664, + "y": 180.75, + "width": 208.9639129638672, + "height": 42.5, + "angle": 0, + "strokeColor": "#825513", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b03", + "roundness": null, + "seed": 1642641453, + "version": 3, + "versionNonce": 1359691875, + "isDeleted": false, + "boundElements": null, + "updated": 1792730060425, + "link": null, + "locked": false, + "text": "Shareholders", + "fontSize": 34, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-value-60", + "originalText": "Shareholders", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "viewBackgroundColor": "#fffdf8", + "exportBackground": true, + "exportWithDarkMode": false, + "currentItemFontFamily": 1, + "gridSize": null + }, + "files": {} +} diff --git a/src/assets/corporate_value_funnel.png b/src/assets/corporate_value_funnel.png new file mode 100644 index 00000000..ec40bbbe Binary files /dev/null and b/src/assets/corporate_value_funnel.png differ diff --git a/src/assets/corporate_value_funnel_siphoning.excalidraw b/src/assets/corporate_value_funnel_siphoning.excalidraw new file mode 100644 index 00000000..4973b068 --- /dev/null +++ b/src/assets/corporate_value_funnel_siphoning.excalidraw @@ -0,0 +1,3631 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "corporate-siphoning-1", + "type": "rectangle", + "x": 0, + "y": 0, + "width": 1760, + "height": 1400, + "angle": 0, + "strokeColor": "#fffdf8", + "backgroundColor": "#fffdf8", + "fillStyle": "solid", + "strokeWidth": 0, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0", + "roundness": null, + "seed": 1146, + "version": 2, + "versionNonce": 65694629, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": true + }, + { + "id": "title", + "type": "text", + "x": 410.39813232421875, + "y": 48, + "width": 939.2037353515625, + "height": 52.5, + "angle": 0, + "strokeColor": "#263238", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 1283, + "version": 2, + "versionNonce": 1459572011, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "the corporation as a value extraction funnel", + "fontSize": 42, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "the corporation as a value extraction funnel", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "subtitle", + "type": "text", + "x": 634.8376159667969, + "y": 108, + "width": 490.32476806640625, + "height": 31.25, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": null, + "seed": 1420, + "version": 2, + "versionNonce": 357019397, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "individuals siphon off some of the value", + "fontSize": 25, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "individuals siphon off some of the value", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-siphoning-4", + "type": "line", + "x": 880, + "y": 330, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "#fff7dc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a3", + "roundness": null, + "seed": 1557, + "version": 2, + "versionNonce": 127037387, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 109.09090909090912, + 175 + ], + [ + -109.09090909090912, + 175 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-5", + "type": "line", + "x": 770.9090909090909, + "y": 505, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "#f3eefb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4", + "roundness": null, + "seed": 1694, + "version": 2, + "versionNonce": 1155892837, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 218.18181818181824, + 0 + ], + [ + 336.62337662337666, + 190 + ], + [ + -118.44155844155841, + 190 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-6", + "type": "line", + "x": 652.4675324675325, + "y": 695, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "#ede6f7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": null, + "seed": 1831, + "version": 2, + "versionNonce": 182992491, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 455.06493506493507, + 0 + ], + [ + 582.8571428571429, + 205 + ], + [ + -127.79220779220782, + 205 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-7", + "type": "line", + "x": 524.6753246753246, + "y": 900, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "#e7f5ee", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6", + "roundness": null, + "seed": 1968, + "version": 2, + "versionNonce": 630288837, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 710.6493506493507, + 0 + ], + [ + 835.3246753246754, + 200 + ], + [ + -124.67532467532465, + 200 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-8", + "type": "line", + "x": 880, + "y": 330, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#93958d", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.3, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7", + "roundness": null, + "seed": 2105, + "version": 2, + "versionNonce": 1271609611, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 480, + 770 + ], + [ + -480, + 770 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-9", + "type": "line", + "x": 770.9090909090909, + "y": 505, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#b7b7ac", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.3, + "strokeStyle": "solid", + "roughness": 0.6, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a8", + "roundness": null, + "seed": 2242, + "version": 2, + "versionNonce": 342421797, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 218.18181818181824, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-10", + "type": "line", + "x": 652.4675324675325, + "y": 695, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#b7b7ac", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.3, + "strokeStyle": "solid", + "roughness": 0.6, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a9", + "roundness": null, + "seed": 2379, + "version": 2, + "versionNonce": 2008407979, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 455.06493506493507, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-11", + "type": "line", + "x": 524.6753246753246, + "y": 900, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#b7b7ac", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.3, + "strokeStyle": "solid", + "roughness": 0.6, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aA", + "roundness": null, + "seed": 2516, + "version": 2, + "versionNonce": 1859748997, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 710.6493506493507, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-12", + "type": "arrow", + "x": 535, + "y": 955, + "width": 125, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aB", + "roundness": null, + "seed": 2653, + "version": 2, + "versionNonce": 684896843, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 124.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-13", + "type": "arrow", + "x": 650, + "y": 955, + "width": 10, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aC", + "roundness": null, + "seed": 2790, + "version": 2, + "versionNonce": 144747493, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 9.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-14", + "type": "arrow", + "x": 765, + "y": 955, + "width": 115, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aD", + "roundness": null, + "seed": 2927, + "version": 2, + "versionNonce": 1341927659, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 114.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-15", + "type": "arrow", + "x": 880, + "y": 955, + "width": 0, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aE", + "roundness": null, + "seed": 3064, + "version": 2, + "versionNonce": 1640752965, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + -0.5 + ], + [ + 0, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-16", + "type": "arrow", + "x": 995, + "y": 955, + "width": 115, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aF", + "roundness": null, + "seed": 3201, + "version": 2, + "versionNonce": 1589435275, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -114.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-17", + "type": "arrow", + "x": 1110, + "y": 955, + "width": 10, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aG", + "roundness": null, + "seed": 3338, + "version": 2, + "versionNonce": 481867429, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -9.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-18", + "type": "arrow", + "x": 1225, + "y": 955, + "width": 125, + "height": 103, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aH", + "roundness": null, + "seed": 3475, + "version": 2, + "versionNonce": 827273771, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -124.5, + -102.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-19", + "type": "arrow", + "x": 660, + "y": 784, + "width": 120, + "height": 130, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.8, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aI", + "roundness": null, + "seed": 3612, + "version": 2, + "versionNonce": 873765381, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 119.5, + -129.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-20", + "type": "arrow", + "x": 880, + "y": 784, + "width": 100, + "height": 130, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.8, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aJ", + "roundness": null, + "seed": 3749, + "version": 2, + "versionNonce": 949859531, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -99.5, + -129.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-21", + "type": "arrow", + "x": 1100, + "y": 784, + "width": 120, + "height": 130, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.8, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aK", + "roundness": null, + "seed": 3886, + "version": 2, + "versionNonce": 1893536101, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -119.5, + -129.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-22", + "type": "arrow", + "x": 780, + "y": 587, + "width": 65, + "height": 97, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aL", + "roundness": null, + "seed": 4023, + "version": 2, + "versionNonce": 1682105195, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + -0.5 + ], + [ + 64.5, + -96.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-23", + "type": "arrow", + "x": 980, + "y": 587, + "width": 65, + "height": 97, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2.5, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aM", + "roundness": null, + "seed": 4160, + "version": 2, + "versionNonce": 543136965, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + -0.5 + ], + [ + -64.5, + -96.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-24", + "type": "rectangle", + "x": 825, + "y": 420, + "width": 110, + "height": 60, + "angle": 0, + "strokeColor": "#825513", + "backgroundColor": "#fff0b8", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aN", + "roundness": { + "type": 3 + }, + "seed": 4297, + "version": 2, + "versionNonce": 1284062731, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "CBR4ylMzE_U0aPIbwYwB_" + } + ], + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-25", + "type": "rectangle", + "x": 725, + "y": 592, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aO", + "roundness": { + "type": 3 + }, + "seed": 4434, + "version": 2, + "versionNonce": 171555877, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-26", + "type": "rectangle", + "x": 925, + "y": 592, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aP", + "roundness": { + "type": 3 + }, + "seed": 4571, + "version": 2, + "versionNonce": 476791979, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-27", + "type": "rectangle", + "x": 605, + "y": 790, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aQ", + "roundness": { + "type": 3 + }, + "seed": 4708, + "version": 2, + "versionNonce": 643362693, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-28", + "type": "rectangle", + "x": 825, + "y": 790, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aR", + "roundness": { + "type": 3 + }, + "seed": 4845, + "version": 2, + "versionNonce": 999520075, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-29", + "type": "rectangle", + "x": 1045, + "y": 790, + "width": 110, + "height": 54, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "#e0d6f4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aS", + "roundness": { + "type": 3 + }, + "seed": 4982, + "version": 2, + "versionNonce": 318420709, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-30", + "type": "ellipse", + "x": 773.5, + "y": 602, + "width": 13, + "height": 13, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aT", + "roundness": null, + "seed": 5119, + "version": 2, + "versionNonce": 945575403, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-31", + "type": "line", + "x": 766, + "y": 635, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aU", + "roundness": { + "type": 2 + }, + "seed": 5256, + "version": 2, + "versionNonce": 1252823621, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -16 + ], + [ + 22, + -16 + ], + [ + 28, + -10 + ], + [ + 28, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-32", + "type": "ellipse", + "x": 973.5, + "y": 602, + "width": 13, + "height": 13, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aV", + "roundness": null, + "seed": 5393, + "version": 2, + "versionNonce": 1909481611, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-33", + "type": "line", + "x": 966, + "y": 635, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aW", + "roundness": { + "type": 2 + }, + "seed": 5530, + "version": 2, + "versionNonce": 441188773, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -16 + ], + [ + 22, + -16 + ], + [ + 28, + -10 + ], + [ + 28, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-34", + "type": "ellipse", + "x": 653.5, + "y": 800, + "width": 13, + "height": 13, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aX", + "roundness": null, + "seed": 5667, + "version": 2, + "versionNonce": 27924267, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-35", + "type": "line", + "x": 646, + "y": 833, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aY", + "roundness": { + "type": 2 + }, + "seed": 5804, + "version": 2, + "versionNonce": 1460045061, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -16 + ], + [ + 22, + -16 + ], + [ + 28, + -10 + ], + [ + 28, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-36", + "type": "ellipse", + "x": 873.5, + "y": 800, + "width": 13, + "height": 13, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aZ", + "roundness": null, + "seed": 5941, + "version": 2, + "versionNonce": 1716779467, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-37", + "type": "line", + "x": 866, + "y": 833, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aa", + "roundness": { + "type": 2 + }, + "seed": 6078, + "version": 2, + "versionNonce": 1415158885, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -16 + ], + [ + 22, + -16 + ], + [ + 28, + -10 + ], + [ + 28, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-38", + "type": "ellipse", + "x": 1093.5, + "y": 800, + "width": 13, + "height": 13, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ab", + "roundness": null, + "seed": 6215, + "version": 2, + "versionNonce": 1827178603, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-39", + "type": "line", + "x": 1086, + "y": 833, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ac", + "roundness": { + "type": 2 + }, + "seed": 6352, + "version": 2, + "versionNonce": 437438405, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -16 + ], + [ + 22, + -16 + ], + [ + 28, + -10 + ], + [ + 28, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-40", + "type": "arrow", + "x": 719, + "y": 619, + "width": 324, + "height": 0, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ad", + "roundness": null, + "seed": 6489, + "version": 2, + "versionNonce": 1530020619, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + 0 + ], + [ + -323.5, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-41", + "type": "ellipse", + "x": 318, + "y": 587, + "width": 64, + "height": 64, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "#fce5ef", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ae", + "roundness": null, + "seed": 6626, + "version": 2, + "versionNonce": 1515161381, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WCB6JjB2kwNQJkWf1fSRc" + } + ], + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-42", + "type": "arrow", + "x": 1041, + "y": 619, + "width": 324, + "height": 0, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "af", + "roundness": null, + "seed": 6763, + "version": 2, + "versionNonce": 1504422315, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + 0 + ], + [ + 323.5, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-43", + "type": "ellipse", + "x": 1378, + "y": 587, + "width": 64, + "height": 64, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "#fce5ef", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ag", + "roundness": null, + "seed": 6900, + "version": 2, + "versionNonce": 662526597, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "kNY3mUEozaOR0HWKEzBWW" + } + ], + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-44", + "type": "arrow", + "x": 599, + "y": 817, + "width": 204, + "height": 0, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ah", + "roundness": null, + "seed": 7037, + "version": 2, + "versionNonce": 494877771, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + -0.5, + 0 + ], + [ + -203.5, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-45", + "type": "ellipse", + "x": 318, + "y": 785, + "width": 64, + "height": 64, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "#fce5ef", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ai", + "roundness": null, + "seed": 7174, + "version": 2, + "versionNonce": 1784267237, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "B_D1QpzO8jm0vtih5HI_S" + } + ], + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-46", + "type": "arrow", + "x": 1161, + "y": 817, + "width": 204, + "height": 0, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aj", + "roundness": null, + "seed": 7311, + "version": 2, + "versionNonce": 1384610539, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0.5, + 0 + ], + [ + 203.5, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-47", + "type": "ellipse", + "x": 1378, + "y": 785, + "width": 64, + "height": 64, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "#fce5ef", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ak", + "roundness": null, + "seed": 7448, + "version": 2, + "versionNonce": 401751365, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "G4BHlQWxMiY7WyIVuPdY_" + } + ], + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-48", + "type": "text", + "x": 130, + "y": 699, + "width": 242.45989990234375, + "height": 33.75, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "al", + "roundness": null, + "seed": 7585, + "version": 2, + "versionNonce": 1162798475, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "value siphoned off", + "fontSize": 27, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "value siphoned off", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-siphoning-49", + "type": "text", + "x": 130, + "y": 737, + "width": 157.5749053955078, + "height": 31.25, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "am", + "roundness": null, + "seed": 7722, + "version": 2, + "versionNonce": 665078949, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "by individuals", + "fontSize": 25, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "by individuals", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-siphoning-50", + "type": "ellipse", + "x": 505, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "an", + "roundness": null, + "seed": 7859, + "version": 2, + "versionNonce": 1292893227, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-51", + "type": "ellipse", + "x": 528, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ao", + "roundness": null, + "seed": 7996, + "version": 2, + "versionNonce": 1226665989, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-52", + "type": "line", + "x": 520, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ap", + "roundness": { + "type": 2 + }, + "seed": 8133, + "version": 2, + "versionNonce": 1974812363, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-53", + "type": "ellipse", + "x": 620, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aq", + "roundness": null, + "seed": 8270, + "version": 2, + "versionNonce": 1515923301, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-54", + "type": "ellipse", + "x": 643, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ar", + "roundness": null, + "seed": 8407, + "version": 2, + "versionNonce": 1775840619, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-55", + "type": "line", + "x": 635, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "as", + "roundness": { + "type": 2 + }, + "seed": 8544, + "version": 2, + "versionNonce": 497742533, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-56", + "type": "ellipse", + "x": 735, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "at", + "roundness": null, + "seed": 8681, + "version": 2, + "versionNonce": 482756619, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-57", + "type": "ellipse", + "x": 758, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "au", + "roundness": null, + "seed": 8818, + "version": 2, + "versionNonce": 799691301, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-58", + "type": "line", + "x": 750, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "av", + "roundness": { + "type": 2 + }, + "seed": 8955, + "version": 2, + "versionNonce": 880217771, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-59", + "type": "ellipse", + "x": 850, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aw", + "roundness": null, + "seed": 9092, + "version": 2, + "versionNonce": 1028048261, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-60", + "type": "ellipse", + "x": 873, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ax", + "roundness": null, + "seed": 9229, + "version": 2, + "versionNonce": 865468747, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-61", + "type": "line", + "x": 865, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ay", + "roundness": { + "type": 2 + }, + "seed": 9366, + "version": 2, + "versionNonce": 2042481893, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-62", + "type": "ellipse", + "x": 965, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "az", + "roundness": null, + "seed": 9503, + "version": 2, + "versionNonce": 1669177323, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-63", + "type": "ellipse", + "x": 988, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b00", + "roundness": null, + "seed": 9640, + "version": 2, + "versionNonce": 1419569221, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-64", + "type": "line", + "x": 980, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": { + "type": 2 + }, + "seed": 9777, + "version": 2, + "versionNonce": 2117626507, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-65", + "type": "ellipse", + "x": 1080, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 9914, + "version": 2, + "versionNonce": 1874958245, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-66", + "type": "ellipse", + "x": 1103, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b03", + "roundness": null, + "seed": 10051, + "version": 2, + "versionNonce": 411099435, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-67", + "type": "line", + "x": 1095, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b04", + "roundness": { + "type": 2 + }, + "seed": 10188, + "version": 2, + "versionNonce": 1431919365, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "corporate-siphoning-68", + "type": "ellipse", + "x": 1195, + "y": 960, + "width": 60, + "height": 60, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "#d4eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b05", + "roundness": null, + "seed": 10325, + "version": 2, + "versionNonce": 1270973387, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-69", + "type": "ellipse", + "x": 1218, + "y": 970, + "width": 14, + "height": 14, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.6, + "strokeStyle": "solid", + "roughness": 0.55, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b06", + "roundness": null, + "seed": 10462, + "version": 2, + "versionNonce": 1843507813, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-70", + "type": "line", + "x": 1210, + "y": 1007, + "width": 100, + "height": 0, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1.8, + "strokeStyle": "solid", + "roughness": 0.5, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b07", + "roundness": { + "type": 2 + }, + "seed": 10599, + "version": 2, + "versionNonce": 538235499, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -10 + ], + [ + 6, + -17 + ], + [ + 24, + -17 + ], + [ + 30, + -10 + ], + [ + 30, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "workers-label", + "type": "text", + "x": 741.0240325927734, + "y": 1048, + "width": 277.9519348144531, + "height": 40, + "angle": 0, + "strokeColor": "#276b5a", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b08", + "roundness": null, + "seed": 10736, + "version": 2, + "versionNonce": 908598725, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "Front line workers", + "fontSize": 32, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Front line workers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-siphoning-72", + "type": "text", + "x": 1330, + "y": 670, + "width": 286.49591064453125, + "height": 40, + "angle": 0, + "strokeColor": "#605080", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b09", + "roundness": null, + "seed": 10873, + "version": 2, + "versionNonce": 910511371, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "Bureaucracy layer", + "fontSize": 32, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Bureaucracy layer", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-siphoning-73", + "type": "text", + "x": 1333, + "y": 712, + "width": 235.03689575195312, + "height": 57.5, + "angle": 0, + "strokeColor": "#807194", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0A", + "roundness": null, + "seed": 11010, + "version": 2, + "versionNonce": 894049573, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "needed to enact the\nwill of the CEO", + "fontSize": 23, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "needed to enact the\nwill of the CEO", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-siphoning-74", + "type": "rectangle", + "x": 510, + "y": 1230, + "width": 300, + "height": 86, + "angle": 0, + "strokeColor": "#805d48", + "backgroundColor": "#f9eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0B", + "roundness": { + "type": 3 + }, + "seed": 11147, + "version": 2, + "versionNonce": 835548075, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "KHX2SBs_TR1VYbtn-Swc-" + } + ], + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-75", + "type": "rectangle", + "x": 950, + "y": 1230, + "width": 300, + "height": 86, + "angle": 0, + "strokeColor": "#805d48", + "backgroundColor": "#f9eee6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0C", + "roundness": { + "type": 3 + }, + "seed": 11284, + "version": 2, + "versionNonce": 850735237, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "OgAakDapTEs9dc32BnCRy" + } + ], + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-76", + "type": "arrow", + "x": 660, + "y": 1215, + "width": 0, + "height": 125, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0D", + "roundness": null, + "seed": 11421, + "version": 2, + "versionNonce": 1658308171, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + -0.5 + ], + [ + 0, + -124.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-77", + "type": "arrow", + "x": 1100, + "y": 1215, + "width": 0, + "height": 125, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0E", + "roundness": null, + "seed": 11558, + "version": 2, + "versionNonce": 740743141, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + -0.5 + ], + [ + 0, + -124.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-78", + "type": "text", + "x": 690, + "y": 1148, + "width": 61.6319580078125, + "height": 30, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0F", + "roundness": null, + "seed": 11695, + "version": 2, + "versionNonce": 809420011, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "value", + "fontSize": 24, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "value", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-siphoning-79", + "type": "text", + "x": 1130, + "y": 1148, + "width": 61.6319580078125, + "height": 30, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0G", + "roundness": null, + "seed": 11832, + "version": 2, + "versionNonce": 195859269, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "value", + "fontSize": 24, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "value", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "corporate-siphoning-80", + "type": "rectangle", + "x": 710, + "y": 158, + "width": 340, + "height": 88, + "angle": 0, + "strokeColor": "#825513", + "backgroundColor": "#fff0b8", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": { + "type": 3 + }, + "seed": 11969, + "version": 2, + "versionNonce": 1099755403, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "AaFDYlOstXhonf0YX5l5e" + } + ], + "updated": 1792730748630, + "link": null, + "locked": false + }, + { + "id": "corporate-siphoning-81", + "type": "arrow", + "x": 880, + "y": 407, + "width": 0, + "height": 149, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 3, + "strokeStyle": "solid", + "roughness": 0.7, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0I", + "roundness": null, + "seed": 12106, + "version": 2, + "versionNonce": 497279653, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "points": [ + [ + 0, + -0.5 + ], + [ + 0, + -148.5 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "corporate-siphoning-82", + "type": "text", + "x": 918, + "y": 276, + "width": 222.3198699951172, + "height": 35, + "angle": 0, + "strokeColor": "#ba6a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0.8, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0J", + "roundness": null, + "seed": 12243, + "version": 2, + "versionNonce": 1761396267, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748630, + "link": null, + "locked": false, + "text": "remaining profits", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "remaining profits", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "CBR4ylMzE_U0aPIbwYwB_", + "type": "text", + "x": 849.3400115966797, + "y": 431.25, + "width": 61.319976806640625, + "height": 37.5, + "angle": 0, + "strokeColor": "#825513", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0K", + "roundness": null, + "seed": 1186612741, + "version": 3, + "versionNonce": 1749037317, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748632, + "link": null, + "locked": false, + "text": "CEO", + "fontSize": 30, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-siphoning-24", + "originalText": "CEO", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "WCB6JjB2kwNQJkWf1fSRc", + "type": "text", + "x": 338.63058623689375, + "y": 601.3725830020305, + "width": 22.483993530273438, + "height": 35, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0L", + "roundness": null, + "seed": 2045590885, + "version": 3, + "versionNonce": 1608191435, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748632, + "link": null, + "locked": false, + "text": "$", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-siphoning-41", + "originalText": "$", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "kNY3mUEozaOR0HWKEzBWW", + "type": "text", + "x": 1398.6305862368938, + "y": 601.3725830020305, + "width": 22.483993530273438, + "height": 35, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0M", + "roundness": null, + "seed": 1854556357, + "version": 3, + "versionNonce": 1769850981, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748632, + "link": null, + "locked": false, + "text": "$", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-siphoning-43", + "originalText": "$", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "B_D1QpzO8jm0vtih5HI_S", + "type": "text", + "x": 338.63058623689375, + "y": 799.3725830020305, + "width": 22.483993530273438, + "height": 35, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0N", + "roundness": null, + "seed": 372172837, + "version": 3, + "versionNonce": 1282219115, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748632, + "link": null, + "locked": false, + "text": "$", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-siphoning-45", + "originalText": "$", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "G4BHlQWxMiY7WyIVuPdY_", + "type": "text", + "x": 1398.6305862368938, + "y": 799.3725830020305, + "width": 22.483993530273438, + "height": 35, + "angle": 0, + "strokeColor": "#a23b67", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0O", + "roundness": null, + "seed": 1388878725, + "version": 3, + "versionNonce": 1372681157, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748632, + "link": null, + "locked": false, + "text": "$", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-siphoning-47", + "originalText": "$", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "KHX2SBs_TR1VYbtn-Swc-", + "type": "text", + "x": 581.8400268554688, + "y": 1253, + "width": 156.3199462890625, + "height": 40, + "angle": 0, + "strokeColor": "#805d48", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0P", + "roundness": null, + "seed": 1821696741, + "version": 3, + "versionNonce": 84170507, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748632, + "link": null, + "locked": false, + "text": "customers", + "fontSize": 32, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-siphoning-74", + "originalText": "customers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "OgAakDapTEs9dc32BnCRy", + "type": "text", + "x": 1034.416030883789, + "y": 1253, + "width": 131.16793823242188, + "height": 40, + "angle": 0, + "strokeColor": "#805d48", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Q", + "roundness": null, + "seed": 1210138181, + "version": 3, + "versionNonce": 2102965029, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748632, + "link": null, + "locked": false, + "text": "suppliers", + "fontSize": 32, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-siphoning-75", + "originalText": "suppliers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "AaFDYlOstXhonf0YX5l5e", + "type": "text", + "x": 775.5180435180664, + "y": 180.75, + "width": 208.9639129638672, + "height": 42.5, + "angle": 0, + "strokeColor": "#825513", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0R", + "roundness": null, + "seed": 1548430757, + "version": 3, + "versionNonce": 672873899, + "isDeleted": false, + "boundElements": null, + "updated": 1792730748632, + "link": null, + "locked": false, + "text": "Shareholders", + "fontSize": 34, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "corporate-siphoning-80", + "originalText": "Shareholders", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "viewBackgroundColor": "#fffdf8", + "exportBackground": true, + "exportWithDarkMode": false, + "currentItemFontFamily": 1, + "gridSize": null + }, + "files": {} +} diff --git a/src/assets/corporate_value_funnel_siphoning.png b/src/assets/corporate_value_funnel_siphoning.png new file mode 100644 index 00000000..69c82e69 Binary files /dev/null and b/src/assets/corporate_value_funnel_siphoning.png differ diff --git a/src/assets/dystopian_future.png b/src/assets/dystopian_future.png new file mode 100644 index 00000000..62aa9911 Binary files /dev/null and b/src/assets/dystopian_future.png differ diff --git a/src/assets/information_discovery_ai.png b/src/assets/information_discovery_ai.png new file mode 100644 index 00000000..147e0266 Binary files /dev/null and b/src/assets/information_discovery_ai.png differ diff --git a/src/assets/information_discovery_c.png b/src/assets/information_discovery_c.png new file mode 100644 index 00000000..8ec49871 Binary files /dev/null and b/src/assets/information_discovery_c.png differ diff --git a/src/components/Nav/Nav.tsx b/src/components/Nav/Nav.tsx index f0c94945..7842e4f0 100644 --- a/src/components/Nav/Nav.tsx +++ b/src/components/Nav/Nav.tsx @@ -6,7 +6,7 @@ const PATHS = { "/posts": "Blog", "/about": "About", "/open-source": "Open Source", - "/ai-policy": "AI Policy", + "/ai-policy": "AI Content Policy", }; diff --git a/src/image-gen/README.md b/src/image-gen/README.md new file mode 100644 index 00000000..80ffbac7 --- /dev/null +++ b/src/image-gen/README.md @@ -0,0 +1,86 @@ +# Diagram generation + +Create editable Excalidraw diagrams with JavaScript, then export PNG assets using +Excalidraw's own renderer in headless Chrome. This tool has its own dependencies. + +## Setup + +From the repository root: + +```sh +npm ci --prefix src/image-gen +``` + +The renderer uses an installed Google Chrome, or a Playwright Chromium installation. +To download Chromium: + +```sh +cd src/image-gen +npx playwright-core install chromium +``` + +You can also set `CHROME_PATH` to a particular Chrome or Chromium executable. + +## Render the value funnel + +From the repository root: + +```sh +npm run render --prefix src/image-gen +``` + +This regenerates `src/assets/corporate_value_funnel.png` at 3520 × 2800 and +`src/assets/corporate_value_funnel.excalidraw`. Drag the latter into +[Excalidraw](https://excalidraw.com) to edit the shapes and text. +Rendering replaces both destination files. + +## Render the version with siphoning + +```sh +npm run render:siphoning --prefix src/image-gen +``` + +This uses `corporate-value-funnel-siphoning.js` and saves +`src/assets/corporate_value_funnel_siphoning.png` and the corresponding +`.excalidraw` file. Rose-colored arrows carry dollars out through the pyramid's +sides from the four outer bureaucracy nodes. The middle person has no siphoning +branch. The main flow continues to the CEO and shareholders. This version has +separate source and output files. + +## Create another diagram + +Copy `corporate-value-funnel.js` within this folder and change the labels, +coordinates, colors, and connections. Its `add`, `polygon`, `line`, `arrow`, `text`, +and `box` helpers create Excalidraw element skeletons. Set fixed `seed` values for +repeatable sketch strokes. Closed line paths provide filled pyramid bands. + +Render your module to a new destination: + +```sh +node src/image-gen/render.mjs \ + --input src/image-gen/my-diagram.js \ + --output src/assets/my_diagram.png \ + --scale 2 +``` + +Explicit input and output paths are relative to the current working directory. +The default paths work from any directory. + +Each diagram module defines `window.renderDiagram({ scale })`, an async function +returning `{ scene, png, width, height }`. The example loads the bundled Virgil font, +converts skeletons with `convertToExcalidrawElements`, centers text using measured +widths, and exports with `exportToCanvas`. Scale **both canvas dimensions** and +the drawing scale; scaling only the drawing crops the PNG. + +Use a background rectangle to fix the export bounds. Inspect the exported PNG for +clipping, overlapping labels, and arrow direction before using it in a post. +Keep the `.excalidraw` source beside the PNG so the result remains editable. + +Bundles are created in a temporary directory, served with the package's local +fonts on a temporary loopback port, and removed after export. The output uses +local JavaScript and bundled fonts; no image generation API or API key is needed. + +## References + +- [Create Excalidraw elements programmatically](https://docs.excalidraw.com/docs/@excalidraw/excalidraw/api/excalidraw-element-skeleton) +- [Excalidraw export utilities](https://docs.excalidraw.com/docs/@excalidraw/excalidraw/api/utils/export) diff --git a/src/image-gen/corporate-value-funnel-siphoning.js b/src/image-gen/corporate-value-funnel-siphoning.js new file mode 100644 index 00000000..aaf9ea35 --- /dev/null +++ b/src/image-gen/corporate-value-funnel-siphoning.js @@ -0,0 +1,206 @@ +import { convertToExcalidrawElements, exportToCanvas } from '@excalidraw/excalidraw'; + +const C = { + ink: '#263238', paper: '#fffdf8', outline: '#93958d', + flow: '#ba6a11', gold: '#fff0b8', goldInk: '#825513', + violet: '#e0d6f4', violetInk: '#605080', + teal: '#d4eee6', tealInk: '#276b5a', + siphon: '#a23b67', siphonFill: '#fce5ef', +}; +let count = 0; +const elements = []; +function add(type, x, y, props = {}) { + const id = `corporate-siphoning-${++count}`; + elements.push({ + id, type, x, y, strokeColor: C.ink, backgroundColor: 'transparent', + strokeWidth: 2, roughness: 0.8, fillStyle: 'solid', + seed: 1009 + count * 137, ...props, + }); + return id; +} +function polygon(points, fill, stroke = 'transparent', width = 1) { + const [x, y] = points[0]; + return add('line', x, y, { + points: points.map(([px, py]) => [px - x, py - y]), + backgroundColor: fill, strokeColor: stroke, strokeWidth: width, + roundness: null, + }); +} +function line(points, props = {}) { + const [x, y] = points[0]; + return add('line', x, y, { + points: points.map(([px, py]) => [px - x, py - y]), + roundness: null, ...props, + }); +} +function arrow(points, props = {}) { + const [x, y] = points[0]; + return add('arrow', x, y, { + points: points.map(([px, py]) => [px - x, py - y]), + strokeColor: C.flow, strokeWidth: 3, roughness: 0.7, + startArrowhead: null, endArrowhead: 'arrow', roundness: null, + ...props, + }); +} +function text(content, x, y, size = 28, color = C.ink, props = {}) { + return add('text', x, y, { + text: content, fontSize: size, fontFamily: 1, + strokeColor: color, textAlign: 'left', ...props, + }); +} +function box(x, y, width, height, color, fill, label, fontSize = 28) { + return add('rectangle', x, y, { + width, height, strokeColor: color, backgroundColor: fill, + roundness: { type: 3 }, + ...(label ? { label: { text: label, fontSize, fontFamily: 1, strokeColor: color } } : {}), + }); +} + +// Paper fixes the export size and provides generous whitespace. +add('rectangle', 0, 0, { + width: 1760, height: 1400, strokeColor: C.paper, + backgroundColor: C.paper, strokeWidth: 0, roughness: 0, + locked: true, +}); +text('the corporation as a value extraction funnel', 0, 48, 42, C.ink, { + id: 'title', textAlign: 'center', +}); +text('individuals siphon off some of the value', 0, 108, 25, C.siphon, { + id: 'subtitle', textAlign: 'center', +}); + +// Pyramid bands: CEO, two levels of bureaucracy, and the workers. +const leftAt = y => 880 - (y - 330) * 480 / 770; +const rightAt = y => 1760 - leftAt(y); +function band(top, bottom, fill) { + polygon([ + [leftAt(top), top], [rightAt(top), top], + [rightAt(bottom), bottom], [leftAt(bottom), bottom], + [leftAt(top), top], + ], fill); +} +band(330, 505, '#fff7dc'); +band(505, 695, '#f3eefb'); +band(695, 900, '#ede6f7'); +band(900, 1100, '#e7f5ee'); +polygon([[880, 330], [1360, 1100], [400, 1100], [880, 330]], 'transparent', C.outline, 2.3); +for (const y of [505, 695, 900]) { + line([[leftAt(y), y], [rightAt(y), y]], { + strokeColor: '#b7b7ac', strokeWidth: 1.3, roughness: 0.6, + }); +} + +// The main flow continues upward; a portion branches toward each individual. +const workers = [535, 650, 765, 880, 995, 1110, 1225]; +const workerParents = [660, 660, 880, 880, 880, 1100, 1100]; +workers.forEach((x, i) => arrow([[x, 955], [workerParents[i], 852]], { strokeWidth: 3.5 })); +arrow([[660, 784], [780, 654]], { strokeWidth: 2.8 }); +arrow([[880, 784], [780, 654]], { strokeWidth: 2.8 }); +arrow([[1100, 784], [980, 654]], { strokeWidth: 2.8 }); +arrow([[780, 587], [845, 490]], { strokeWidth: 2.5 }); +arrow([[980, 587], [915, 490]], { strokeWidth: 2.5 }); + +// The single apex node. +box(825, 420, 110, 60, C.goldInk, C.gold, 'CEO', 30); + +// Two expanding rows of bureaucracy. +for (const x of [725, 925]) box(x, 592, 110, 54, C.violetInk, C.violet); +for (const x of [605, 825, 1045]) box(x, 790, 110, 54, C.violetInk, C.violet); + +// Individuals remain inside the bureaucracy; diverted dollars leave the pyramid. +function individual(x, y) { + add('ellipse', x - 6.5, y - 17, { + width: 13, height: 13, strokeColor: C.violetInk, + strokeWidth: 1.6, roughness: 0.55, + }); + line([[x - 14, y + 16], [x - 14, y + 6], [x - 8, y], [x + 8, y], [x + 14, y + 6], [x + 14, y + 16]], { + strokeColor: C.violetInk, strokeWidth: 1.8, roughness: 0.5, + roundness: { type: 2 }, + }); +} +for (const x of [780, 980]) individual(x, 619); +for (const x of [660, 880, 1100]) individual(x, 817); + +// Four outward flows cross the pyramid boundary. The middle person has no branch. +function siphon(x, y, direction) { + const destination = direction < 0 ? 350 : 1410; + arrow([[x + direction * 61, y], [destination - direction * 45, y]], { + strokeColor: C.siphon, strokeWidth: 3, roughness: 0.55, + }); + add('ellipse', destination - 32, y - 32, { + width: 64, height: 64, strokeColor: C.siphon, + backgroundColor: C.siphonFill, strokeWidth: 1.8, + label: { text: '$', fontSize: 28, fontFamily: 1, strokeColor: C.siphon }, + }); +} +siphon(780, 619, -1); +siphon(980, 619, 1); +siphon(660, 817, -1); +siphon(1100, 817, 1); + +// Explain the outward flows between the two dollar symbols on the left. +text('value siphoned off', 130, 699, 27, C.siphon); +text('by individuals', 130, 737, 25, C.siphon); + +// People icons inside the frontline nodes. +workers.forEach(x => { + add('ellipse', x - 30, 960, { + width: 60, height: 60, strokeColor: C.tealInk, + backgroundColor: C.teal, strokeWidth: 2, + }); + add('ellipse', x - 7, 970, { + width: 14, height: 14, strokeColor: C.tealInk, + strokeWidth: 1.6, roughness: 0.55, + }); + line([[x - 15, 1007], [x - 15, 997], [x - 9, 990], [x + 9, 990], [x + 15, 997], [x + 15, 1007]], { + strokeColor: C.tealInk, strokeWidth: 1.8, roughness: 0.5, + roundness: { type: 2 }, + }); +}); +text('Front line workers', 0, 1048, 32, C.tealInk, { + id: 'workers-label', textAlign: 'center', +}); + +// Place the layer label between the outward flows on the right. +text('Bureaucracy layer', 1330, 670, 32, C.violetInk); +text('needed to enact the\nwill of the CEO', 1333, 712, 23, '#807194'); + +// Customers and suppliers feed value upward into the base from below. +box(510, 1230, 300, 86, '#805d48', '#f9eee6', 'customers', 32); +box(950, 1230, 300, 86, '#805d48', '#f9eee6', 'suppliers', 32); +arrow([[660, 1215], [660, 1090]], { strokeWidth: 4 }); +arrow([[1100, 1215], [1100, 1090]], { strokeWidth: 4 }); +text('value', 690, 1148, 24, C.flow); +text('value', 1130, 1148, 24, C.flow); + +// Ownership is outside the corporation; profits pass up through the apex. +box(710, 158, 340, 88, C.goldInk, C.gold, 'Shareholders', 34); +arrow([[880, 407], [880, 258]], { strokeWidth: 3 }); +text('remaining profits', 918, 276, 28, C.flow); + +window.renderDiagram = async ({ scale = 2 } = {}) => { + const face = new FontFace('Virgil', 'url(/fonts/Virgil/Virgil-Regular.woff2)'); + await face.load(); + document.fonts.add(face); + const converted = convertToExcalidrawElements(elements, { regenerateIds: false }); + // Center standalone labels using the actual font metrics. + for (const id of ['title', 'subtitle', 'workers-label']) { + const el = converted.find(e => e.id === id); + el.x = 880 - el.width / 2; + } + const appState = { + viewBackgroundColor: C.paper, exportBackground: true, + exportWithDarkMode: false, + currentItemFontFamily: 1, gridSize: null, + }; + const scene = { + type: 'excalidraw', version: 2, source: 'https://excalidraw.com', + elements: converted, appState, files: {}, + }; + const canvas = await exportToCanvas({ + elements: converted, appState, files: {}, exportPadding: 0, + getDimensions: (width, height) => ({ width: width * scale, height: height * scale, scale }), + }); + document.body.appendChild(canvas); + return { scene, png: canvas.toDataURL('image/png'), width: canvas.width, height: canvas.height }; +}; diff --git a/src/image-gen/corporate-value-funnel.js b/src/image-gen/corporate-value-funnel.js new file mode 100644 index 00000000..8affe58e --- /dev/null +++ b/src/image-gen/corporate-value-funnel.js @@ -0,0 +1,170 @@ +import { convertToExcalidrawElements, exportToCanvas } from '@excalidraw/excalidraw'; + +const C = { + ink: '#263238', paper: '#fffdf8', outline: '#93958d', + flow: '#ba6a11', gold: '#fff0b8', goldInk: '#825513', + violet: '#e0d6f4', violetInk: '#605080', + teal: '#d4eee6', tealInk: '#276b5a', +}; +let count = 0; +const elements = []; +function add(type, x, y, props = {}) { + const id = `corporate-value-${++count}`; + elements.push({ + id, type, x, y, strokeColor: C.ink, backgroundColor: 'transparent', + strokeWidth: 2, roughness: 0.8, fillStyle: 'solid', + seed: 1009 + count * 137, ...props, + }); + return id; +} +function polygon(points, fill, stroke = 'transparent', width = 1) { + const [x, y] = points[0]; + return add('line', x, y, { + points: points.map(([px, py]) => [px - x, py - y]), + backgroundColor: fill, strokeColor: stroke, strokeWidth: width, + roundness: null, + }); +} +function line(points, props = {}) { + const [x, y] = points[0]; + return add('line', x, y, { + points: points.map(([px, py]) => [px - x, py - y]), + roundness: null, ...props, + }); +} +function arrow(points, props = {}) { + const [x, y] = points[0]; + return add('arrow', x, y, { + points: points.map(([px, py]) => [px - x, py - y]), + strokeColor: C.flow, strokeWidth: 3, roughness: 0.7, + startArrowhead: null, endArrowhead: 'arrow', roundness: null, + ...props, + }); +} +function text(content, x, y, size = 28, color = C.ink, props = {}) { + return add('text', x, y, { + text: content, fontSize: size, fontFamily: 1, + strokeColor: color, textAlign: 'left', ...props, + }); +} +function box(x, y, width, height, color, fill, label, fontSize = 28) { + return add('rectangle', x, y, { + width, height, strokeColor: color, backgroundColor: fill, + roundness: { type: 3 }, + ...(label ? { label: { text: label, fontSize, fontFamily: 1, strokeColor: color } } : {}), + }); +} + +// Paper fixes the export size and provides generous whitespace. +add('rectangle', 0, 0, { + width: 1760, height: 1400, strokeColor: C.paper, + backgroundColor: C.paper, strokeWidth: 0, roughness: 0, + locked: true, +}); +text('the corporation as a value extraction funnel', 0, 48, 42, C.ink, { + id: 'title', textAlign: 'center', +}); + +// Pyramid bands: CEO, two levels of bureaucracy, and the workers. +const leftAt = y => 880 - (y - 330) * 480 / 770; +const rightAt = y => 1760 - leftAt(y); +function band(top, bottom, fill) { + polygon([ + [leftAt(top), top], [rightAt(top), top], + [rightAt(bottom), bottom], [leftAt(bottom), bottom], + [leftAt(top), top], + ], fill); +} +band(330, 505, '#fff7dc'); +band(505, 695, '#f3eefb'); +band(695, 900, '#ede6f7'); +band(900, 1100, '#e7f5ee'); +polygon([[880, 330], [1360, 1100], [400, 1100], [880, 330]], 'transparent', C.outline, 2.3); +for (const y of [505, 695, 900]) { + line([[leftAt(y), y], [rightAt(y), y]], { + strokeColor: '#b7b7ac', strokeWidth: 1.3, roughness: 0.6, + }); +} + +// All internal arrows point upward, carrying value toward the CEO. +const workers = [535, 650, 765, 880, 995, 1110, 1225]; +const workerParents = [660, 660, 880, 880, 880, 1100, 1100]; +workers.forEach((x, i) => arrow([[x, 955], [workerParents[i], 852]], { strokeWidth: 2.5 })); +arrow([[660, 784], [780, 654]], { strokeWidth: 2.8 }); +arrow([[880, 784], [780, 654]], { strokeWidth: 2.8 }); +arrow([[1100, 784], [980, 654]], { strokeWidth: 2.8 }); +arrow([[780, 587], [845, 490]], { strokeWidth: 3.2 }); +arrow([[980, 587], [915, 490]], { strokeWidth: 3.2 }); + +// The single apex node. +box(825, 420, 110, 60, C.goldInk, C.gold, 'CEO', 30); + +// Two expanding rows of bureaucracy. +for (const x of [725, 925]) box(x, 592, 110, 54, C.violetInk, C.violet); +for (const x of [605, 825, 1045]) box(x, 790, 110, 54, C.violetInk, C.violet); + +// People icons inside the frontline nodes. +workers.forEach(x => { + add('ellipse', x - 30, 960, { + width: 60, height: 60, strokeColor: C.tealInk, + backgroundColor: C.teal, strokeWidth: 2, + }); + add('ellipse', x - 7, 970, { + width: 14, height: 14, strokeColor: C.tealInk, + strokeWidth: 1.6, roughness: 0.55, + }); + line([[x - 15, 1007], [x - 15, 997], [x - 9, 990], [x + 9, 990], [x + 15, 997], [x + 15, 1007]], { + strokeColor: C.tealInk, strokeWidth: 1.8, roughness: 0.5, + roundness: { type: 2 }, + }); +}); +text('Front line workers', 0, 1048, 32, C.tealInk, { + id: 'workers-label', textAlign: 'center', +}); + +// A bracket labels both middle layers without crowding the hierarchy. +line([[1270, 550], [1300, 550], [1300, 865], [1270, 865]], { + strokeColor: C.violetInk, strokeWidth: 2, +}); +text('Bureaucracy layer', 1330, 678, 32, C.violetInk); +text('needed to enact the\nwill of the CEO', 1333, 720, 23, '#807194'); + +// Customers and suppliers feed value upward into the base from below. +box(510, 1230, 300, 86, '#805d48', '#f9eee6', 'customers', 32); +box(950, 1230, 300, 86, '#805d48', '#f9eee6', 'suppliers', 32); +arrow([[660, 1215], [660, 1090]], { strokeWidth: 4 }); +arrow([[1100, 1215], [1100, 1090]], { strokeWidth: 4 }); +text('value', 690, 1148, 24, C.flow); +text('value', 1130, 1148, 24, C.flow); + +// Ownership is outside the corporation; profits pass up through the apex. +box(710, 158, 340, 88, C.goldInk, C.gold, 'Shareholders', 34); +arrow([[880, 407], [880, 258]], { strokeWidth: 5 }); +text('profits', 918, 276, 28, C.flow); + +window.renderDiagram = async ({ scale = 2 } = {}) => { + const face = new FontFace('Virgil', 'url(/fonts/Virgil/Virgil-Regular.woff2)'); + await face.load(); + document.fonts.add(face); + const converted = convertToExcalidrawElements(elements, { regenerateIds: false }); + // Center standalone labels using the actual font metrics. + for (const id of ['title', 'workers-label']) { + const el = converted.find(e => e.id === id); + el.x = 880 - el.width / 2; + } + const appState = { + viewBackgroundColor: C.paper, exportBackground: true, + exportWithDarkMode: false, + currentItemFontFamily: 1, gridSize: null, + }; + const scene = { + type: 'excalidraw', version: 2, source: 'https://excalidraw.com', + elements: converted, appState, files: {}, + }; + const canvas = await exportToCanvas({ + elements: converted, appState, files: {}, exportPadding: 0, + getDimensions: (width, height) => ({ width: width * scale, height: height * scale, scale }), + }); + document.body.appendChild(canvas); + return { scene, png: canvas.toDataURL('image/png'), width: canvas.width, height: canvas.height }; +}; diff --git a/src/image-gen/package-lock.json b/src/image-gen/package-lock.json new file mode 100644 index 00000000..321c475c --- /dev/null +++ b/src/image-gen/package-lock.json @@ -0,0 +1,3456 @@ +{ + "name": "blacksheepcode-image-gen", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "blacksheepcode-image-gen", + "version": "1.0.0", + "dependencies": { + "@excalidraw/excalidraw": "0.18.1", + "esbuild": "0.28.2", + "playwright-core": "1.64.1", + "react": "18.3.1", + "react-dom": "18.3.1" + }, + "engines": { + "node": ">=20.15.0" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-2.1.0.tgz", + "integrity": "sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.8.0", + "tinyexec": "^1.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.10.tgz", + "integrity": "sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@excalidraw/excalidraw": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@excalidraw/excalidraw/-/excalidraw-0.18.1.tgz", + "integrity": "sha512-6i5Gt7IDTOH//qa0Z315Ly5iVRhjWpu2whrlQFqkuwrkKUWgRsMk0P5qdE7bpyDpai7jeLeWYkyj1eVAfni1lw==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "6.0.2", + "@excalidraw/laser-pointer": "1.3.1", + "@excalidraw/mermaid-to-excalidraw": "2.2.2", + "@excalidraw/random-username": "1.1.0", + "@radix-ui/react-popover": "1.1.6", + "@radix-ui/react-tabs": "1.0.2", + "browser-fs-access": "0.29.1", + "canvas-roundrect-polyfill": "0.0.1", + "clsx": "1.1.1", + "cross-env": "7.0.3", + "es6-promise-pool": "2.5.0", + "fractional-indexing": "3.2.0", + "fuzzy": "0.1.3", + "image-blob-reduce": "3.0.1", + "jotai": "2.11.0", + "jotai-scope": "0.7.2", + "lodash.debounce": "4.0.8", + "lodash.throttle": "4.1.1", + "nanoid": "3.3.3", + "open-color": "1.9.1", + "pako": "2.0.3", + "perfect-freehand": "1.2.0", + "pica": "7.1.1", + "png-chunk-text": "1.0.0", + "png-chunks-encode": "1.0.0", + "png-chunks-extract": "1.0.0", + "points-on-curve": "1.0.1", + "pwacompat": "2.0.17", + "roughjs": "4.6.4", + "sass": "1.51.0", + "tunnel-rat": "0.1.2" + }, + "peerDependencies": { + "react": "^17.0.2 || ^18.2.0 || ^19.0.0", + "react-dom": "^17.0.2 || ^18.2.0 || ^19.0.0" + } + }, + "node_modules/@excalidraw/laser-pointer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@excalidraw/laser-pointer/-/laser-pointer-1.3.1.tgz", + "integrity": "sha512-psA1z1N2qeAfsORdXc9JmD2y4CmDwmuMRxnNdJHZexIcPwaNEyIpNcelw+QkL9rz9tosaN9krXuKaRqYpRAR6g==", + "license": "MIT" + }, + "node_modules/@excalidraw/markdown-to-text": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@excalidraw/markdown-to-text/-/markdown-to-text-0.1.2.tgz", + "integrity": "sha512-1nDXBNAojfi3oSFwJswKREkFm5wrSjqay81QlyRv2pkITG/XYB5v+oChENVBQLcxQwX4IUATWvXM5BcaNhPiIg==", + "license": "MIT" + }, + "node_modules/@excalidraw/mermaid-to-excalidraw": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@excalidraw/mermaid-to-excalidraw/-/mermaid-to-excalidraw-2.2.2.tgz", + "integrity": "sha512-5VKQq5CdRocC82vOIUpQ5ufJOVV9FpBTdHGA+ULqazeIVV+cr299877omQCibsdS3Bpitz2fsnTwnIXEmLVDSg==", + "license": "MIT", + "dependencies": { + "@excalidraw/markdown-to-text": "0.1.2", + "@mermaid-js/parser": "^0.6.3", + "mermaid": "^11.12.1", + "nanoid": "4.0.2" + } + }, + "node_modules/@excalidraw/mermaid-to-excalidraw/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@excalidraw/random-username": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@excalidraw/random-username/-/random-username-1.1.0.tgz", + "integrity": "sha512-nULYsQxkWHnbmHvcs+efMkJ4/9TtvNyFeLyHdeGxW0zHs6P+jYVqcRff9A6Vq9w9JXeDRnRh2VKvTtS19GW2qA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.7.tgz", + "integrity": "sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^2.0.1", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", + "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", + "license": "MIT", + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.2.tgz", + "integrity": "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.1.tgz", + "integrity": "sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-compose-refs": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-primitive": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", + "integrity": "sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz", + "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz", + "integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.6.tgz", + "integrity": "sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.2", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz", + "integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz", + "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz", + "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.2.tgz", + "integrity": "sha512-HLK+CqD/8pN6GfJm3U+cqpqhSKYAWiOJDe+A+8MfxBnOue39QEeMa43csUn2CXCHQT0/mewh1LrrG4tfkM9DMA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@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-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-compose-refs": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-callback-ref": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-layout-effect": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.2.tgz", + "integrity": "sha512-gOUwh+HbjCuL0UCo8kZ+kdUEG8QtpdO4sMQduJ34ZEz0r4922g9REOBM+vIsfwtGxSug4Yb1msJMJYN2Bk8TpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-roving-focus": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-compose-refs": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-context": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-presence": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-primitive": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-callback-ref": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-layout-effect": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", + "license": "MIT" + }, + "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==", + "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.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "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==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "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==", + "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==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.12.tgz", + "integrity": "sha512-Qe/KWYhEiIIxGs7HrAAjMfShxKldx19SJtr5zu53f3afPsdZNz7HHtdTLXo/kqeiWNXVycI24kSnfzBYkTzpgw==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "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==", + "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==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.9.tgz", + "integrity": "sha512-0sE1406XBYJGiqD3AusTl9ZqC//2mIXix51tbom25gDCA8ri4xnSZg28CaSE8Srl6FClqABUKfsn0qghgdepMA==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@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==", + "license": "MIT", + "optional": true + }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-fs-access": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/browser-fs-access/-/browser-fs-access-0.29.1.tgz", + "integrity": "sha512-LSvVX5e21LRrXqVMhqtAwj5xPgDb+fXAIH80NsnCQ9xuZPs2xWsOREi24RKgZa1XOiQRbcmVrv87+ulOKsgjxw==", + "license": "Apache-2.0" + }, + "node_modules/canvas-roundrect-polyfill": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/canvas-roundrect-polyfill/-/canvas-roundrect-polyfill-0.0.1.tgz", + "integrity": "sha512-yWq+R3U3jE+coOeEb3a3GgE2j/0MMiDKM/QpLb6h9ihf5fGY9UXtvK9o4vNqjWXoZz7/3EaSVU3IX53TvFFUOw==", + "license": "MIT" + }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/crc-32": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-0.3.0.tgz", + "integrity": "sha512-kucVIjOmMc1f0tv53BJ/5WIX+MGLcKuoBhnGqQrgKJNqLByb/sVMWfW/Aw6hw0jgcqjJ2pi9E5y32zOIpaUlsA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cytoscape": { + "version": "3.34.4", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.4.tgz", + "integrity": "sha512-msY99tMY8iWTg+sIPGfSqDcPNOt4xcj+v/K/7qUFaCUxxlqnMkUYLBjRUzn9W5CU/R2hrmtJa5+UtovrEM2ctg==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "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-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.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "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-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/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==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/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/d3-sankey/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/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "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/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", + "license": "MIT" + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/detect-node-es": { + "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==", + "license": "MIT" + }, + "node_modules/dompurify": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.17.tgz", + "integrity": "sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/es-toolkit": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz", + "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types", + "tests/browser-compat" + ] + }, + "node_modules/es6-promise-pool": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/es6-promise-pool/-/es6-promise-pool-2.5.0.tgz", + "integrity": "sha512-VHErXfzR/6r/+yyzPKeBvO0lgjfC5cbDCQWjWwMZWSb6YU39TGIl51OUmCfWCq4ylMdJSB8zkz2vIuIeIxXApA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/fastdom": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastdom/-/fastdom-1.0.12.tgz", + "integrity": "sha512-LB+xjSTEbjHE1cWsxu+tN2Xqr1kpi+V9aADI7sVM5ZMaXyYGPHULQMzpJMYqOTULK/73pUkWVzzObFRBkPr+hg==", + "license": "MIT", + "dependencies": { + "strictdom": "^1.0.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fractional-indexing": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fractional-indexing/-/fractional-indexing-3.2.0.tgz", + "integrity": "sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ==", + "license": "CC0-1.0", + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/fuzzy": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", + "integrity": "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glur": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glur/-/glur-1.1.2.tgz", + "integrity": "sha512-l+8esYHTKOx2G/Aao4lEQ0bnHWg4fWtJbVoZZT9Knxi01pB8C80BR85nONLFwkkQoFRCmXY+BUcGZN3yZ2QsRA==", + "license": "MIT" + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "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/image-blob-reduce": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/image-blob-reduce/-/image-blob-reduce-3.0.1.tgz", + "integrity": "sha512-/VmmWgIryG/wcn4TVrV7cC4mlfUC/oyiKIfSg5eVM3Ten/c1c34RJhMYKCWTnoSMHSqXLt3tsrBR4Q2HInvN+Q==", + "license": "MIT", + "dependencies": { + "pica": "^7.1.0" + } + }, + "node_modules/immutable": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.9.tgz", + "integrity": "sha512-ObHy4YN7ycwZOUCLI1/6svfyAFu7vL8RhAvVu/bh/RZW9EPlOyDaQ9jDQWCtdqzaXUjgXZCW1migtHE7YI7UGQ==", + "license": "MIT" + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jotai": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.11.0.tgz", + "integrity": "sha512-zKfoBBD1uDw3rljwHkt0fWuja1B76R7CjznuBO+mSX6jpsO1EBeWNRKpeaQho9yPI/pvCv4recGfgOXGxwPZvQ==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=17.0.0", + "react": ">=17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/jotai-scope": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/jotai-scope/-/jotai-scope-0.7.2.tgz", + "integrity": "sha512-Gwed97f3dDObrO43++2lRcgOqw4O2sdr4JCjP/7eHK1oPACDJ7xKHGScpJX9XaflU+KBHXF+VhwECnzcaQiShg==", + "license": "MIT", + "peerDependencies": { + "jotai": ">=2.9.2", + "react": ">=17.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mermaid": { + "version": "11.17.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.17.2.tgz", + "integrity": "sha512-V6K3C8EBdEsPFZXSKMJe6ppQOENxuHARr9GvHX4hh47lAbhMRD9qf4oEK7LoaRQxULMa80/qt5gHO73aCleBBg==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.2", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.2.1", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.34.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.21", + "dompurify": "^3.3.3", + "es-toolkit": "^1.45.1", + "fastdom": "1.0.12", + "katex": "^0.16.47", + "khroma": "^2.1.0", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" + } + }, + "node_modules/mermaid/node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, + "node_modules/mermaid/node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "license": "Apache-2.0" + }, + "node_modules/mermaid/node_modules/@mermaid-js/parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.1.tgz", + "integrity": "sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==", + "license": "MIT", + "dependencies": { + "@chevrotain/types": "~11.1.2" + } + }, + "node_modules/mermaid/node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/mermaid/node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/multimath": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/multimath/-/multimath-2.0.0.tgz", + "integrity": "sha512-toRx66cAMJ+Ccz7pMIg38xSIrtnbozk0dchXezwQDMgQmbGpfxjtv68H+L00iFL8hxDaVjrmwAFSb3I6bg8Q2g==", + "license": "MIT", + "dependencies": { + "glur": "^1.1.2", + "object-assign": "^4.1.1" + } + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/open-color": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/open-color/-/open-color-1.9.1.tgz", + "integrity": "sha512-vCseG/EQ6/RcvxhUcGJiHViOgrtz4x0XbZepXvKik66TMGkvbmjeJrKFyBEx6daG5rNyyd14zYXhz0hZVwQFOw==", + "license": "MIT" + }, + "node_modules/package-manager-detector": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.9.0.tgz", + "integrity": "sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==", + "license": "MIT" + }, + "node_modules/pako": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz", + "integrity": "sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/perfect-freehand": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz", + "integrity": "sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==", + "license": "MIT" + }, + "node_modules/pica": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/pica/-/pica-7.1.1.tgz", + "integrity": "sha512-WY73tMvNzXWEld2LicT9Y260L43isrZ85tPuqRyvtkljSDLmnNFQmZICt4xUJMVulmcc6L9O7jbBrtx3DOz/YQ==", + "license": "MIT", + "dependencies": { + "glur": "^1.1.2", + "inherits": "^2.0.3", + "multimath": "^2.0.0", + "object-assign": "^4.1.1", + "webworkify": "^1.5.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/playwright-core": { + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.1.tgz", + "integrity": "sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/png-chunk-text": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-chunk-text/-/png-chunk-text-1.0.0.tgz", + "integrity": "sha512-DEROKU3SkkLGWNMzru3xPVgxyd48UGuMSZvioErCure6yhOc/pRH2ZV+SEn7nmaf7WNf3NdIpH+UTrRdKyq9Lw==", + "license": "MIT" + }, + "node_modules/png-chunks-encode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-chunks-encode/-/png-chunks-encode-1.0.0.tgz", + "integrity": "sha512-J1jcHgbQRsIIgx5wxW9UmCymV3wwn4qCCJl6KYgEU/yHCh/L2Mwq/nMOkRPtmV79TLxRZj5w3tH69pvygFkDqA==", + "license": "MIT", + "dependencies": { + "crc-32": "^0.3.0", + "sliced": "^1.0.1" + } + }, + "node_modules/png-chunks-extract": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-chunks-extract/-/png-chunks-extract-1.0.0.tgz", + "integrity": "sha512-ZiVwF5EJ0DNZyzAqld8BP1qyJBaGOFaq9zl579qfbkcmOwWLLO4I9L8i2O4j3HkI6/35i0nKG2n+dZplxiT89Q==", + "license": "MIT", + "dependencies": { + "crc-32": "^0.3.0" + } + }, + "node_modules/points-on-curve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-1.0.1.tgz", + "integrity": "sha512-3nmX4/LIiyuwGLwuUrfhTlDeQFlAhi7lyK/zcRNGhalwapDWgAGR82bUpmn2mA03vII3fvNCG8jAONzKXwpxAg==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/points-on-path/node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/pwacompat": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/pwacompat/-/pwacompat-2.0.17.tgz", + "integrity": "sha512-6Du7IZdIy7cHiv7AhtDy4X2QRM8IAD5DII69mt5qWibC2d15ZU8DmBG1WdZKekG11cChSu4zkSUGPF9sweOl6w==", + "license": "Apache-2.0" + }, + "node_modules/react": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/roughjs": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.4.tgz", + "integrity": "sha512-s6EZ0BntezkFYMf/9mGn7M8XGIoaav9QQBCnJROWB3brUWQ683Q2LbRD/hq0Z3bAJ/9NVpU/5LpiTWvQMyLDhw==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/roughjs/node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", + "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==", + "deprecated": "Unsupported", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strictdom": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strictdom/-/strictdom-1.0.1.tgz", + "integrity": "sha512-cEmp9QeXXRmjj/rVp9oyiqcvyocWab/HaoN4+bwFeZ7QzykJD6L3yD4v12K1x0tHpqRqVpJevN3gW7kyM39Bqg==", + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/to-regex-range": { + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-dedent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "license": "MIT", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.7.0.tgz", + "integrity": "sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/uuid": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.3.tgz", + "integrity": "sha512-Sc5u1VVln93y1Xnz4R+CunOZc7R9LUcTmhj7Rc7Eg3HVcf7rVn2FOoa812fe0W8p3jD7xeoGSYbfqCGGH2B6xw==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.16.tgz", + "integrity": "sha512-qeNEuOi9a3qkqRf7Gfez2WL2VwlBTLCNekHBGO9kxPVUp9XuY15yfTJ9jwvOwKI0I2MhUUfZq95NSp+LK1CLQg==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, + "node_modules/webworkify": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/webworkify/-/webworkify-1.5.0.tgz", + "integrity": "sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/src/image-gen/package.json b/src/image-gen/package.json new file mode 100644 index 00000000..468208d9 --- /dev/null +++ b/src/image-gen/package.json @@ -0,0 +1,21 @@ +{ + "name": "blacksheepcode-image-gen", + "version": "1.0.0", + "private": true, + "type": "module", + "description": "Generate editable Excalidraw diagrams and export them as PNG assets.", + "scripts": { + "render": "node render.mjs", + "render:siphoning": "node render.mjs --input corporate-value-funnel-siphoning.js --output ../assets/corporate_value_funnel_siphoning.png" + }, + "engines": { + "node": ">=20.15.0" + }, + "dependencies": { + "@excalidraw/excalidraw": "0.18.1", + "esbuild": "0.28.2", + "playwright-core": "1.64.1", + "react": "18.3.1", + "react-dom": "18.3.1" + } +} diff --git a/src/image-gen/render.mjs b/src/image-gen/render.mjs new file mode 100644 index 00000000..d0b3c204 --- /dev/null +++ b/src/image-gen/render.mjs @@ -0,0 +1,138 @@ +import fs from 'node:fs/promises'; +import http from 'node:http'; +import os from 'node:os'; +import path from 'node:path'; +import { createRequire } from 'node:module'; +import { parseArgs } from 'node:util'; +import { fileURLToPath } from 'node:url'; +import { build } from 'esbuild'; +import { chromium } from 'playwright-core'; + +const toolDir = path.dirname(fileURLToPath(import.meta.url)); +const require = createRequire(import.meta.url); +const { values } = parseArgs({ + options: { + input: { type: 'string', short: 'i' }, + output: { type: 'string', short: 'o' }, + scale: { type: 'string', default: '2' }, + help: { type: 'boolean', short: 'h', default: false }, + }, +}); +if (values.help) { + console.log(`Usage: node render.mjs [options] + + -i, --input Diagram module (default: corporate-value-funnel.js) + -o, --output PNG destination (default: ../assets/corporate_value_funnel.png) + --scale Export scale (default: 2) + -h, --help Show this help + +Explicit paths are relative to the current working directory. +An editable .excalidraw scene is saved beside the PNG. +Set CHROME_PATH to use a particular Chrome or Chromium executable.`); + process.exit(0); +} + +const input = values.input + ? path.resolve(values.input) + : path.join(toolDir, 'corporate-value-funnel.js'); +const output = values.output + ? path.resolve(values.output) + : path.resolve(toolDir, '../assets/corporate_value_funnel.png'); +const scale = Number(values.scale); +if (!Number.isFinite(scale) || scale <= 0) { + throw new Error('--scale must be a positive number.'); +} +if (path.extname(output).toLowerCase() !== '.png') { + throw new Error('--output must name a .png file.'); +} +await fs.access(input); + +// Keep bundles in a temporary directory and serve only bundles and bundled fonts. +const buildDir = await fs.mkdtemp(path.join(os.tmpdir(), 'excalidraw-render-')); +const dist = path.dirname(require.resolve('@excalidraw/excalidraw')); +let browser; +let server; +try { + await build({ + entryPoints: { diagram: input }, bundle: true, + outdir: buildDir, format: 'esm', splitting: true, + define: { 'process.env.NODE_ENV': '"production"' }, + loader: { '.woff2': 'file', '.wasm': 'file' }, + logLevel: 'error', + }); + server = http.createServer(async (req, res) => { + try { + const pathname = decodeURIComponent(new URL(req.url, 'http://localhost').pathname); + if (pathname === '/') { + res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); + res.end(''); + return; + } + let base; + let relative; + if (pathname.startsWith('/fonts/')) { + base = path.join(dist, 'fonts'); + relative = pathname.slice('/fonts/'.length); + } else if (pathname.startsWith('/build/')) { + base = buildDir; + relative = pathname.slice('/build/'.length); + } else { + res.writeHead(404).end(); + return; + } + const file = path.resolve(base, relative); + if (!file.startsWith(base + path.sep)) { + res.writeHead(404).end(); + return; + } + const data = await fs.readFile(file); + const mime = { + '.js': 'text/javascript', '.woff2': 'font/woff2', + '.css': 'text/css', '.wasm': 'application/wasm', + }[path.extname(file)] || 'application/octet-stream'; + res.writeHead(200, { 'Content-Type': mime }); + res.end(data); + } catch { + res.writeHead(404).end(); + } + }); + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(0, '127.0.0.1', resolve); + }); + + if (process.env.CHROME_PATH) { + browser = await chromium.launch({ executablePath: process.env.CHROME_PATH, headless: true }); + } else { + try { + browser = await chromium.launch({ channel: 'chrome', headless: true }); + } catch { + try { + browser = await chromium.launch({ headless: true }); + } catch (cause) { + throw new Error('Install Google Chrome, set CHROME_PATH, or run "npx playwright-core install chromium" from src/image-gen.', { cause }); + } + } + } + const page = await browser.newPage({ viewport: { width: 1760, height: 1160 } }); + page.on('pageerror', error => console.error('Diagram error:', error.message)); + await page.goto(`http://127.0.0.1:${server.address().port}/`); + await page.waitForFunction(() => typeof window.renderDiagram === 'function'); + const result = await page.evaluate(scale => window.renderDiagram({ scale }), scale); + const scenePath = output.replace(/\.png$/i, '.excalidraw'); + await fs.mkdir(path.dirname(output), { recursive: true }); + await fs.writeFile(output, Buffer.from(result.png.split(',')[1], 'base64')); + await fs.writeFile(scenePath, JSON.stringify(result.scene, null, 2) + '\n'); + console.log(`Saved ${output} (${result.width} × ${result.height})`); + console.log(`Saved ${scenePath}`); +} finally { + try { + await browser?.close(); + } finally { + if (server?.listening) { + server.closeAllConnections(); + await new Promise(resolve => server.close(resolve)); + } + await fs.rm(buildDir, { recursive: true, force: true }); + } +} diff --git a/src/routes/posts/ai_and_the_carve_out_of_middle_class_power.mdx b/src/routes/posts/ai_and_the_carve_out_of_middle_class_power.mdx new file mode 100644 index 00000000..ee296520 --- /dev/null +++ b/src/routes/posts/ai_and_the_carve_out_of_middle_class_power.mdx @@ -0,0 +1,92 @@ +--- +meta: + title: AI and the carve-out of middle class power + description: How replacing the middle class with AI could shift power toward the owners of capital. + dateCreated: 2026-10-23 + image: "dystopian_future" + +tags: + - "ai" +--- + +import dystopian_future from "@/assets/dystopian_future.png"; +import corporateValueFunnel from "@/assets/corporate_value_funnel.png"; +import corporateValueFunnelSiphoning from "@/assets/corporate_value_funnel_siphoning.png"; + +This post is a reformulation of many of the ideas expressed in David Graeber's fantastic book _Bullshit Jobs_. + +## 1. Corporations exist as a mechanism to extract value from their clients and their suppliers. + +We can think of a corporation as kind of entity whose sole purpose to is extract value from both its customers and its suppliers. +How effectively it is able to do this depends on on market conditions - for example, a more competitive market may neccesitate lowering prices rather than extracting the surplus to shareholders. + +At the top of this extraction mechanism, the CEO's incentives are usually pretty aligned with the shareholders' - the CEO usually has a bonus structure that is tied to measures like profit or share price. + +A funnel illustrating how corporations extract value from customers and suppliers, with value flowing toward shareholders. + +## 2. A parasitic bureaucracy exists + +I use the term 'parasitic' purely as an objective descriptor - not as a disparagement. I myself am a member of this bureaucracy! + +The CEO cannot simply order those who are actually producing or selling the goods to work in a certain way. Instead they parcel this work out to some executives, who parcel the work out to some senior managers, who... and so on. + +_The people at these middle layers do not have the same value extraction incentive that the CEO does_. + +A company can try to align individual incentives with the company's overall purpose, for example by giving bonuses based on company performance, but the individual bureaucrat's individual impact on this goal, and the corresponding reward is small - so it is likely that the individual other goals will be given higher weight. For example, getting the experience with a particular technology they need to move into a higher paying job, seeing the world on the company card, promoting their public profile, or simply, demanding a higher salary. + +This parasitic bureaucracy is not all malign - the individuals in this layer are still useful enough to the company to justify their existence, lest they be excised completely, but the inefficiencies of any corporation can be explained with this model - the more directly an individual is involved with the value extraction funnel, the more leverage they have to siphon off the value, be it by demanding a higher salary or just taking their time to do their task. + +A corporate value funnel showing members of the bureaucracy siphoning value as it flows toward shareholders. + +Relating this to software engineering - my impression is that in the past software engineers have held relatively a lot of power within an organisation - their work not being easily understood or replaceable, and as such have been able to demand high salaries and comfortable working conditions. + +## Sidebar: Feudalism + +In the conclusion of his book, Graeber coins the term 'managerial feudalism', it might be worth dwelling on some of the dynamics of feudalism. + +In a feudal system, all of the land technically belongs to the king. But the king, with his retinue of knights, does not have the power himself to enforce his will, so he parcels the land out to several dukes. The dukes have their own retinue of knights, but they too, can't control all that land themselves, so they in turn parcel it out to some lower lords, and so on. + +Now importantly, the king doesn't want his dukes getting on too well with each other, if they did, they might all get together and depose him. + +And so, while the king might genuinely want to be an effective administrator of the kingdom, might genuinely want to improve the roads etc, his more important job is managing the power politics of the kingdom, making sure the dukes don't become unified. This might involve encouraging a small war between dukes - not good for the kingdom - but good for maintaining power. + +How to tie this back to bureaucracy? I'm not sure, but the point is that individual incentives being as they are, there can be scenarios where the rational thing is to actively make things worse, to improve one's own position. + +For example, imagine a warehouse manager who manages a staff of fifty people who all need to do regular stocktakes to make sure everything is correct. A bright engineer tells the warehouse manager that they could create a system that uses barcodes all do all this inventory management automatically. This would be in the interests of the company, but the manager would now be a manager of say four people, and the company might decide that they don't need the manager at all. The manager has an incentive to preserve the old inefficient system because the company needs them to manage it. + +## 3.The parasitic bueacracy can be replaced with AI + +I want to reemphasise, when I use the term 'parasitic bureaucracy' I do not do it to malign the members of it - an alternative framing is that this is middle class power. The controlling interests have to grant concessions to the middle classes - _because they need them_. + +If this parasitic bureaucracy can be replaced by AI - what happens? The CEO no longer needs to pass their orders through this human bureaucracy, they can give them to the AI directly. + +The AI does not have the same orthogonal incentives, (except in the cases where it does - see the alignment problem), and so replacing this bureaucracy with AI means... pure value extraction. + +It's likely not that simple - how much of this previously-siphoned value can now land in the shareholders' pockets depends on market conditions - it could be that the company cuts prices to retain competitiveness, it depends on how competitive the market is. + +## 4. So what happens to the middle class? + +If we accept this framing that the middle class has power because the people at the top _need_ them, when AI means that the middle classes _aren't_ needed, what happens? + +### 1. New jobs are created + +To give a parallel with the industrial revolution - the industrial revolution may have disrupted cottage industries like textiles, but the machines now required new machines to build tools to service textile machines, needed people with the smarts enough to service the machines. + +AI will greatly increase the surface area of software - as software engineers our jobs are changing, but I personally am not worried as a software engineer - there is going to need to be people to sort out these whole new jungles of AI generated code. + +### 2. The middle class votes their power back + +In this world, the middle class lose their jobs, and vote for parties that restore their power - a wealth tax, universal basic income, a tax on AI. + +The power try to prevent this by influencing public sentiment via social media. + +### 3. A dystopian world where the wealthy are not beholden to a middle class to enact their will + +AI generated image, presumably. A satirical scene with OpenAI, Anthropic, and xAI executives in fortified compounds guarded by robots, above a permanent underclass begging for tokens. + +There may still be jobs, but these are easily replaceable manual labour type jobs, not the kind that leads to the siphoning that occurs in a bureaucracy. + +The powerful are protected by loyal autonomous weapons, no police force or military switch sides and join a revolution. + + + diff --git a/src/routes/posts/an_inversion_of_information_discovery.mdx b/src/routes/posts/an_inversion_of_information_discovery.mdx new file mode 100644 index 00000000..fc126c8c --- /dev/null +++ b/src/routes/posts/an_inversion_of_information_discovery.mdx @@ -0,0 +1,75 @@ +--- +meta: + title: An inversion of information discovery + description: Our information discovery starts at a high level and then digs in. In the AI world, it might be better to have AI do deep discovery and then summarize. + dateCreated: 2026-10-18 + image: information_discovery_ai + +tags: + - "software_engineering" + - "ai" + +--- + +import informationDiscovery from "@/assets/information_discovery_c.png"; +import informationDiscoveryAi from "@/assets/information_discovery_ai.png"; +import Image from "next/image"; + +Once upon a time, the way I discovered technical information was like this: + +1. I do a Google search, and then I pick a result from Stack Overflow or tutorial blog, or I navigate straight to that framework's documentation, and look at the 'getting started' or 'concepts' documentation section. +2. This gives me a high level overview of the concepts, usually with links to further details. +3. If I need further details then I dig into the API documentation. +4. From there, if I need more details I'm: + - I'm doing searches in the GitHub issues or pull requests + - Creating code reproductions to test that behaviour that I'm looking for +5. As a failure mode, I'm looking into the framework source code to understand the thing. + +That is, the model of information discovery is that we look high level first, and dig into the more details _as we need it_. + +Information discovery starts with a high-level overview, then goes deeper into API documentation, issues and pull requests, reproductions, and source code as needed. + +We can add a step 0 to this process: + +0. I passively browse social media and see certain concepts, tools or techniques be talked about, and that might be enough for me to search those later. + +**With AI, this might have changed,** + +Part of this is not specific to AI - Google search has been in decline for a while now - but I'm finding that 'search first' is no longer reliable. + +1. That surface level content is often AI generated now, and as a heuristic, I don't know if it's worth reading further into it, without knowing if there's actually anything concrete behind it. +2. AI is good at answering surface level questions directly. + +Instead, with AI, we can have the AI take the opposite approach: + +1. Start deep - start with reading source code, reading academic papers, reading technical specifications. +2. Have the AI develop a coherent conceptual picture +3. Finally have the AI formulate the high level overview. + +Then, you can drill into the details as much or as little as needed. + +AI investigates source code, academic papers, technical specifications, issues, and reproductions, then synthesizes a grounded overview and detailed explanations with links to primary sources. + +Of course, there's always the possibility that there's going to be a hallucination between what the AI reports to you and what it read. + +To this, I say: + +- Not to say that it won't happen, but I trust the models for the most part these days. +- More to the point, what's the alternative? We live in an AI slop world whether we like it or not. + +## Practical conclusions + +### As a reader + +- Create skills with a workflow designed for 'deep knowledge first'. + - Such skills will likely require the higher model effort setting - and will as such be slow. So there's still something to be said for 'just tell me what you already know'. + +> User: Tell me about XYZ. +> Agent: Ah, XYZ, XYZ is a flippty floop, zip zap. +> User: /deep-research I'm specifically trying to solve X. Find what you can about solving this particular problem for flippty fap and zip zap. + + +### As a documentation writer + +I haven't tested this hypothesis - chances are AI is still encountering your content via surface level, documentation sites, GitHub root README.md - in these, add pointers to things like tests that demonstrate the tool's specific capabilities. + diff --git a/tsconfig.json b/tsconfig.json index cae34635..6ccc4ad3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "react-jsx", + "jsx": "preserve", "incremental": true, "plugins": [ {