chore: removed mono repo 434cb86d
Steve · 2026-04-30 20:15 272 file(s) · +42 −4201
bun.lock (deleted) +0 −1569
1 -
{
2 -
  "lockfileVersion": 1,
3 -
  "configVersion": 1,
4 -
  "workspaces": {
5 -
    "": {
6 -
      "name": "stevedylan.dev",
7 -
    },
8 -
    "packages/client": {
9 -
      "name": "client",
10 -
      "version": "1.0.0",
11 -
      "dependencies": {
12 -
        "@astrojs/cloudflare": "12.6.12",
13 -
        "@astrojs/react": "4.4.2",
14 -
        "@astrojs/rss": "4.0.14",
15 -
        "@astrojs/ts-plugin": "1.10.6",
16 -
        "@types/react": "^18.3.8",
17 -
        "@types/react-dom": "^18.3.0",
18 -
        "astro": "5.16.7",
19 -
        "markdown-it": "^14.1.0",
20 -
        "react": "^18.3.1",
21 -
        "react-dom": "^18.3.1",
22 -
        "rehype-external-links": "^3.0.0",
23 -
        "sanitize-html": "^2.17.0",
24 -
        "sharp": "^0.33.1",
25 -
        "shiki": "^4.0.2",
26 -
      },
27 -
      "devDependencies": {
28 -
        "@astrojs/mdx": "4.3.13",
29 -
        "@astrojs/sitemap": "3.6.1",
30 -
        "@astrojs/tailwind": "6.0.2",
31 -
        "@biomejs/biome": "2.1.1",
32 -
        "@tailwindcss/aspect-ratio": "^0.4.2",
33 -
        "@tailwindcss/typography": "^0.5.8",
34 -
        "@types/bun": "^1.3.6",
35 -
        "@types/markdown-it": "^14.1.2",
36 -
        "@types/sanitize-html": "^2.16.0",
37 -
        "autoprefixer": "^10.4.13",
38 -
        "postcss": "^8.4.21",
39 -
        "tailwindcss": "^3.4.7",
40 -
        "typescript": "^5.6.2",
41 -
        "wrangler": "^4.58.0",
42 -
      },
43 -
    },
44 -
    "packages/server": {
45 -
      "name": "server",
46 -
      "dependencies": {
47 -
        "@atproto/api": "^0.18.12",
48 -
        "feed": "^5.1.0",
49 -
        "hono": "^4.11.3",
50 -
        "jose": "^6.1.3",
51 -
      },
52 -
      "devDependencies": {
53 -
        "@cloudflare/workers-types": "^4.20260103.0",
54 -
        "wrangler": "^4.4.0",
55 -
      },
56 -
    },
57 -
  },
58 -
  "packages": {
59 -
    "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
60 -
61 -
    "@astrojs/cloudflare": ["@astrojs/cloudflare@12.6.12", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "@astrojs/underscore-redirects": "1.0.0", "@cloudflare/workers-types": "^4.20251121.0", "tinyglobby": "^0.2.15", "vite": "^6.4.1", "wrangler": "4.50.0" }, "peerDependencies": { "astro": "^5.7.0" } }, "sha512-f6iXreyJc02EhokqsoPf7D/s3tebyZ8dBNVOyY2JDY87ujft4RokVS1f+zNwNFyu0wkehC4ALUboU5z590DE4w=="],
62 -
63 -
    "@astrojs/compiler": ["@astrojs/compiler@2.13.0", "", {}, "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw=="],
64 -
65 -
    "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.5", "", {}, "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA=="],
66 -
67 -
    "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.10", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.5", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.19.0", "smol-toml": "^1.5.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A=="],
68 -
69 -
    "@astrojs/mdx": ["@astrojs/mdx@4.3.13", "", { "dependencies": { "@astrojs/markdown-remark": "6.3.10", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q=="],
70 -
71 -
    "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="],
72 -
73 -
    "@astrojs/react": ["@astrojs/react@4.4.2", "", { "dependencies": { "@vitejs/plugin-react": "^4.7.0", "ultrahtml": "^1.6.0", "vite": "^6.4.1" }, "peerDependencies": { "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", "react": "^17.0.2 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" } }, "sha512-1tl95bpGfuaDMDn8O3x/5Dxii1HPvzjvpL2YTuqOOrQehs60I2DKiDgh1jrKc7G8lv+LQT5H15V6QONQ+9waeQ=="],
74 -
75 -
    "@astrojs/rss": ["@astrojs/rss@4.0.14", "", { "dependencies": { "fast-xml-parser": "^5.3.0", "piccolore": "^0.1.3" } }, "sha512-KCe1imDcADKOOuO/wtKOMDO/umsBD6DWF+94r5auna1jKl5fmlK9vzf+sjA3EyveXA/FoB3khtQ/u/tQgETmTw=="],
76 -
77 -
    "@astrojs/sitemap": ["@astrojs/sitemap@3.6.1", "", { "dependencies": { "sitemap": "^8.0.2", "stream-replace-string": "^2.0.0", "zod": "^3.25.76" } }, "sha512-+o+TbxXqQJAOd+HxCjz/5RdAMrRFGjeuO+U6zddUuTO59WqMqXnsc8uveRiEr2Ff+3McZiEne7iG4J5cnuI6kA=="],
78 -
79 -
    "@astrojs/tailwind": ["@astrojs/tailwind@6.0.2", "", { "dependencies": { "autoprefixer": "^10.4.21", "postcss": "^8.5.3", "postcss-load-config": "^4.0.2" }, "peerDependencies": { "astro": "^3.0.0 || ^4.0.0 || ^5.0.0", "tailwindcss": "^3.0.24" } }, "sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg=="],
80 -
81 -
    "@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="],
82 -
83 -
    "@astrojs/ts-plugin": ["@astrojs/ts-plugin@1.10.6", "", { "dependencies": { "@astrojs/compiler": "^2.10.3", "@astrojs/yaml2ts": "^0.2.2", "@jridgewell/sourcemap-codec": "^1.4.15", "@volar/language-core": "~2.4.23", "@volar/typescript": "~2.4.23", "semver": "^7.3.8", "vscode-languageserver-textdocument": "^1.0.11" } }, "sha512-Ke5CNwxn/ozsh6THJKuayUlBToa3uiPDi2oSwcXmTdeiJ0PGr+UkdQJf9hdMgBjbIka9fhnSn3UhYamfNfJ73A=="],
84 -
85 -
    "@astrojs/underscore-redirects": ["@astrojs/underscore-redirects@1.0.0", "", {}, "sha512-qZxHwVnmb5FXuvRsaIGaqWgnftjCuMY+GSbaVZdBmE4j8AfgPqKPxYp8SUERyJcjpKCEmO4wD6ybuGH8A2kVRQ=="],
86 -
87 -
    "@astrojs/yaml2ts": ["@astrojs/yaml2ts@0.2.2", "", { "dependencies": { "yaml": "^2.5.0" } }, "sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ=="],
88 -
89 -
    "@atproto/api": ["@atproto/api@0.18.12", "", { "dependencies": { "@atproto/common-web": "^0.4.10", "@atproto/lexicon": "^0.6.0", "@atproto/syntax": "^0.4.2", "@atproto/xrpc": "^0.7.7", "await-lock": "^2.2.2", "multiformats": "^9.9.0", "tlds": "^1.234.0", "zod": "^3.23.8" } }, "sha512-b4MdUhYzebb6nQLo8LLZvBC9yvlzF69XqZeKewvmz9SleK2sJX2cqAPj78IStjNzT/3Xm9vVQrq9DkCkhSiTiQ=="],
90 -
91 -
    "@atproto/common-web": ["@atproto/common-web@0.4.10", "", { "dependencies": { "@atproto/lex-data": "0.0.6", "@atproto/lex-json": "0.0.6", "zod": "^3.23.8" } }, "sha512-TLDZSgSKzT8ZgOrBrTGK87J1CXve9TEuY6NVVUBRkOMzRRtQzpFb9/ih5WVS/hnaWVvE30CfuyaetRoma+WKNw=="],
92 -
93 -
    "@atproto/lex-data": ["@atproto/lex-data@0.0.6", "", { "dependencies": { "@atproto/syntax": "0.4.2", "multiformats": "^9.9.0", "tslib": "^2.8.1", "uint8arrays": "3.0.0", "unicode-segmenter": "^0.14.0" } }, "sha512-MBNB4ghRJQzuXK1zlUPljpPbQcF1LZ5dzxy274KqPt4p3uPuRw0mHjgcCoWzRUNBQC685WMQR4IN9DHtsnG57A=="],
94 -
95 -
    "@atproto/lex-json": ["@atproto/lex-json@0.0.6", "", { "dependencies": { "@atproto/lex-data": "0.0.6", "tslib": "^2.8.1" } }, "sha512-EILnN5cditPvf+PCNjXt7reMuzjugxAL1fpSzmzJbEMGMUwxOf5pPWxRsaA/M3Boip4NQZ+6DVrPOGUMlnqceg=="],
96 -
97 -
    "@atproto/lexicon": ["@atproto/lexicon@0.6.0", "", { "dependencies": { "@atproto/common-web": "^0.4.7", "@atproto/syntax": "^0.4.2", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-5veb8aD+J5M0qszLJ+73KSFsFrJBgAY/nM1TSAJvGY7fNc9ZAT+PSUlmIyrdye9YznAZ07yktalls/TwNV7cHQ=="],
98 -
99 -
    "@atproto/syntax": ["@atproto/syntax@0.4.2", "", {}, "sha512-X9XSRPinBy/0VQ677j8VXlBsYSsUXaiqxWVpGGxJYsAhugdQRb0jqaVKJFtm6RskeNkV6y9xclSUi9UYG/COrA=="],
100 -
101 -
    "@atproto/xrpc": ["@atproto/xrpc@0.7.7", "", { "dependencies": { "@atproto/lexicon": "^0.6.0", "zod": "^3.23.8" } }, "sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA=="],
102 -
103 -
    "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="],
104 -
105 -
    "@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="],
106 -
107 -
    "@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="],
108 -
109 -
    "@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="],
110 -
111 -
    "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="],
112 -
113 -
    "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
114 -
115 -
    "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="],
116 -
117 -
    "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="],
118 -
119 -
    "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="],
120 -
121 -
    "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
122 -
123 -
    "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
124 -
125 -
    "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
126 -
127 -
    "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="],
128 -
129 -
    "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="],
130 -
131 -
    "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="],
132 -
133 -
    "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="],
134 -
135 -
    "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="],
136 -
137 -
    "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="],
138 -
139 -
    "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="],
140 -
141 -
    "@biomejs/biome": ["@biomejs/biome@2.1.1", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.1.1", "@biomejs/cli-darwin-x64": "2.1.1", "@biomejs/cli-linux-arm64": "2.1.1", "@biomejs/cli-linux-arm64-musl": "2.1.1", "@biomejs/cli-linux-x64": "2.1.1", "@biomejs/cli-linux-x64-musl": "2.1.1", "@biomejs/cli-win32-arm64": "2.1.1", "@biomejs/cli-win32-x64": "2.1.1" }, "bin": { "biome": "bin/biome" } }, "sha512-HFGYkxG714KzG+8tvtXCJ1t1qXQMzgWzfvQaUjxN6UeKv+KvMEuliInnbZLJm6DXFXwqVi6446EGI0sGBLIYng=="],
142 -
143 -
    "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2Muinu5ok4tWxq4nu5l19el48cwCY/vzvI7Vjbkf3CYIQkjxZLyj0Ad37Jv2OtlXYaLvv+Sfu1hFeXt/JwRRXQ=="],
144 -
145 -
    "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cC8HM5lrgKQXLAK+6Iz2FrYW5A62pAAX6KAnRlEyLb+Q3+Kr6ur/sSuoIacqlp1yvmjHJqjYfZjPvHWnqxoEIA=="],
146 -
147 -
    "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-tw4BEbhAUkWPe4WBr6IX04DJo+2jz5qpPzpW/SWvqMjb9QuHY8+J0M23V8EPY/zWU4IG8Ui0XESapR1CB49Q7g=="],
148 -
149 -
    "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/7FBLnTswu4jgV9ttI3AMIdDGqVEPIZd8I5u2D4tfCoj8rl9dnjrEQbAIDlWhUXdyWlFSz8JypH3swU9h9P+2A=="],
150 -
151 -
    "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-3WJ1GKjU7NzZb6RTbwLB59v9cTIlzjbiFLDB0z4376TkDqoNYilJaC37IomCr/aXwuU8QKkrYoHrgpSq5ffJ4Q=="],
152 -
153 -
    "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-kUu+loNI3OCD2c12cUt7M5yaaSjDnGIksZwKnueubX6c/HWUyi/0mPbTBHR49Me3F0KKjWiKM+ZOjsmC+lUt9g=="],
154 -
155 -
    "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.1.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-vEHK0v0oW+E6RUWLoxb2isI3rZo57OX9ZNyyGH701fZPj6Il0Rn1f5DMNyCmyflMwTnIQstEbs7n2BxYSqQx4Q=="],
156 -
157 -
    "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-i2PKdn70kY++KEF/zkQFvQfX1e8SkA8hq4BgC+yE9dZqyLzB/XStY2MvwI3qswlRgnGpgncgqe0QYKVS1blksg=="],
158 -
159 -
    "@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="],
160 -
161 -
    "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.1", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg=="],
162 -
163 -
    "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.8.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251202.0" }, "optionalPeers": ["workerd"] }, "sha512-oIAu6EdQ4zJuPwwKr9odIEqd8AV96z1aqi3RBEA4iKaJ+Vd3fvuI6m5EDC7/QCv+oaPIhy1SkYBYxmD09N+oZg=="],
164 -
165 -
    "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260107.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Srwe/IukVppkMU2qTndkFaKCmZBI7CnZoq4Y0U0gD/8158VGzMREHTqCii4IcCeHifwrtDqTWu8EcA1VBKI4mg=="],
166 -
167 -
    "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260107.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-aAYwU7zXW+UZFh/a4vHP5cs1ulTOcDRLzwU9547yKad06RlZ6ioRm7ovjdYvdqdmbI8mPd99v4LN9gMmecazQw=="],
168 -
169 -
    "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260107.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Wh7xWtFOkk6WY3CXe3lSqZ1anMkFcwy+qOGIjtmvQ/3nCOaG34vKNwPIE9iwryPupqkSuDmEqkosI1UUnSTh1A=="],
170 -
171 -
    "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260107.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-NI0/5rdssdZZKYHxNG4umTmMzODByq86vSCEk8u4HQbGhRCQo7rV1eXn84ntSBdyWBzWdYGISCbeZMsgfIjSTg=="],
172 -
173 -
    "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260107.1", "", { "os": "win32", "cpu": "x64" }, "sha512-gmBMqs606Gd/IhBEBPSL/hJAqy2L8IyPUjKtoqd/Ccy7GQxbSc0rYlRkxbQ9YzmqnuhrTVYvXuLscyWrpmAJkw=="],
174 -
175 -
    "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260108.0", "", {}, "sha512-0SuzZ7SeMB35X0wL2rhsEQG1dmfAGY8N8z7UwrkFb6hxerxwXP4QuIzcF8HtCJTRTjChmarxV+HQC+ADB4UK1A=="],
176 -
177 -
    "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
178 -
179 -
    "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
180 -
181 -
    "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="],
182 -
183 -
    "@esbuild/android-arm": ["@esbuild/android-arm@0.27.0", "", { "os": "android", "cpu": "arm" }, "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ=="],
184 -
185 -
    "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.0", "", { "os": "android", "cpu": "arm64" }, "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ=="],
186 -
187 -
    "@esbuild/android-x64": ["@esbuild/android-x64@0.27.0", "", { "os": "android", "cpu": "x64" }, "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q=="],
188 -
189 -
    "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg=="],
190 -
191 -
    "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g=="],
192 -
193 -
    "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw=="],
194 -
195 -
    "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g=="],
196 -
197 -
    "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ=="],
198 -
199 -
    "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ=="],
200 -
201 -
    "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw=="],
202 -
203 -
    "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg=="],
204 -
205 -
    "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg=="],
206 -
207 -
    "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA=="],
208 -
209 -
    "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ=="],
210 -
211 -
    "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w=="],
212 -
213 -
    "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw=="],
214 -
215 -
    "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w=="],
216 -
217 -
    "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.0", "", { "os": "none", "cpu": "x64" }, "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA=="],
218 -
219 -
    "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ=="],
220 -
221 -
    "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A=="],
222 -
223 -
    "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA=="],
224 -
225 -
    "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA=="],
226 -
227 -
    "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg=="],
228 -
229 -
    "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ=="],
230 -
231 -
    "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.0", "", { "os": "win32", "cpu": "x64" }, "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg=="],
232 -
233 -
    "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="],
234 -
235 -
    "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="],
236 -
237 -
    "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="],
238 -
239 -
    "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="],
240 -
241 -
    "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="],
242 -
243 -
    "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="],
244 -
245 -
    "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="],
246 -
247 -
    "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
248 -
249 -
    "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
250 -
251 -
    "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="],
252 -
253 -
    "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="],
254 -
255 -
    "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="],
256 -
257 -
    "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="],
258 -
259 -
    "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="],
260 -
261 -
    "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="],
262 -
263 -
    "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="],
264 -
265 -
    "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="],
266 -
267 -
    "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="],
268 -
269 -
    "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="],
270 -
271 -
    "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="],
272 -
273 -
    "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="],
274 -
275 -
    "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="],
276 -
277 -
    "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
278 -
279 -
    "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="],
280 -
281 -
    "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="],
282 -
283 -
    "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
284 -
285 -
    "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
286 -
287 -
    "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
288 -
289 -
    "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
290 -
291 -
    "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
292 -
293 -
    "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="],
294 -
295 -
    "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
296 -
297 -
    "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
298 -
299 -
    "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
300 -
301 -
    "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
302 -
303 -
    "@poppinss/colors": ["@poppinss/colors@4.1.6", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="],
304 -
305 -
    "@poppinss/dumper": ["@poppinss/dumper@0.6.5", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw=="],
306 -
307 -
    "@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="],
308 -
309 -
    "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="],
310 -
311 -
    "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="],
312 -
313 -
    "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.55.1", "", { "os": "android", "cpu": "arm" }, "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg=="],
314 -
315 -
    "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.55.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg=="],
316 -
317 -
    "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.55.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg=="],
318 -
319 -
    "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.55.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ=="],
320 -
321 -
    "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.55.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg=="],
322 -
323 -
    "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.55.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw=="],
324 -
325 -
    "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ=="],
326 -
327 -
    "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg=="],
328 -
329 -
    "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ=="],
330 -
331 -
    "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA=="],
332 -
333 -
    "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g=="],
334 -
335 -
    "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw=="],
336 -
337 -
    "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw=="],
338 -
339 -
    "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw=="],
340 -
341 -
    "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw=="],
342 -
343 -
    "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg=="],
344 -
345 -
    "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.55.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg=="],
346 -
347 -
    "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg=="],
348 -
349 -
    "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w=="],
350 -
351 -
    "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.55.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg=="],
352 -
353 -
    "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.55.1", "", { "os": "none", "cpu": "arm64" }, "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw=="],
354 -
355 -
    "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.55.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g=="],
356 -
357 -
    "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.55.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA=="],
358 -
359 -
    "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg=="],
360 -
361 -
    "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw=="],
362 -
363 -
    "@shikijs/core": ["@shikijs/core@4.0.2", "", { "dependencies": { "@shikijs/primitive": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw=="],
364 -
365 -
    "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag=="],
366 -
367 -
    "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg=="],
368 -
369 -
    "@shikijs/langs": ["@shikijs/langs@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg=="],
370 -
371 -
    "@shikijs/primitive": ["@shikijs/primitive@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw=="],
372 -
373 -
    "@shikijs/themes": ["@shikijs/themes@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA=="],
374 -
375 -
    "@shikijs/types": ["@shikijs/types@4.0.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg=="],
376 -
377 -
    "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
378 -
379 -
    "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="],
380 -
381 -
    "@speed-highlight/core": ["@speed-highlight/core@1.2.14", "", {}, "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA=="],
382 -
383 -
    "@tailwindcss/aspect-ratio": ["@tailwindcss/aspect-ratio@0.4.2", "", { "peerDependencies": { "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" } }, "sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ=="],
384 -
385 -
    "@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="],
386 -
387 -
    "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
388 -
389 -
    "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
390 -
391 -
    "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
392 -
393 -
    "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
394 -
395 -
    "@types/bun": ["@types/bun@1.3.6", "", { "dependencies": { "bun-types": "1.3.6" } }, "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="],
396 -
397 -
    "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
398 -
399 -
    "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
400 -
401 -
    "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
402 -
403 -
    "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
404 -
405 -
    "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="],
406 -
407 -
    "@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="],
408 -
409 -
    "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
410 -
411 -
    "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="],
412 -
413 -
    "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="],
414 -
415 -
    "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
416 -
417 -
    "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
418 -
419 -
    "@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="],
420 -
421 -
    "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="],
422 -
423 -
    "@types/react": ["@types/react@18.3.27", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" } }, "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w=="],
424 -
425 -
    "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="],
426 -
427 -
    "@types/sanitize-html": ["@types/sanitize-html@2.16.0", "", { "dependencies": { "htmlparser2": "^8.0.0" } }, "sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw=="],
428 -
429 -
    "@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="],
430 -
431 -
    "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
432 -
433 -
    "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
434 -
435 -
    "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="],
436 -
437 -
    "@volar/language-core": ["@volar/language-core@2.4.27", "", { "dependencies": { "@volar/source-map": "2.4.27" } }, "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ=="],
438 -
439 -
    "@volar/source-map": ["@volar/source-map@2.4.27", "", {}, "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg=="],
440 -
441 -
    "@volar/typescript": ["@volar/typescript@2.4.27", "", { "dependencies": { "@volar/language-core": "2.4.27", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg=="],
442 -
443 -
    "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
444 -
445 -
    "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
446 -
447 -
    "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="],
448 -
449 -
    "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
450 -
451 -
    "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
452 -
453 -
    "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
454 -
455 -
    "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
456 -
457 -
    "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
458 -
459 -
    "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
460 -
461 -
    "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
462 -
463 -
    "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
464 -
465 -
    "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="],
466 -
467 -
    "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
468 -
469 -
    "astro": ["astro@5.16.7", "", { "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", "@astrojs/markdown-remark": "6.3.10", "@astrojs/telemetry": "3.3.0", "@capsizecss/unpack": "^4.0.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "acorn": "^8.15.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.3.1", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.1.1", "cssesc": "^3.0.0", "debug": "^4.4.3", "deterministic-object-hash": "^2.0.2", "devalue": "^5.6.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.7.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.4.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "magic-string": "^0.30.21", "magicast": "^0.5.1", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.1", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.3", "shiki": "^3.20.0", "smol-toml": "^1.6.0", "svgo": "^4.0.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6", "ultrahtml": "^1.6.0", "unifont": "~0.7.1", "unist-util-visit": "^5.0.0", "unstorage": "^1.17.3", "vfile": "^6.0.3", "vite": "^6.4.1", "vitefu": "^1.1.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.3", "zod": "^3.25.76", "zod-to-json-schema": "^3.25.1", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "astro.js" } }, "sha512-Kfv7FKisFR+THvmojXWtvJGRCvQ4D9przguE9XdeUtS464ned6hvbgmyFDvPzyaNmDtkHGNpPwAQ9tgFcVqp+Q=="],
470 -
471 -
    "autoprefixer": ["autoprefixer@10.4.23", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-lite": "^1.0.30001760", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA=="],
472 -
473 -
    "await-lock": ["await-lock@2.2.2", "", {}, "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw=="],
474 -
475 -
    "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
476 -
477 -
    "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
478 -
479 -
    "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="],
480 -
481 -
    "baseline-browser-mapping": ["baseline-browser-mapping@2.9.12", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-Mij6Lij93pTAIsSYy5cyBQ975Qh9uLEc5rwGTpomiZeXZL9yIS6uORJakb3ScHgfs0serMMfIbXzokPMuEiRyw=="],
482 -
483 -
    "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
484 -
485 -
    "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="],
486 -
487 -
    "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
488 -
489 -
    "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="],
490 -
491 -
    "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
492 -
493 -
    "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],
494 -
495 -
    "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="],
496 -
497 -
    "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="],
498 -
499 -
    "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="],
500 -
501 -
    "caniuse-lite": ["caniuse-lite@1.0.30001762", "", {}, "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw=="],
502 -
503 -
    "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
504 -
505 -
    "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
506 -
507 -
    "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
508 -
509 -
    "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
510 -
511 -
    "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
512 -
513 -
    "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="],
514 -
515 -
    "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
516 -
517 -
    "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="],
518 -
519 -
    "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
520 -
521 -
    "client": ["client@workspace:packages/client"],
522 -
523 -
    "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
524 -
525 -
    "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="],
526 -
527 -
    "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
528 -
529 -
    "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
530 -
531 -
    "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
532 -
533 -
    "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="],
534 -
535 -
    "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
536 -
537 -
    "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
538 -
539 -
    "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="],
540 -
541 -
    "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
542 -
543 -
    "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
544 -
545 -
    "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="],
546 -
547 -
    "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
548 -
549 -
    "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
550 -
551 -
    "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="],
552 -
553 -
    "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
554 -
555 -
    "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
556 -
557 -
    "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="],
558 -
559 -
    "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
560 -
561 -
    "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
562 -
563 -
    "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="],
564 -
565 -
    "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
566 -
567 -
    "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
568 -
569 -
    "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
570 -
571 -
    "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
572 -
573 -
    "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
574 -
575 -
    "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="],
576 -
577 -
    "devalue": ["devalue@5.6.1", "", {}, "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A=="],
578 -
579 -
    "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
580 -
581 -
    "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
582 -
583 -
    "diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="],
584 -
585 -
    "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
586 -
587 -
    "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
588 -
589 -
    "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
590 -
591 -
    "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
592 -
593 -
    "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
594 -
595 -
    "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="],
596 -
597 -
    "electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="],
598 -
599 -
    "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
600 -
601 -
    "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
602 -
603 -
    "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="],
604 -
605 -
    "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
606 -
607 -
    "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="],
608 -
609 -
    "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="],
610 -
611 -
    "esbuild": ["esbuild@0.27.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.0", "@esbuild/android-arm": "0.27.0", "@esbuild/android-arm64": "0.27.0", "@esbuild/android-x64": "0.27.0", "@esbuild/darwin-arm64": "0.27.0", "@esbuild/darwin-x64": "0.27.0", "@esbuild/freebsd-arm64": "0.27.0", "@esbuild/freebsd-x64": "0.27.0", "@esbuild/linux-arm": "0.27.0", "@esbuild/linux-arm64": "0.27.0", "@esbuild/linux-ia32": "0.27.0", "@esbuild/linux-loong64": "0.27.0", "@esbuild/linux-mips64el": "0.27.0", "@esbuild/linux-ppc64": "0.27.0", "@esbuild/linux-riscv64": "0.27.0", "@esbuild/linux-s390x": "0.27.0", "@esbuild/linux-x64": "0.27.0", "@esbuild/netbsd-arm64": "0.27.0", "@esbuild/netbsd-x64": "0.27.0", "@esbuild/openbsd-arm64": "0.27.0", "@esbuild/openbsd-x64": "0.27.0", "@esbuild/openharmony-arm64": "0.27.0", "@esbuild/sunos-x64": "0.27.0", "@esbuild/win32-arm64": "0.27.0", "@esbuild/win32-ia32": "0.27.0", "@esbuild/win32-x64": "0.27.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA=="],
612 -
613 -
    "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
614 -
615 -
    "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
616 -
617 -
    "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="],
618 -
619 -
    "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="],
620 -
621 -
    "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="],
622 -
623 -
    "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="],
624 -
625 -
    "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="],
626 -
627 -
    "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="],
628 -
629 -
    "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
630 -
631 -
    "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
632 -
633 -
    "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="],
634 -
635 -
    "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
636 -
637 -
    "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
638 -
639 -
    "fast-xml-parser": ["fast-xml-parser@5.3.3", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA=="],
640 -
641 -
    "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
642 -
643 -
    "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
644 -
645 -
    "feed": ["feed@5.1.0", "", { "dependencies": { "xml-js": "^1.6.11" } }, "sha512-qGNhgYygnefSkAHHrNHqC7p3R8J0/xQDS/cYUud8er/qD9EFGWyCdUDfULHTJQN1d3H3WprzVwMc9MfB4J50Wg=="],
646 -
647 -
    "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
648 -
649 -
    "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
650 -
651 -
    "fontace": ["fontace@0.4.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg=="],
652 -
653 -
    "fontkitten": ["fontkitten@1.0.0", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-b0RdzQeztiiUFWEDzq6Ka26qkNVNLCehoRtifOIGNbQ4CfxyYRh73fyWaQX/JshPVcueITOEeoSWPy5XQv8FUg=="],
654 -
655 -
    "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="],
656 -
657 -
    "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
658 -
659 -
    "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
660 -
661 -
    "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
662 -
663 -
    "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
664 -
665 -
    "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
666 -
667 -
    "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
668 -
669 -
    "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="],
670 -
671 -
    "h3": ["h3@1.15.4", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.2", "radix3": "^1.1.2", "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ=="],
672 -
673 -
    "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
674 -
675 -
    "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="],
676 -
677 -
    "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="],
678 -
679 -
    "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="],
680 -
681 -
    "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
682 -
683 -
    "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="],
684 -
685 -
    "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="],
686 -
687 -
    "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
688 -
689 -
    "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="],
690 -
691 -
    "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="],
692 -
693 -
    "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="],
694 -
695 -
    "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
696 -
697 -
    "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
698 -
699 -
    "hono": ["hono@4.11.3", "", {}, "sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w=="],
700 -
701 -
    "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="],
702 -
703 -
    "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
704 -
705 -
    "htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="],
706 -
707 -
    "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
708 -
709 -
    "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
710 -
711 -
    "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="],
712 -
713 -
    "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
714 -
715 -
    "is-absolute-url": ["is-absolute-url@4.0.1", "", {}, "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A=="],
716 -
717 -
    "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="],
718 -
719 -
    "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
720 -
721 -
    "is-arrayish": ["is-arrayish@0.3.4", "", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="],
722 -
723 -
    "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
724 -
725 -
    "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
726 -
727 -
    "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
728 -
729 -
    "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
730 -
731 -
    "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
732 -
733 -
    "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
734 -
735 -
    "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
736 -
737 -
    "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
738 -
739 -
    "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
740 -
741 -
    "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
742 -
743 -
    "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
744 -
745 -
    "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="],
746 -
747 -
    "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
748 -
749 -
    "iso-datestring-validator": ["iso-datestring-validator@2.2.2", "", {}, "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA=="],
750 -
751 -
    "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
752 -
753 -
    "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="],
754 -
755 -
    "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
756 -
757 -
    "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
758 -
759 -
    "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
760 -
761 -
    "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
762 -
763 -
    "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
764 -
765 -
    "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
766 -
767 -
    "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
768 -
769 -
    "linkify-it": ["linkify-it@5.0.0", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ=="],
770 -
771 -
    "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
772 -
773 -
    "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
774 -
775 -
    "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
776 -
777 -
    "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
778 -
779 -
    "magicast": ["magicast@0.5.1", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "source-map-js": "^1.2.1" } }, "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw=="],
780 -
781 -
    "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="],
782 -
783 -
    "markdown-it": ["markdown-it@14.1.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg=="],
784 -
785 -
    "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
786 -
787 -
    "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="],
788 -
789 -
    "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="],
790 -
791 -
    "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="],
792 -
793 -
    "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="],
794 -
795 -
    "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="],
796 -
797 -
    "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="],
798 -
799 -
    "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="],
800 -
801 -
    "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="],
802 -
803 -
    "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="],
804 -
805 -
    "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="],
806 -
807 -
    "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="],
808 -
809 -
    "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="],
810 -
811 -
    "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="],
812 -
813 -
    "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="],
814 -
815 -
    "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="],
816 -
817 -
    "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="],
818 -
819 -
    "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="],
820 -
821 -
    "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="],
822 -
823 -
    "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="],
824 -
825 -
    "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
826 -
827 -
    "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
828 -
829 -
    "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="],
830 -
831 -
    "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="],
832 -
833 -
    "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="],
834 -
835 -
    "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="],
836 -
837 -
    "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="],
838 -
839 -
    "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="],
840 -
841 -
    "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="],
842 -
843 -
    "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="],
844 -
845 -
    "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="],
846 -
847 -
    "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="],
848 -
849 -
    "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="],
850 -
851 -
    "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="],
852 -
853 -
    "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="],
854 -
855 -
    "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="],
856 -
857 -
    "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="],
858 -
859 -
    "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="],
860 -
861 -
    "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="],
862 -
863 -
    "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="],
864 -
865 -
    "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="],
866 -
867 -
    "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
868 -
869 -
    "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="],
870 -
871 -
    "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="],
872 -
873 -
    "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="],
874 -
875 -
    "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="],
876 -
877 -
    "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="],
878 -
879 -
    "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
880 -
881 -
    "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="],
882 -
883 -
    "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="],
884 -
885 -
    "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="],
886 -
887 -
    "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="],
888 -
889 -
    "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
890 -
891 -
    "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="],
892 -
893 -
    "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
894 -
895 -
    "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
896 -
897 -
    "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
898 -
899 -
    "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="],
900 -
901 -
    "miniflare": ["miniflare@4.20260107.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20260107.1", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "^3.25.76" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-X93sXczqbBq9ixoM6jnesmdTqp+4baVC/aM/DuPpRS0LK0XtcqaO75qPzNEvDEzBAHxwMAWRIum/9hg32YB8iA=="],
902 -
903 -
    "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
904 -
905 -
    "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
906 -
907 -
    "multiformats": ["multiformats@9.9.0", "", {}, "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="],
908 -
909 -
    "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
910 -
911 -
    "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
912 -
913 -
    "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="],
914 -
915 -
    "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="],
916 -
917 -
    "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
918 -
919 -
    "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="],
920 -
921 -
    "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],
922 -
923 -
    "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
924 -
925 -
    "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
926 -
927 -
    "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
928 -
929 -
    "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
930 -
931 -
    "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="],
932 -
933 -
    "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
934 -
935 -
    "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="],
936 -
937 -
    "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="],
938 -
939 -
    "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="],
940 -
941 -
    "p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="],
942 -
943 -
    "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="],
944 -
945 -
    "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
946 -
947 -
    "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
948 -
949 -
    "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="],
950 -
951 -
    "parse-srcset": ["parse-srcset@1.0.2", "", {}, "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="],
952 -
953 -
    "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
954 -
955 -
    "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
956 -
957 -
    "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
958 -
959 -
    "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
960 -
961 -
    "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
962 -
963 -
    "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="],
964 -
965 -
    "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
966 -
967 -
    "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
968 -
969 -
    "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
970 -
971 -
    "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
972 -
973 -
    "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
974 -
975 -
    "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="],
976 -
977 -
    "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="],
978 -
979 -
    "postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="],
980 -
981 -
    "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="],
982 -
983 -
    "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="],
984 -
985 -
    "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
986 -
987 -
    "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
988 -
989 -
    "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
990 -
991 -
    "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
992 -
993 -
    "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="],
994 -
995 -
    "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
996 -
997 -
    "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
998 -
999 -
    "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
1000 -
1001 -
    "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="],
1002 -
1003 -
    "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="],
1004 -
1005 -
    "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="],
1006 -
1007 -
    "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
1008 -
1009 -
    "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="],
1010 -
1011 -
    "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="],
1012 -
1013 -
    "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="],
1014 -
1015 -
    "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="],
1016 -
1017 -
    "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
1018 -
1019 -
    "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
1020 -
1021 -
    "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
1022 -
1023 -
    "rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="],
1024 -
1025 -
    "rehype-external-links": ["rehype-external-links@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-is-element": "^3.0.0", "is-absolute-url": "^4.0.0", "space-separated-tokens": "^2.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw=="],
1026 -
1027 -
    "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="],
1028 -
1029 -
    "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="],
1030 -
1031 -
    "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="],
1032 -
1033 -
    "rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="],
1034 -
1035 -
    "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="],
1036 -
1037 -
    "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="],
1038 -
1039 -
    "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="],
1040 -
1041 -
    "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="],
1042 -
1043 -
    "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="],
1044 -
1045 -
    "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
1046 -
1047 -
    "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
1048 -
1049 -
    "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="],
1050 -
1051 -
    "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="],
1052 -
1053 -
    "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="],
1054 -
1055 -
    "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="],
1056 -
1057 -
    "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
1058 -
1059 -
    "rollup": ["rollup@4.55.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.55.1", "@rollup/rollup-android-arm64": "4.55.1", "@rollup/rollup-darwin-arm64": "4.55.1", "@rollup/rollup-darwin-x64": "4.55.1", "@rollup/rollup-freebsd-arm64": "4.55.1", "@rollup/rollup-freebsd-x64": "4.55.1", "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", "@rollup/rollup-linux-arm-musleabihf": "4.55.1", "@rollup/rollup-linux-arm64-gnu": "4.55.1", "@rollup/rollup-linux-arm64-musl": "4.55.1", "@rollup/rollup-linux-loong64-gnu": "4.55.1", "@rollup/rollup-linux-loong64-musl": "4.55.1", "@rollup/rollup-linux-ppc64-gnu": "4.55.1", "@rollup/rollup-linux-ppc64-musl": "4.55.1", "@rollup/rollup-linux-riscv64-gnu": "4.55.1", "@rollup/rollup-linux-riscv64-musl": "4.55.1", "@rollup/rollup-linux-s390x-gnu": "4.55.1", "@rollup/rollup-linux-x64-gnu": "4.55.1", "@rollup/rollup-linux-x64-musl": "4.55.1", "@rollup/rollup-openbsd-x64": "4.55.1", "@rollup/rollup-openharmony-arm64": "4.55.1", "@rollup/rollup-win32-arm64-msvc": "4.55.1", "@rollup/rollup-win32-ia32-msvc": "4.55.1", "@rollup/rollup-win32-x64-gnu": "4.55.1", "@rollup/rollup-win32-x64-msvc": "4.55.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A=="],
1060 -
1061 -
    "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
1062 -
1063 -
    "sanitize-html": ["sanitize-html@2.17.0", "", { "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", "htmlparser2": "^8.0.0", "is-plain-object": "^5.0.0", "parse-srcset": "^1.0.2", "postcss": "^8.3.11" } }, "sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA=="],
1064 -
1065 -
    "sax": ["sax@1.4.3", "", {}, "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="],
1066 -
1067 -
    "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="],
1068 -
1069 -
    "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
1070 -
1071 -
    "server": ["server@workspace:packages/server"],
1072 -
1073 -
    "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="],
1074 -
1075 -
    "shiki": ["shiki@4.0.2", "", { "dependencies": { "@shikijs/core": "4.0.2", "@shikijs/engine-javascript": "4.0.2", "@shikijs/engine-oniguruma": "4.0.2", "@shikijs/langs": "4.0.2", "@shikijs/themes": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ=="],
1076 -
1077 -
    "simple-swizzle": ["simple-swizzle@0.2.4", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="],
1078 -
1079 -
    "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
1080 -
1081 -
    "sitemap": ["sitemap@8.0.2", "", { "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.4.1" }, "bin": { "sitemap": "dist/cli.js" } }, "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ=="],
1082 -
1083 -
    "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="],
1084 -
1085 -
    "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
1086 -
1087 -
    "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
1088 -
1089 -
    "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
1090 -
1091 -
    "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="],
1092 -
1093 -
    "stream-replace-string": ["stream-replace-string@2.0.0", "", {}, "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w=="],
1094 -
1095 -
    "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
1096 -
1097 -
    "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
1098 -
1099 -
    "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
1100 -
1101 -
    "strnum": ["strnum@2.1.2", "", {}, "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ=="],
1102 -
1103 -
    "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="],
1104 -
1105 -
    "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="],
1106 -
1107 -
    "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
1108 -
1109 -
    "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
1110 -
1111 -
    "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
1112 -
1113 -
    "svgo": ["svgo@4.0.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.4.1" }, "bin": "./bin/svgo.js" }, "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw=="],
1114 -
1115 -
    "tailwindcss": ["tailwindcss@3.4.19", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ=="],
1116 -
1117 -
    "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
1118 -
1119 -
    "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
1120 -
1121 -
    "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
1122 -
1123 -
    "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
1124 -
1125 -
    "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
1126 -
1127 -
    "tlds": ["tlds@1.261.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA=="],
1128 -
1129 -
    "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
1130 -
1131 -
    "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
1132 -
1133 -
    "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
1134 -
1135 -
    "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
1136 -
1137 -
    "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="],
1138 -
1139 -
    "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
1140 -
1141 -
    "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
1142 -
1143 -
    "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
1144 -
1145 -
    "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
1146 -
1147 -
    "ufo": ["ufo@1.6.2", "", {}, "sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q=="],
1148 -
1149 -
    "uint8arrays": ["uint8arrays@3.0.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA=="],
1150 -
1151 -
    "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="],
1152 -
1153 -
    "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
1154 -
1155 -
    "undici": ["undici@7.14.0", "", {}, "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ=="],
1156 -
1157 -
    "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="],
1158 -
1159 -
    "unicode-segmenter": ["unicode-segmenter@0.14.5", "", {}, "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g=="],
1160 -
1161 -
    "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
1162 -
1163 -
    "unifont": ["unifont@0.7.1", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-0lg9M1cMYvXof8//wZBq6EDEfbwv4++t7+dYpXeS2ypaLuZJmUFYEwTm412/1ED/Wfo/wyzSu6kNZEr9hgRNfg=="],
1164 -
1165 -
    "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="],
1166 -
1167 -
    "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
1168 -
1169 -
    "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="],
1170 -
1171 -
    "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
1172 -
1173 -
    "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="],
1174 -
1175 -
    "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="],
1176 -
1177 -
    "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
1178 -
1179 -
    "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
1180 -
1181 -
    "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="],
1182 -
1183 -
    "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="],
1184 -
1185 -
    "unstorage": ["unstorage@1.17.3", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", "destr": "^2.0.5", "h3": "^1.15.4", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q=="],
1186 -
1187 -
    "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
1188 -
1189 -
    "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
1190 -
1191 -
    "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
1192 -
1193 -
    "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
1194 -
1195 -
    "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
1196 -
1197 -
    "vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="],
1198 -
1199 -
    "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="],
1200 -
1201 -
    "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="],
1202 -
1203 -
    "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
1204 -
1205 -
    "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
1206 -
1207 -
    "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="],
1208 -
1209 -
    "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="],
1210 -
1211 -
    "workerd": ["workerd@1.20260107.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260107.1", "@cloudflare/workerd-darwin-arm64": "1.20260107.1", "@cloudflare/workerd-linux-64": "1.20260107.1", "@cloudflare/workerd-linux-arm64": "1.20260107.1", "@cloudflare/workerd-windows-64": "1.20260107.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-4ylAQJDdJZdMAUl2SbJgTa77YHpa88l6qmhiuCLNactP933+rifs7I0w1DslhUIFgydArUX5dNLAZnZhT7Bh7g=="],
1212 -
1213 -
    "wrangler": ["wrangler@4.58.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.1", "@cloudflare/unenv-preset": "2.8.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20260107.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260107.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260107.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-Jm6EYtlt8iUcznOCPSMYC54DYkwrMNESzbH0Vh3GFHv/7XVw5gBC13YJAB+nWMRGJ+6B2dMzy/NVQS4ONL51Pw=="],
1214 -
1215 -
    "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
1216 -
1217 -
    "ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="],
1218 -
1219 -
    "xml-js": ["xml-js@1.6.11", "", { "dependencies": { "sax": "^1.2.4" }, "bin": { "xml-js": "./bin/cli.js" } }, "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="],
1220 -
1221 -
    "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
1222 -
1223 -
    "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
1224 -
1225 -
    "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="],
1226 -
1227 -
    "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
1228 -
1229 -
    "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="],
1230 -
1231 -
    "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="],
1232 -
1233 -
    "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
1234 -
1235 -
    "youch": ["youch@4.1.0-beta.10", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.4", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.3" } }, "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="],
1236 -
1237 -
    "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="],
1238 -
1239 -
    "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
1240 -
1241 -
    "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
1242 -
1243 -
    "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="],
1244 -
1245 -
    "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
1246 -
1247 -
    "@astrojs/cloudflare/wrangler": ["wrangler@4.50.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", "@cloudflare/unenv-preset": "2.7.11", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", "miniflare": "4.20251118.1", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20251118.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20251118.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-+nuZuHZxDdKmAyXOSrHlciGshCoAPiy5dM+t6mEohWm7HpXvTHmWQGUf/na9jjWlWJHCJYOWzkA1P5HBJqrIEA=="],
1248 -
1249 -
    "@astrojs/markdown-remark/shiki": ["shiki@3.21.0", "", { "dependencies": { "@shikijs/core": "3.21.0", "@shikijs/engine-javascript": "3.21.0", "@shikijs/engine-oniguruma": "3.21.0", "@shikijs/langs": "3.21.0", "@shikijs/themes": "3.21.0", "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w=="],
1250 -
1251 -
    "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
1252 -
1253 -
    "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
1254 -
1255 -
    "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
1256 -
1257 -
    "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="],
1258 -
1259 -
    "@poppinss/colors/kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
1260 -
1261 -
    "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
1262 -
1263 -
    "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
1264 -
1265 -
    "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
1266 -
1267 -
    "astro/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
1268 -
1269 -
    "astro/sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
1270 -
1271 -
    "astro/shiki": ["shiki@3.21.0", "", { "dependencies": { "@shikijs/core": "3.21.0", "@shikijs/engine-javascript": "3.21.0", "@shikijs/engine-oniguruma": "3.21.0", "@shikijs/langs": "3.21.0", "@shikijs/themes": "3.21.0", "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w=="],
1272 -
1273 -
    "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1274 -
1275 -
    "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
1276 -
1277 -
    "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1278 -
1279 -
    "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
1280 -
1281 -
    "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
1282 -
1283 -
    "miniflare/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
1284 -
1285 -
    "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
1286 -
1287 -
    "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
1288 -
1289 -
    "postcss-nested/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="],
1290 -
1291 -
    "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
1292 -
1293 -
    "server/wrangler": ["wrangler@4.57.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.1", "@cloudflare/unenv-preset": "2.8.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20260103.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260103.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260103.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-JTVHmL2zr5PUJ22kT21fNXZBgVm4WzXSHsVc+VVIRANBVgTwn6EikXBx1DMyvHDQP6vkaojuyrRjeasB7rxV9A=="],
1294 -
1295 -
    "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
1296 -
1297 -
    "tailwindcss/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="],
1298 -
1299 -
    "unstorage/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
1300 -
1301 -
    "vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
1302 -
1303 -
    "@astrojs/cloudflare/wrangler/@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="],
1304 -
1305 -
    "@astrojs/cloudflare/wrangler/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.7.11", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251106.1" }, "optionalPeers": ["workerd"] }, "sha512-se23f1D4PxKrMKOq+Stz+Yn7AJ9ITHcEecXo2Yjb+UgbUDCEBch1FXQC6hx6uT5fNA3kmX3mfzeZiUmpK1W9IQ=="],
1306 -
1307 -
    "@astrojs/cloudflare/wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="],
1308 -
1309 -
    "@astrojs/cloudflare/wrangler/miniflare": ["miniflare@4.20251118.1", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20251118.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-uLSAE/DvOm392fiaig4LOaatxLjM7xzIniFRG5Y3yF9IduOYLLK/pkCPQNCgKQH3ou0YJRHnTN+09LPfqYNTQQ=="],
1310 -
1311 -
    "@astrojs/cloudflare/wrangler/workerd": ["workerd@1.20251118.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251118.0", "@cloudflare/workerd-darwin-arm64": "1.20251118.0", "@cloudflare/workerd-linux-64": "1.20251118.0", "@cloudflare/workerd-linux-arm64": "1.20251118.0", "@cloudflare/workerd-windows-64": "1.20251118.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-Om5ns0Lyx/LKtYI04IV0bjIrkBgoFNg0p6urzr2asekJlfP18RqFzyqMFZKf0i9Gnjtz/JfAS/Ol6tjCe5JJsQ=="],
1312 -
1313 -
    "@astrojs/markdown-remark/shiki/@shikijs/core": ["@shikijs/core@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA=="],
1314 -
1315 -
    "@astrojs/markdown-remark/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ=="],
1316 -
1317 -
    "@astrojs/markdown-remark/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ=="],
1318 -
1319 -
    "@astrojs/markdown-remark/shiki/@shikijs/langs": ["@shikijs/langs@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA=="],
1320 -
1321 -
    "@astrojs/markdown-remark/shiki/@shikijs/themes": ["@shikijs/themes@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw=="],
1322 -
1323 -
    "@astrojs/markdown-remark/shiki/@shikijs/types": ["@shikijs/types@3.21.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA=="],
1324 -
1325 -
    "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
1326 -
1327 -
    "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
1328 -
1329 -
    "astro/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
1330 -
1331 -
    "astro/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
1332 -
1333 -
    "astro/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
1334 -
1335 -
    "astro/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
1336 -
1337 -
    "astro/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
1338 -
1339 -
    "astro/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
1340 -
1341 -
    "astro/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
1342 -
1343 -
    "astro/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
1344 -
1345 -
    "astro/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
1346 -
1347 -
    "astro/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
1348 -
1349 -
    "astro/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
1350 -
1351 -
    "astro/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
1352 -
1353 -
    "astro/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
1354 -
1355 -
    "astro/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
1356 -
1357 -
    "astro/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
1358 -
1359 -
    "astro/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
1360 -
1361 -
    "astro/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
1362 -
1363 -
    "astro/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
1364 -
1365 -
    "astro/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
1366 -
1367 -
    "astro/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
1368 -
1369 -
    "astro/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
1370 -
1371 -
    "astro/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
1372 -
1373 -
    "astro/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
1374 -
1375 -
    "astro/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
1376 -
1377 -
    "astro/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
1378 -
1379 -
    "astro/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
1380 -
1381 -
    "astro/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="],
1382 -
1383 -
    "astro/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="],
1384 -
1385 -
    "astro/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
1386 -
1387 -
    "astro/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
1388 -
1389 -
    "astro/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
1390 -
1391 -
    "astro/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
1392 -
1393 -
    "astro/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
1394 -
1395 -
    "astro/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
1396 -
1397 -
    "astro/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
1398 -
1399 -
    "astro/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
1400 -
1401 -
    "astro/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="],
1402 -
1403 -
    "astro/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="],
1404 -
1405 -
    "astro/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="],
1406 -
1407 -
    "astro/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="],
1408 -
1409 -
    "astro/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="],
1410 -
1411 -
    "astro/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="],
1412 -
1413 -
    "astro/sharp/@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
1414 -
1415 -
    "astro/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
1416 -
1417 -
    "astro/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
1418 -
1419 -
    "astro/shiki/@shikijs/core": ["@shikijs/core@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA=="],
1420 -
1421 -
    "astro/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ=="],
1422 -
1423 -
    "astro/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ=="],
1424 -
1425 -
    "astro/shiki/@shikijs/langs": ["@shikijs/langs@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA=="],
1426 -
1427 -
    "astro/shiki/@shikijs/themes": ["@shikijs/themes@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw=="],
1428 -
1429 -
    "astro/shiki/@shikijs/types": ["@shikijs/types@3.21.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA=="],
1430 -
1431 -
    "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
1432 -
1433 -
    "server/wrangler/miniflare": ["miniflare@4.20260103.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20260103.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "^3.25.76" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-iuSU0e+KMuFD7gxuPKoJXFi6cvDu/w/lQP4Wayq3v+YsmZ0dVMAJY9LMZ0TKMLicdAj2So9WcReAhJmJJ9Ppnw=="],
1434 -
1435 -
    "server/wrangler/workerd": ["workerd@1.20260103.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260103.0", "@cloudflare/workerd-darwin-arm64": "1.20260103.0", "@cloudflare/workerd-linux-64": "1.20260103.0", "@cloudflare/workerd-linux-arm64": "1.20260103.0", "@cloudflare/workerd-windows-64": "1.20260103.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-uB5eliFHVCdPD3uaPGe6zNRFjWzijOb26c0/1oXKmQFUSUR7GFPCTTd0iJXZAGKZDZ0DNgzQCPoolWelz6W5Zg=="],
1436 -
1437 -
    "unstorage/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
1438 -
1439 -
    "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
1440 -
1441 -
    "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
1442 -
1443 -
    "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
1444 -
1445 -
    "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
1446 -
1447 -
    "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
1448 -
1449 -
    "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
1450 -
1451 -
    "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
1452 -
1453 -
    "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
1454 -
1455 -
    "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
1456 -
1457 -
    "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
1458 -
1459 -
    "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
1460 -
1461 -
    "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
1462 -
1463 -
    "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
1464 -
1465 -
    "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
1466 -
1467 -
    "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
1468 -
1469 -
    "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
1470 -
1471 -
    "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
1472 -
1473 -
    "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
1474 -
1475 -
    "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
1476 -
1477 -
    "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
1478 -
1479 -
    "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
1480 -
1481 -
    "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
1482 -
1483 -
    "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
1484 -
1485 -
    "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
1486 -
1487 -
    "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
1488 -
1489 -
    "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
1490 -
1491 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="],
1492 -
1493 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="],
1494 -
1495 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="],
1496 -
1497 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="],
1498 -
1499 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="],
1500 -
1501 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="],
1502 -
1503 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="],
1504 -
1505 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="],
1506 -
1507 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="],
1508 -
1509 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="],
1510 -
1511 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="],
1512 -
1513 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="],
1514 -
1515 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="],
1516 -
1517 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="],
1518 -
1519 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="],
1520 -
1521 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="],
1522 -
1523 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="],
1524 -
1525 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="],
1526 -
1527 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="],
1528 -
1529 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="],
1530 -
1531 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="],
1532 -
1533 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="],
1534 -
1535 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="],
1536 -
1537 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="],
1538 -
1539 -
    "@astrojs/cloudflare/wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="],
1540 -
1541 -
    "@astrojs/cloudflare/wrangler/miniflare/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
1542 -
1543 -
    "@astrojs/cloudflare/wrangler/miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="],
1544 -
1545 -
    "@astrojs/cloudflare/wrangler/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20251118.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-UmWmYEYS/LkK/4HFKN6xf3Hk8cw70PviR+ftr3hUvs9HYZS92IseZEp16pkL6ZBETrPRpZC7OrzoYF7ky6kHsg=="],
1546 -
1547 -
    "@astrojs/cloudflare/wrangler/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20251118.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RockU7Qzf4rxNfY1lx3j4rvwutNLjTIX7rr2hogbQ4mzLo8Ea40/oZTzXVxl+on75joLBrt0YpenGW8o/r44QA=="],
1548 -
1549 -
    "@astrojs/cloudflare/wrangler/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20251118.0", "", { "os": "linux", "cpu": "x64" }, "sha512-aT97GnOAbJDuuOG0zPVhgRk0xFtB1dzBMrxMZ09eubDLoU4djH4BuORaqvxNRMmHgKfa4T6drthckT0NjUvBdw=="],
1550 -
1551 -
    "@astrojs/cloudflare/wrangler/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20251118.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-bXZPJcwlq00MPOXqP7DMWjr+goYj0+Fqyw6zgEC2M3FR1+SWla4yjghnZ4IdpN+H1t7VbUrsi5np2LzMUFs0NA=="],
1552 -
1553 -
    "@astrojs/cloudflare/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20251118.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2LV99AHSlpr8WcCb/BYbU2QsYkXLUL1izN6YKWkN9Eibv80JKX0RtgmD3dfmajE5sNvClavxZejgzVvHD9N9Ag=="],
1554 -
1555 -
    "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
1556 -
1557 -
    "server/wrangler/miniflare/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
1558 -
1559 -
    "server/wrangler/workerd/@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260103.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-jhpwADN14T+plfDt3ljYAJL2+nTdTJQ3I/OpedweOz1l2jYZITRD+EI0zUpOzGJRqCE1k5SCkHUXINsWaE6aKg=="],
1560 -
1561 -
    "server/wrangler/workerd/@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260103.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RoVMzq+TMoKTPr0aewwRasJumMqNYlBJuTC7ZwPAjfjuqedkLfvLx8GsXkW5zpyUMEsUciRh4DPJfDPKVgAy9g=="],
1562 -
1563 -
    "server/wrangler/workerd/@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260103.0", "", { "os": "linux", "cpu": "x64" }, "sha512-JQN4FnsTiBgtLF/9ABcgJjew+QxonE3ZxnqCT355x45mksJuArjD2iZ4kLZQ16OSEAkno8fmVw0VvljdGd41kg=="],
1564 -
1565 -
    "server/wrangler/workerd/@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260103.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-kjMHGrnnZrOyQnXuJ8YpblKtjkv45o+utIYk4AZUoaUBbEltwn7CXucDa0MG0jsDDvCCwRabdaJSAXHV6JB/ZQ=="],
1566 -
1567 -
    "server/wrangler/workerd/@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260103.0", "", { "os": "win32", "cpu": "x64" }, "sha512-M7mZHV6uWVE+Mf8r/nT6/21N1+Z4JmZTPJjek3rB4n7netOJGZIUQwyuY+5gwOnq+qJsqHoU/RP7b4lFSoMZuQ=="],
1568 -
  }
1569 -
}
package.json +42 −11
1 1
{
2 -
	"name": "stevedylan.dev",
2 +
	"name": "client",
3 +
	"version": "1.0.0",
3 4
	"private": true,
4 -
	"workspaces": ["packages/*"],
5 5
	"scripts": {
6 -
		"dev": "bun run --filter '*' dev",
7 -
		"dev:client": "bun run --filter client dev",
8 -
		"dev:server": "bun run --filter server dev",
9 -
		"build": "bun run --filter '*' build",
10 -
		"build:client": "bun run --filter client build",
11 -
		"build:server": "bun run --filter server build",
12 -
		"deploy": "bun run --filter '*' deploy",
13 -
		"deploy:client": "bun run --filter client deploy",
14 -
		"deploy:server": "bun run --filter server deploy"
6 +
		"dev": "astro dev",
7 +
		"start": "astro dev",
8 +
		"sync": "astro sync",
9 +
		"build": "astro build",
10 +
		"preview": "astro preview",
11 +
		"format": "biome format --write src package.json",
12 +
		"deploy": "bun run build && wrangler pages deploy dist",
13 +
		"parse:birds": "bun run scripts/parse-birds.ts"
14 +
	},
15 +
	"devDependencies": {
16 +
		"@astrojs/mdx": "4.3.13",
17 +
		"@astrojs/sitemap": "3.6.1",
18 +
		"@astrojs/tailwind": "6.0.2",
19 +
		"@biomejs/biome": "2.1.1",
20 +
		"@tailwindcss/aspect-ratio": "^0.4.2",
21 +
		"@tailwindcss/typography": "^0.5.8",
22 +
		"@types/bun": "^1.3.6",
23 +
		"@types/markdown-it": "^14.1.2",
24 +
		"@types/sanitize-html": "^2.16.0",
25 +
		"autoprefixer": "^10.4.13",
26 +
		"postcss": "^8.4.21",
27 +
		"tailwindcss": "^3.4.7",
28 +
		"typescript": "^5.6.2",
29 +
		"wrangler": "^4.58.0"
30 +
	},
31 +
	"dependencies": {
32 +
		"@astrojs/cloudflare": "12.6.12",
33 +
		"@astrojs/react": "4.4.2",
34 +
		"@astrojs/rss": "4.0.14",
35 +
		"@astrojs/ts-plugin": "1.10.6",
36 +
		"@types/react": "^18.3.8",
37 +
		"@types/react-dom": "^18.3.0",
38 +
		"astro": "5.16.7",
39 +
		"markdown-it": "^14.1.0",
40 +
		"react": "^18.3.1",
41 +
		"react-dom": "^18.3.1",
42 +
		"rehype-external-links": "^3.0.0",
43 +
		"sanitize-html": "^2.17.0",
44 +
		"sharp": "^0.33.1",
45 +
		"shiki": "^4.0.2"
15 46
	}
16 47
}
packages/client/.gitignore (deleted) +0 −1
1 -
MyEBirdData.csv
packages/client/.sequoia-state.json (deleted) +0 −256
1 -
{
2 -
  "posts": {
3 -
    "src/content/post/back-to-basic.mdx": {
4 -
      "contentHash": "dced34604b582ac4631db5aafe33e3d90089bd3429e463ae2543e8b4e85ffad5",
5 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mggpic7sdd2h",
6 -
      "lastPublished": "2026-03-06T05:00:00.000Z",
7 -
      "slug": "back-to-basic"
8 -
    },
9 -
    "src/content/post/programmers-on-the-verge-of-extinction.mdx": {
10 -
      "contentHash": "0077e0d782061bb84c60967e481578240b3f854b903e607fbe634b733bfc6ee9",
11 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mfv2rjkplk2h",
12 -
      "lastPublished": "2026-02-27T05:00:00.000Z",
13 -
      "slug": "programmers-on-the-verge-of-extinction"
14 -
    },
15 -
    "src/content/post/the-power-of-dedicated-gateways.mdx": {
16 -
      "contentHash": "0049e5f9848c92a124214718178cd218b80f153cbeade00527e83781f0494243",
17 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvutcycf2v",
18 -
      "lastPublished": "2022-02-10T05:00:00.000Z",
19 -
      "slug": "the-power-of-dedicated-gateways"
20 -
    },
21 -
    "src/content/post/how-to-offset-NFT-emissions.mdx": {
22 -
      "contentHash": "afa6abe84fa1520252ca4559f110d7ca4269fc69732b800a906119de77e96686",
23 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvut7d4f2v",
24 -
      "lastPublished": "2022-04-22T04:00:00.000Z",
25 -
      "slug": "how-to-offset-nft-emissions"
26 -
    },
27 -
    "src/content/post/3d-solana-nfts.mdx": {
28 -
      "contentHash": "c8bcdcc72a18c53c5d1ad0c0835f1683c47571d29988418ff169a7b64ffadf01",
29 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvut5khv2v",
30 -
      "lastPublished": "2022-05-18T04:00:00.000Z",
31 -
      "slug": "3d-solana-nfts"
32 -
    },
33 -
    "src/content/post/resizing-ipfs-images.mdx": {
34 -
      "contentHash": "9f4a3b64b2c2f5af972204e70ac8456925d9b0c8afef3fc9ac7dd3451c3ff267",
35 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvut3ovn2v",
36 -
      "lastPublished": "2022-06-23T04:00:00.000Z",
37 -
      "slug": "resizing-ipfs-images"
38 -
    },
39 -
    "src/content/post/beginners-guide-to-ipfs.mdx": {
40 -
      "contentHash": "1738d00f8b70132fe6fd859f428dd74c3207030f3b27cfdf90006fd69cec0f6b",
41 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvusztdf2v",
42 -
      "lastPublished": "2022-10-07T04:00:00.000Z",
43 -
      "slug": "beginners-guide-to-ipfs"
44 -
    },
45 -
    "src/content/post/case-for-ipfs-on-l1-chains.mdx": {
46 -
      "contentHash": "31bb805e67a5fd599830cdbe379c2da9dc77e2a61105edd1a8cbd8d85b5a4882",
47 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvusuqan2v",
48 -
      "lastPublished": "2022-12-06T05:00:00.000Z",
49 -
      "slug": "case-for-ipfs-on-l1-chains"
50 -
    },
51 -
    "src/content/post/3d-nft-resume.mdx": {
52 -
      "contentHash": "e54863264ab98ead0653f75ac24d70b01c2cbb5543113ed04df72e2bec33650a",
53 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvussqrf2v",
54 -
      "lastPublished": "2023-01-10T05:00:00.000Z",
55 -
      "slug": "3d-nft-resume"
56 -
    },
57 -
    "src/content/post/how-to-mint-on-sui.mdx": {
58 -
      "contentHash": "34927db597a951650cc6e7d2cd5e5d278df0d8d48aef7a8f351798c2612dff7f",
59 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvusolxf2v",
60 -
      "lastPublished": "2023-02-27T05:00:00.000Z",
61 -
      "slug": "how-to-mint-on-sui"
62 -
    },
63 -
    "src/content/post/my-developer-journey.md": {
64 -
      "contentHash": "49bace7b3b4c147edb9c05631652d0b39e3a8ba6bc6886988094f49e53793d04",
65 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvusmkjn2v",
66 -
      "lastPublished": "2023-02-28T05:00:00.000Z",
67 -
      "slug": "my-developer-journey"
68 -
    },
69 -
    "src/content/post/arc-internet.mdx": {
70 -
      "contentHash": "c3aa3810b085a9dd9020c4302dd04a7fa6eb8887607c0d3bf3f501f5f7478262",
71 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuskpwn2v",
72 -
      "lastPublished": "2023-03-08T05:00:00.000Z",
73 -
      "slug": "arc-internet"
74 -
    },
75 -
    "src/content/post/48-hours-disconnected.mdx": {
76 -
      "contentHash": "b0d632a60f95724783ac205f09cc6e52afdb9f76d167bb961f32bf7264e067cb",
77 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvusirgn2v",
78 -
      "lastPublished": "2023-05-02T04:00:00.000Z",
79 -
      "slug": "48-hours-disconnected"
80 -
    },
81 -
    "src/content/post/how-to-create-a-weekly-photo-zine.mdx": {
82 -
      "contentHash": "80079d77779c443a703b05feb1da32dc565432f765ca5e258e315fc68bf4c0de",
83 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvusgpyv2v",
84 -
      "lastPublished": "2023-06-08T04:00:00.000Z",
85 -
      "slug": "how-to-create-a-weekly-photo-zine"
86 -
    },
87 -
    "src/content/post/how-to-migrate-from-neovim-to-vscode.mdx": {
88 -
      "contentHash": "0b19444c34b821b6bb9f1be0863918855024b66fa08d457fbca2785f116c9f32",
89 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuseriv2v",
90 -
      "lastPublished": "2023-07-06T04:00:00.000Z",
91 -
      "slug": "how-to-migrate-from-neovim-to-vscode"
92 -
    },
93 -
    "src/content/post/How To Run Your Own IPFS Gateway.mdx": {
94 -
      "contentHash": "7e61fa3bfb77f72d2a6863e603095608157ed45a50583cdf281982a89fe6ce94",
95 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvus7pff2v",
96 -
      "lastPublished": "2023-10-10T00:00:00.000Z",
97 -
      "slug": "how-to-run-your-own-ipfs-gateway"
98 -
    },
99 -
    "src/content/post/How to Encrypt and Decrypt Files on IPFS Using Lit.md": {
100 -
      "contentHash": "4ed99c9b13c6d64dc3e8a1151b664de8335738f68d8d3254f2961c0e6710621b",
101 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvus3hnn2v",
102 -
      "lastPublished": "2023-11-04T04:00:00.000Z",
103 -
      "slug": "how-to-encrypt-and-decrypt-files-on-ipfs-using-lit"
104 -
    },
105 -
    "src/content/post/why-i-learned-vim.mdx": {
106 -
      "contentHash": "58c0a48983183589d4f0175d6c994dcbcfb0f04572370a9a48dfa0a5e504687a",
107 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvurxbuf2v",
108 -
      "lastPublished": "2024-01-05T05:00:00.000Z",
109 -
      "slug": "why-i-learned-vim"
110 -
    },
111 -
    "src/content/post/a-terminal-based-workflow.mdx": {
112 -
      "contentHash": "ec3532e9aaef9466849e34089b09fb5e2363aad90d85f0d5f61e7329bdea7206",
113 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvurvdef2v",
114 -
      "lastPublished": "2024-03-06T05:00:00.000Z",
115 -
      "slug": "a-terminal-based-workflow"
116 -
    },
117 -
    "src/content/post/building-snippets-so.mdx": {
118 -
      "contentHash": "676ad30c25c02d980a530cf01a0b1ae2aac6cb2aca8325b93ab68238b43319ab",
119 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvurteuf2v",
120 -
      "lastPublished": "2024-08-02T04:00:00.000Z",
121 -
      "slug": "building-snippets-so"
122 -
    },
123 -
    "src/content/post/leaving-neovim-for-zed.mdx": {
124 -
      "contentHash": "52715d1e88dd8db9921222e7b58b9c2cfb8ad3a3860174915ff3e7f9e19bc222",
125 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvurqlyn2v",
126 -
      "lastPublished": "2024-08-16T04:00:00.000Z",
127 -
      "slug": "leaving-neovim-for-zed"
128 -
    },
129 -
    "src/content/post/building-a-guestbook-with-pglite-clerk-and-pinata.mdx": {
130 -
      "contentHash": "720a4d301ca8edf109317703943af40f1cc156429286c0558531306f271f381a",
131 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvurhwnn2v",
132 -
      "lastPublished": "2024-09-24T04:00:00.000Z",
133 -
      "slug": "building-a-guestbook-with-pglite-clerk-and-pinata"
134 -
    },
135 -
    "src/content/post/why-you-should-learn-jq-in-2024.mdx": {
136 -
      "contentHash": "74263c4d4b8b320279582ab717f8d13fdd822302592431ff61131eeecf9d7892",
137 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvurdwpv2v",
138 -
      "lastPublished": "2024-10-12T04:00:00.000Z",
139 -
      "slug": "why-you-should-learn-jq-in-2024"
140 -
    },
141 -
    "src/content/post/vibe-coding-and-kodak-cameras.mdx": {
142 -
      "contentHash": "17d0932eac5ba08ae666f01a6c20faf43f1f8121904048fa3b742059b0886333",
143 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvur3ysv2v",
144 -
      "lastPublished": "2025-03-30T04:00:00.000Z",
145 -
      "slug": "vibe-coding-and-kodak-cameras"
146 -
    },
147 -
    "src/content/post/learning-rust-with-ai.mdx": {
148 -
      "contentHash": "6fb67a72bff6b72d8beb117242abe882edf56555b5036d710135efcc8f5301d8",
149 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuqzawf2v",
150 -
      "lastPublished": "2025-07-11T04:00:00.000Z",
151 -
      "slug": "learning-rust-with-ai"
152 -
    },
153 -
    "src/content/post/the-meaning-of-life.mdx": {
154 -
      "contentHash": "5fe508620a2cb861bb6c13a72da1a052822504f4348ebc83bb2d36ce881c1ad0",
155 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuqqzav2v",
156 -
      "lastPublished": "2025-08-15T04:00:00.000Z",
157 -
      "slug": "the-meaning-of-life"
158 -
    },
159 -
    "src/content/post/turning-natspec-into-markdown-ui.mdx": {
160 -
      "contentHash": "1947cb4d75885eb6c7f6b1b830d72e7dccb2cd9fa0dddac5e4d33801432d5b54",
161 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuqmxen2v",
162 -
      "lastPublished": "2025-08-31T04:00:00.000Z",
163 -
      "slug": "turning-natspec-into-markdown-ui"
164 -
    },
165 -
    "src/content/post/resurrect-the-old-web.mdx": {
166 -
      "contentHash": "00bef41b408ae240a9753a09c361121ef6d11cd13e5a64419b01befb0ccc172c",
167 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuqbfav2v",
168 -
      "lastPublished": "2025-09-23T04:00:00.000Z",
169 -
      "slug": "resurrect-the-old-web"
170 -
    },
171 -
    "src/content/post/when-ai-gives-the-ick.mdx": {
172 -
      "contentHash": "9f79fa67376c39951c019a21e16d397e26249b0ee30ceb330e436268779e18db",
173 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuq2x752v",
174 -
      "lastPublished": "2025-10-03T04:00:00.000Z",
175 -
      "slug": "when-ai-gives-the-ick"
176 -
    },
177 -
    "src/content/post/programming-bowls.mdx": {
178 -
      "contentHash": "e551a3cd78f8b115b1314a2dec6b5e111e67d075a4a2a159afe939509c71f1af",
179 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuposjn2v",
180 -
      "lastPublished": "2025-10-16T04:00:00.000Z",
181 -
      "slug": "programming-bowls"
182 -
    },
183 -
    "src/content/post/concerning-omarchy-and-distro-philosophy.mdx": {
184 -
      "contentHash": "8c597d97e15b3a503fd0d77a7789c76599c2f537b7e1be6a29627ee3b7af8c55",
185 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvupkguv2v",
186 -
      "lastPublished": "2025-11-09T05:00:00.000Z",
187 -
      "slug": "concerning-omarchy-and-distro-philosophy"
188 -
    },
189 -
    "src/content/post/introducing-alcove.mdx": {
190 -
      "contentHash": "3ed76d60690fb192cdfa3a670360fd83d0031c88a64645d99520a772dfecc81a",
191 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvupi6mf2v",
192 -
      "lastPublished": "2025-11-23T05:00:00.000Z",
193 -
      "slug": "introducing-alcove"
194 -
    },
195 -
    "src/content/post/how-gemini-gives-me-hope.mdx": {
196 -
      "contentHash": "5df336c1bc0767ce164ca4ede25233bc6a189df7da0fb712527ffdf4c6d51c35",
197 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvupdcef2v",
198 -
      "lastPublished": "2025-12-18T05:00:00.000Z",
199 -
      "slug": "how-gemini-gives-me-hope"
200 -
    },
201 -
    "src/content/post/2026-site-plans.mdx": {
202 -
      "contentHash": "fafc451b6b4847309b61b9b294a60680b588251216ef4669e55459a039702f47",
203 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvup73lv2v",
204 -
      "lastPublished": "2026-01-01T05:00:00.000Z",
205 -
      "slug": "2026-site-plans"
206 -
    },
207 -
    "src/content/post/using-atproto-for-posse.mdx": {
208 -
      "contentHash": "cedbab5668b69de3f00c4b559d0ab91815ca07163f6f763407f7b1285d63178d",
209 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvup2mzf2v",
210 -
      "lastPublished": "2026-01-05T05:00:00.000Z",
211 -
      "slug": "using-atproto-for-posse"
212 -
    },
213 -
    "src/content/post/standard-site-the-publishing-gateway.mdx": {
214 -
      "contentHash": "6b237f9d35c9e6d1f67b841ee98ed05a2093d6019965f4a759976589588e8fe4",
215 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuovxm52v",
216 -
      "lastPublished": "2026-01-11T05:00:00.000Z",
217 -
      "slug": "standard-site-the-publishing-gateway"
218 -
    },
219 -
    "src/content/post/atproto-starter.mdx": {
220 -
      "contentHash": "3711525540806f7456ca1eec9df4902dc0a3b1ab5df853a86bdf71018ccd63ca",
221 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mcxxqjgspk26",
222 -
      "lastPublished": "2026-01-21T05:00:00.000Z",
223 -
      "slug": "atproto-starter"
224 -
    },
225 -
    "src/content/post/introducing-sequoia.mdx": {
226 -
      "contentHash": "3fdd4e2604e3fe78b9b7655b8fa2e818edd27e9cb5e43dde5be357264f5a27b5",
227 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mdzvuohmmn2v",
228 -
      "lastPublished": "2026-01-30T05:00:00.000Z",
229 -
      "slug": "introducing-sequoia"
230 -
    },
231 -
    "src/content/post/building-personal-software-in-rust.mdx": {
232 -
      "contentHash": "46e0374aaa161e5736df35264f60479f1ecd02d7aa682cafb06adba7e29bdb99",
233 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mjvh4pgklc2q",
234 -
      "lastPublished": "2026-04-27T01:23:26.125Z",
235 -
      "slug": "building-personal-software-in-rust"
236 -
    },
237 -
    "src/content/post/indexing-standard-site.mdx": {
238 -
      "contentHash": "62676d3786fddc9a3adae7f95464f06cde54997cbb676900c5636566c315217d",
239 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mjvh4pmxns2q",
240 -
      "lastPublished": "2026-04-20T02:44:00.270Z",
241 -
      "slug": "indexing-standard-site"
242 -
    },
243 -
    "src/content/post/returning-to-neovim.mdx": {
244 -
      "contentHash": "365416317f801b062fb04ded20284710e1e09c0df5c288f283a91ae964db9ea4",
245 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mjvh4prebs2q",
246 -
      "lastPublished": "2026-04-20T02:44:00.422Z",
247 -
      "slug": "returning-to-neovim"
248 -
    },
249 -
    "src/content/post/spring-website-updates.mdx": {
250 -
      "contentHash": "5e33edc09b9082301a0056439164bf0ecb54523056b4348e966ee65869380b94",
251 -
      "atUri": "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.document/3mkgvv37nsk2q",
252 -
      "lastPublished": "2026-04-27T01:23:25.640Z",
253 -
      "slug": "spring-website-updates"
254 -
    }
255 -
  }
256 -
}
packages/client/astro.config.mjs → astro.config.mjs +0 −0
packages/client/biome.json → biome.json +0 −0
packages/client/darkmatter.json → darkmatter.json +0 −0
packages/client/package.json (deleted) +0 −47
1 -
{
2 -
	"name": "client",
3 -
	"version": "1.0.0",
4 -
	"private": true,
5 -
	"scripts": {
6 -
		"dev": "astro dev",
7 -
		"start": "astro dev",
8 -
		"sync": "astro sync",
9 -
		"build": "astro build",
10 -
		"preview": "astro preview",
11 -
		"format": "biome format --write src package.json",
12 -
		"deploy": "bun run build && wrangler pages deploy dist",
13 -
		"parse:birds": "bun run scripts/parse-birds.ts"
14 -
	},
15 -
	"devDependencies": {
16 -
		"@astrojs/mdx": "4.3.13",
17 -
		"@astrojs/sitemap": "3.6.1",
18 -
		"@astrojs/tailwind": "6.0.2",
19 -
		"@biomejs/biome": "2.1.1",
20 -
		"@tailwindcss/aspect-ratio": "^0.4.2",
21 -
		"@tailwindcss/typography": "^0.5.8",
22 -
		"@types/bun": "^1.3.6",
23 -
		"@types/markdown-it": "^14.1.2",
24 -
		"@types/sanitize-html": "^2.16.0",
25 -
		"autoprefixer": "^10.4.13",
26 -
		"postcss": "^8.4.21",
27 -
		"tailwindcss": "^3.4.7",
28 -
		"typescript": "^5.6.2",
29 -
		"wrangler": "^4.58.0"
30 -
	},
31 -
	"dependencies": {
32 -
		"@astrojs/cloudflare": "12.6.12",
33 -
		"@astrojs/react": "4.4.2",
34 -
		"@astrojs/rss": "4.0.14",
35 -
		"@astrojs/ts-plugin": "1.10.6",
36 -
		"@types/react": "^18.3.8",
37 -
		"@types/react-dom": "^18.3.0",
38 -
		"astro": "5.16.7",
39 -
		"markdown-it": "^14.1.0",
40 -
		"react": "^18.3.1",
41 -
		"react-dom": "^18.3.1",
42 -
		"rehype-external-links": "^3.0.0",
43 -
		"sanitize-html": "^2.17.0",
44 -
		"sharp": "^0.33.1",
45 -
		"shiki": "^4.0.2"
46 -
	}
47 -
}
packages/client/postcss.config.js → postcss.config.js +0 −0
packages/client/public/.well-known/.gitkeep → public/.well-known/.gitkeep +0 −0

Binary file — no preview.

packages/client/public/.well-known/site.standard.publication → public/.well-known/site.standard.publication +0 −0
packages/client/public/CommitMono-400-Regular.otf → public/CommitMono-400-Regular.otf +0 −0

Binary file — no preview.

packages/client/public/CommitMono-700-Regular.otf → public/CommitMono-700-Regular.otf +0 −0

Binary file — no preview.

packages/client/public/_redirects → public/_redirects +0 −0
packages/client/public/android-chrome-192x192.png → public/android-chrome-192x192.png +0 −0

Binary file — no preview.

packages/client/public/android-chrome-512x512.png → public/android-chrome-512x512.png +0 −0

Binary file — no preview.

packages/client/public/apple-touch-icon.png → public/apple-touch-icon.png +0 −0

Binary file — no preview.

packages/client/public/audio/ack.mp3 → public/audio/ack.mp3 +0 −0

Binary file — no preview.

packages/client/public/audio/airhorn.mp3 → public/audio/airhorn.mp3 +0 −0

Binary file — no preview.

packages/client/public/audio/anime-wow.mp3 → public/audio/anime-wow.mp3 +0 −0

Binary file — no preview.

packages/client/public/audio/boom.mp3 → public/audio/boom.mp3 +0 −0

Binary file — no preview.

packages/client/public/audio/bruh.mp3 → public/audio/bruh.mp3 +0 −0

Binary file — no preview.

packages/client/public/audio/lizard.mp3 → public/audio/lizard.mp3 +0 −0

Binary file — no preview.

packages/client/public/blog-images/assistant-panel.mp4 → public/blog-images/assistant-panel.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/buffers.mp4 → public/blog-images/buffers.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/center-terminal.mp4 → public/blog-images/center-terminal.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/completions.mp4 → public/blog-images/completions.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/git-integrations.mp4 → public/blog-images/git-integrations.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/inline-assistant.mp4 → public/blog-images/inline-assistant.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/jetstream-and-cloudflare.svg → public/blog-images/jetstream-and-cloudflare.svg +0 −0
packages/client/public/blog-images/lazygit.mp4 → public/blog-images/lazygit.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/lsp-completions.mp4 → public/blog-images/lsp-completions.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/mini-completion.mp4 → public/blog-images/mini-completion.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/mini-files.mp4 → public/blog-images/mini-files.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/mini-pick-files.mp4 → public/blog-images/mini-pick-files.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/neotree.mp4 → public/blog-images/neotree.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/nvim-diagnostics.mp4 → public/blog-images/nvim-diagnostics.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/nvim-find.mp4 → public/blog-images/nvim-find.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/project-search.mp4 → public/blog-images/project-search.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/sesh.mp4 → public/blog-images/sesh.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/standard-site-challenge-1.svg → public/blog-images/standard-site-challenge-1.svg +0 −0
packages/client/public/blog-images/standard-site-challenge-2.svg → public/blog-images/standard-site-challenge-2.svg +0 −0
packages/client/public/blog-images/switch-projects.mp4 → public/blog-images/switch-projects.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/tab-switcher.mp4 → public/blog-images/tab-switcher.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/tap-and-cloudflare.svg → public/blog-images/tap-and-cloudflare.svg +0 −0
packages/client/public/blog-images/telescope.mp4 → public/blog-images/telescope.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/term-walkthrough-1.mp4 → public/blog-images/term-walkthrough-1.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/term-walkthrough-2.mp4 → public/blog-images/term-walkthrough-2.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/term-walkthrough-3.mp4 → public/blog-images/term-walkthrough-3.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/tmux-1.mp4 → public/blog-images/tmux-1.mp4 +0 −0

Binary file — no preview.

packages/client/public/blog-images/tmux-2.mp4 → public/blog-images/tmux-2.mp4 +0 −0

Binary file — no preview.

packages/client/public/favicon-16x16.png → public/favicon-16x16.png +0 −0

Binary file — no preview.

packages/client/public/favicon-32x32.png → public/favicon-32x32.png +0 −0

Binary file — no preview.

packages/client/public/favicon.ico → public/favicon.ico +0 −0

Binary file — no preview.

packages/client/public/favicons/aff.png → public/favicons/aff.png +0 −0

Binary file — no preview.

packages/client/public/favicons/am.png → public/favicons/am.png +0 −0

Binary file — no preview.

packages/client/public/favicons/az.ico → public/favicons/az.ico +0 −0

Binary file — no preview.

packages/client/public/favicons/baf.png → public/favicons/baf.png +0 −0

Binary file — no preview.

packages/client/public/favicons/bv.ico → public/favicons/bv.ico +0 −0

Binary file — no preview.

packages/client/public/favicons/cb.png → public/favicons/cb.png +0 −0

Binary file — no preview.

packages/client/public/favicons/cc.jpeg → public/favicons/cc.jpeg +0 −0

Binary file — no preview.

packages/client/public/favicons/cgpt.png → public/favicons/cgpt.png +0 −0

Binary file — no preview.

packages/client/public/favicons/ddg.ico → public/favicons/ddg.ico +0 −0

Binary file — no preview.

packages/client/public/favicons/dx.png → public/favicons/dx.png +0 −0

Binary file — no preview.

packages/client/public/favicons/eb.png → public/favicons/eb.png +0 −0

Binary file — no preview.

packages/client/public/favicons/ez.png → public/favicons/ez.png +0 −0

Binary file — no preview.

packages/client/public/favicons/fc.png → public/favicons/fc.png +0 −0

Binary file — no preview.

packages/client/public/favicons/fes.png → public/favicons/fes.png +0 −0

Binary file — no preview.

packages/client/public/favicons/ftx.png → public/favicons/ftx.png +0 −0

Binary file — no preview.

packages/client/public/favicons/gm.png → public/favicons/gm.png +0 −0

Binary file — no preview.

packages/client/public/favicons/go.ico → public/favicons/go.ico +0 −0

Binary file — no preview.

packages/client/public/favicons/gr.png → public/favicons/gr.png +0 −0

Binary file — no preview.

packages/client/public/favicons/hn.png → public/favicons/hn.png +0 −0

Binary file — no preview.

packages/client/public/favicons/hu.png → public/favicons/hu.png +0 −0

Binary file — no preview.

packages/client/public/favicons/iw.png → public/favicons/iw.png +0 −0

Binary file — no preview.

packages/client/public/favicons/mc.png → public/favicons/mc.png +0 −0

Binary file — no preview.

packages/client/public/favicons/mp.png → public/favicons/mp.png +0 −0

Binary file — no preview.

packages/client/public/favicons/ms.png → public/favicons/ms.png +0 −0

Binary file — no preview.

packages/client/public/favicons/my.png → public/favicons/my.png +0 −0

Binary file — no preview.

packages/client/public/favicons/nx.ico → public/favicons/nx.ico +0 −0

Binary file — no preview.

packages/client/public/favicons/of.png → public/favicons/of.png +0 −0

Binary file — no preview.

packages/client/public/favicons/ph.png → public/favicons/ph.png +0 −0

Binary file — no preview.

packages/client/public/favicons/py.ico → public/favicons/py.ico +0 −0

Binary file — no preview.

packages/client/public/favicons/rd.png → public/favicons/rd.png +0 −0

Binary file — no preview.

packages/client/public/favicons/sy.png → public/favicons/sy.png +0 −0

Binary file — no preview.

packages/client/public/favicons/td.png → public/favicons/td.png +0 −0

Binary file — no preview.

packages/client/public/favicons/tm.png → public/favicons/tm.png +0 −0

Binary file — no preview.

packages/client/public/favicons/x.png → public/favicons/x.png +0 −0

Binary file — no preview.

packages/client/public/favicons/yt.ico → public/favicons/yt.ico +0 −0

Binary file — no preview.

packages/client/public/favicons/zw.ico → public/favicons/zw.ico +0 −0

Binary file — no preview.

packages/client/public/genesis.sh → public/genesis.sh +0 −0
packages/client/public/icon.png → public/icon.png +0 −0

Binary file — no preview.

packages/client/public/mast.sh → public/mast.sh +0 −0
packages/client/public/og.png → public/og.png +0 −0

Binary file — no preview.

packages/client/public/pi.png → public/pi.png +0 −0

Binary file — no preview.

packages/client/public/public_key.asc → public/public_key.asc +0 −0
packages/client/public/robots.txt → public/robots.txt +0 −0
packages/client/public/site.webmanifest → public/site.webmanifest +0 −0
packages/client/public/snip.sh → public/snip.sh +0 −0
packages/client/scripts/parse-birds.ts → scripts/parse-birds.ts +0 −0
packages/client/sequoia.json → sequoia.json +0 −0
packages/client/src/assets/512x512.png → src/assets/512x512.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/42.png → src/assets/blog-images/42.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/QmU4XNzvRej9soBFdShhSb3KiTpN45hziDCbzdc5hBW1Nk.webp → src/assets/blog-images/QmU4XNzvRej9soBFdShhSb3KiTpN45hziDCbzdc5hBW1Nk.webp +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/Qma8MhvupyHTDmBGiH3yz37acPdqu966YF7rrSk9QDXx6B.png → src/assets/blog-images/Qma8MhvupyHTDmBGiH3yz37acPdqu966YF7rrSk9QDXx6B.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/Screenshot-Code-07-06-2023-20-19_2x_gz0arj.png → src/assets/blog-images/Screenshot-Code-07-06-2023-20-19_2x_gz0arj.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/Screenshot-Code-07-06-2023-20-25_2x_kl790i.png → src/assets/blog-images/Screenshot-Code-07-06-2023-20-25_2x_kl790i.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/ai-ick-og.png → src/assets/blog-images/ai-ick-og.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/ai-mentor.png → src/assets/blog-images/ai-mentor.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/alacritty.png → src/assets/blog-images/alacritty.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/alcove.jpg → src/assets/blog-images/alcove.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/atproto.png → src/assets/blog-images/atproto.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/atprotocol.png → src/assets/blog-images/atprotocol.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/back-to-basics.png → src/assets/blog-images/back-to-basics.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/base-cover.jpg → src/assets/blog-images/base-cover.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/base-fc.jpg → src/assets/blog-images/base-fc.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/bear-blog.png → src/assets/blog-images/bear-blog.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/cloudflare-requests.png → src/assets/blog-images/cloudflare-requests.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/diogenes.png → src/assets/blog-images/diogenes.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/disconnected.jpg → src/assets/blog-images/disconnected.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/friend-1.jpeg → src/assets/blog-images/friend-1.jpeg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/friend-2.jpeg → src/assets/blog-images/friend-2.jpeg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/friend-3.jpeg → src/assets/blog-images/friend-3.jpeg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/friend-4.jpeg → src/assets/blog-images/friend-4.jpeg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/friend-5.jpeg → src/assets/blog-images/friend-5.jpeg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/gemini.png → src/assets/blog-images/gemini.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/guestbook-cover.png → src/assets/blog-images/guestbook-cover.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/indexing-standard-site.png → src/assets/blog-images/indexing-standard-site.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/jesse-fc.png → src/assets/blog-images/jesse-fc.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/joe-greer-image.jpeg → src/assets/blog-images/joe-greer-image.jpeg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/jq-cover.webp → src/assets/blog-images/jq-cover.webp +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/kodak-brownie-ad.jpeg → src/assets/blog-images/kodak-brownie-ad.jpeg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/leaving-neovim-for-zed.png → src/assets/blog-images/leaving-neovim-for-zed.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/lsp-demo.png → src/assets/blog-images/lsp-demo.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/natspec-contract.png → src/assets/blog-images/natspec-contract.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/natspec-markdown-ui-2.png → src/assets/blog-images/natspec-markdown-ui-2.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/nvim-diagnostics-icons.png → src/assets/blog-images/nvim-diagnostics-icons.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/programmer-extinction.png → src/assets/blog-images/programmer-extinction.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/return-to-neovim.png → src/assets/blog-images/return-to-neovim.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/sequoia-hero.png → src/assets/blog-images/sequoia-hero.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/sipp-demo.png → src/assets/blog-images/sipp-demo.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/spring-updates.png → src/assets/blog-images/spring-updates.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/standard-site.png → src/assets/blog-images/standard-site.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/surf-the-web.png → src/assets/blog-images/surf-the-web.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/vibe-coding-kodak.png → src/assets/blog-images/vibe-coding-kodak.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/vivian-maier-pigeons.jpeg → src/assets/blog-images/vivian-maier-pigeons.jpeg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/vivian-maier.jpeg → src/assets/blog-images/vivian-maier.jpeg +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/walletfetch.png → src/assets/blog-images/walletfetch.png +0 −0

Binary file — no preview.

packages/client/src/assets/blog-images/zed-settings.png → src/assets/blog-images/zed-settings.png +0 −0

Binary file — no preview.

packages/client/src/assets/edc-images/a168.jpg → src/assets/edc-images/a168.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/edc-images/casio-royale.jpg → src/assets/edc-images/casio-royale.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/edc-images/journal.jpg → src/assets/edc-images/journal.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/edc-images/kaweco.jpg → src/assets/edc-images/kaweco.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/edc-images/knife.jpg → src/assets/edc-images/knife.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/edc-images/kobe-ink.jpg → src/assets/edc-images/kobe-ink.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/edc-images/parker-jotter.jpg → src/assets/edc-images/parker-jotter.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/edc-images/vaer.jpg → src/assets/edc-images/vaer.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/edc-images/wallet.jpg → src/assets/edc-images/wallet.jpg +0 −0

Binary file — no preview.

packages/client/src/assets/pfp.png → src/assets/pfp.png +0 −0

Binary file — no preview.

packages/client/src/assets/substack.png → src/assets/substack.png +0 −0

Binary file — no preview.

packages/client/src/components/auth/AuthStatus.tsx → src/components/auth/AuthStatus.tsx +0 −0
packages/client/src/components/blog/Diagram.astro → src/components/blog/Diagram.astro +0 −0
packages/client/src/components/blog/Hero.astro → src/components/blog/Hero.astro +0 −0
packages/client/src/components/blog/PostPreview.astro → src/components/blog/PostPreview.astro +0 −0
packages/client/src/components/common/ImageCollage.astro → src/components/common/ImageCollage.astro +0 −0
packages/client/src/components/common/OutLinkButton.astro → src/components/common/OutLinkButton.astro +0 −0
packages/client/src/components/common/Paginator.astro → src/components/common/Paginator.astro +0 −0
packages/client/src/components/layout/BaseHead.astro → src/components/layout/BaseHead.astro +0 −0
packages/client/src/components/layout/Footer.astro → src/components/layout/Footer.astro +0 −0
packages/client/src/components/layout/Header.astro → src/components/layout/Header.astro +0 −0
packages/client/src/components/now/GuestReply.astro → src/components/now/GuestReply.astro +0 −0
packages/client/src/components/now/NowAdmin.tsx → src/components/now/NowAdmin.tsx +0 −0
packages/client/src/components/now/NowUpdates.astro → src/components/now/NowUpdates.astro +0 −0
packages/client/src/components/now/PostComposer.tsx → src/components/now/PostComposer.tsx +0 −0
packages/client/src/components/page/BookCard.astro → src/components/page/BookCard.astro +0 −0
packages/client/src/components/page/GoogleBalls.astro → src/components/page/GoogleBalls.astro +0 −0
packages/client/src/components/page/LinkCard.astro → src/components/page/LinkCard.astro +0 −0
packages/client/src/components/page/ProjectCard.astro → src/components/page/ProjectCard.astro +0 −0
packages/client/src/components/page/SocialList.astro → src/components/page/SocialList.astro +0 −0
packages/client/src/components/page/WineCard.astro → src/components/page/WineCard.astro +0 −0
packages/client/src/content/config.ts → src/content/config.ts +0 −0
packages/client/src/content/pages/edc.md → src/content/pages/edc.md +0 −0
packages/client/src/content/post/2026-site-plans.mdx → src/content/post/2026-site-plans.mdx +0 −0
packages/client/src/content/post/48-hours-disconnected.mdx → src/content/post/48-hours-disconnected.mdx +0 −0
packages/client/src/content/post/a-terminal-based-workflow.mdx → src/content/post/a-terminal-based-workflow.mdx +0 −0
packages/client/src/content/post/atproto-starter.mdx → src/content/post/atproto-starter.mdx +0 −0
packages/client/src/content/post/back-to-basic.mdx → src/content/post/back-to-basic.mdx +0 −0
packages/client/src/content/post/base-may-not-be-for-me.mdx → src/content/post/base-may-not-be-for-me.mdx +0 −0
packages/client/src/content/post/building-a-guestbook-with-pglite-clerk-and-pinata.mdx → src/content/post/building-a-guestbook-with-pglite-clerk-and-pinata.mdx +0 −0
packages/client/src/content/post/building-personal-software-in-rust.mdx → src/content/post/building-personal-software-in-rust.mdx +0 −0
packages/client/src/content/post/concerning-omarchy-and-distro-philosophy.mdx → src/content/post/concerning-omarchy-and-distro-philosophy.mdx +0 −0
packages/client/src/content/post/how-gemini-gives-me-hope.mdx → src/content/post/how-gemini-gives-me-hope.mdx +0 −0
packages/client/src/content/post/indexing-standard-site.mdx → src/content/post/indexing-standard-site.mdx +0 −0
packages/client/src/content/post/introducing-alcove.mdx → src/content/post/introducing-alcove.mdx +0 −0
packages/client/src/content/post/introducing-sequoia.mdx → src/content/post/introducing-sequoia.mdx +0 −0
packages/client/src/content/post/learning-rust-with-ai.mdx → src/content/post/learning-rust-with-ai.mdx +0 −0
packages/client/src/content/post/leaving-neovim-for-zed.mdx → src/content/post/leaving-neovim-for-zed.mdx +0 −0
packages/client/src/content/post/my-developer-journey.md → src/content/post/my-developer-journey.md +0 −0
packages/client/src/content/post/programmers-on-the-verge-of-extinction.mdx → src/content/post/programmers-on-the-verge-of-extinction.mdx +0 −0
packages/client/src/content/post/programming-bowls.mdx → src/content/post/programming-bowls.mdx +0 −0
packages/client/src/content/post/resurrect-the-old-web.mdx → src/content/post/resurrect-the-old-web.mdx +0 −0
packages/client/src/content/post/returning-to-neovim.mdx → src/content/post/returning-to-neovim.mdx +0 −0
packages/client/src/content/post/spring-website-updates.mdx → src/content/post/spring-website-updates.mdx +0 −0
packages/client/src/content/post/standard-site-the-publishing-gateway.mdx → src/content/post/standard-site-the-publishing-gateway.mdx +0 −0
packages/client/src/content/post/the-meaning-of-life.mdx → src/content/post/the-meaning-of-life.mdx +0 −0
packages/client/src/content/post/turning-natspec-into-markdown-ui.mdx → src/content/post/turning-natspec-into-markdown-ui.mdx +0 −0
packages/client/src/content/post/using-atproto-for-posse.mdx → src/content/post/using-atproto-for-posse.mdx +0 −0
packages/client/src/content/post/vibe-coding-and-kodak-cameras.mdx → src/content/post/vibe-coding-and-kodak-cameras.mdx +0 −0
packages/client/src/content/post/when-ai-gives-the-ick.mdx → src/content/post/when-ai-gives-the-ick.mdx +0 −0
packages/client/src/content/post/why-i-learned-vim.mdx → src/content/post/why-i-learned-vim.mdx +0 −0
packages/client/src/content/post/why-you-should-learn-jq-in-2024.mdx → src/content/post/why-you-should-learn-jq-in-2024.mdx +0 −0
packages/client/src/data/birds.ts → src/data/birds.ts +0 −0
packages/client/src/data/constants.ts → src/data/constants.ts +0 −0
packages/client/src/data/projects.ts → src/data/projects.ts +0 −0
packages/client/src/data/shared.ts → src/data/shared.ts +0 −0
packages/client/src/data/siteMeta.ts → src/data/siteMeta.ts +0 −0
packages/client/src/env.d.ts → src/env.d.ts +0 −0
packages/client/src/layouts/Base.astro → src/layouts/Base.astro +0 −0
packages/client/src/layouts/BlogPost.astro → src/layouts/BlogPost.astro +0 −0
packages/client/src/pages/404.astro → src/pages/404.astro +0 −0
packages/client/src/pages/about.astro → src/pages/about.astro +0 −0
packages/client/src/pages/birds.astro → src/pages/birds.astro +0 −0
packages/client/src/pages/blogroll.astro → src/pages/blogroll.astro +0 −0
packages/client/src/pages/bookmarks.astro → src/pages/bookmarks.astro +0 −0
packages/client/src/pages/cellar/[short_id].astro → src/pages/cellar/[short_id].astro +0 −0
packages/client/src/pages/cellar/index.astro → src/pages/cellar/index.astro +0 −0
packages/client/src/pages/cv.astro → src/pages/cv.astro +0 −0
packages/client/src/pages/edc.astro → src/pages/edc.astro +0 −0
packages/client/src/pages/feed.xml.ts → src/pages/feed.xml.ts +0 −0
packages/client/src/pages/feeds.astro → src/pages/feeds.astro +0 −0
packages/client/src/pages/git.astro → src/pages/git.astro +0 −0
packages/client/src/pages/googleballs.astro → src/pages/googleballs.astro +0 −0
packages/client/src/pages/index.astro → src/pages/index.astro +0 −0
packages/client/src/pages/library.astro → src/pages/library.astro +0 −0
packages/client/src/pages/links.astro → src/pages/links.astro +0 −0
packages/client/src/pages/now/[slug].astro → src/pages/now/[slug].astro +0 −0
packages/client/src/pages/now/index.astro → src/pages/now/index.astro +0 −0
packages/client/src/pages/now/post.astro → src/pages/now/post.astro +0 −0
packages/client/src/pages/now/rss.xml.ts → src/pages/now/rss.xml.ts +0 −0
packages/client/src/pages/posts/[...page].astro → src/pages/posts/[...page].astro +0 −0
packages/client/src/pages/posts/[post].astro → src/pages/posts/[post].astro +0 −0
packages/client/src/pages/projects.astro → src/pages/projects.astro +0 −0
packages/client/src/pages/rss.xml.ts → src/pages/rss.xml.ts +0 −0
packages/client/src/pages/soundboard.astro → src/pages/soundboard.astro +0 −0
packages/client/src/pages/tags/[tag]/[...page].astro → src/pages/tags/[tag]/[...page].astro +0 −0
packages/client/src/pages/tags/index.astro → src/pages/tags/index.astro +0 −0
packages/client/src/pages/videos.astro → src/pages/videos.astro +0 −0
packages/client/src/site.config.ts → src/site.config.ts +0 −0
packages/client/src/styles/global.css → src/styles/global.css +0 −0
packages/client/src/utils/date.ts → src/utils/date.ts +0 −0
packages/client/src/utils/domElement.ts → src/utils/domElement.ts +0 −0
packages/client/src/utils/index.ts → src/utils/index.ts +0 −0
packages/client/src/utils/markdown.ts → src/utils/markdown.ts +0 −0
packages/client/src/utils/post.ts → src/utils/post.ts +0 −0
packages/client/tailwind.config.cjs → tailwind.config.cjs +0 −0
packages/client/tsconfig.json → tsconfig.json +0 −0
packages/client/wrangler.toml → wrangler.toml +0 −0
packages/server/.gitignore (deleted) +0 −33
1 -
# prod
2 -
dist/
3 -
4 -
# dev
5 -
.yarn/
6 -
!.yarn/releases
7 -
.vscode/*
8 -
!.vscode/launch.json
9 -
!.vscode/*.code-snippets
10 -
.idea/workspace.xml
11 -
.idea/usage.statistics.xml
12 -
.idea/shelf
13 -
14 -
# deps
15 -
node_modules/
16 -
.wrangler
17 -
18 -
# env
19 -
.env
20 -
.env.production
21 -
.dev.vars
22 -
23 -
# logs
24 -
logs/
25 -
*.log
26 -
npm-debug.log*
27 -
yarn-debug.log*
28 -
yarn-error.log*
29 -
pnpm-debug.log*
30 -
lerna-debug.log*
31 -
32 -
# misc
33 -
.DS_Store
packages/server/README.md (deleted) +0 −21
1 -
```txt
2 -
npm install
3 -
npm run dev
4 -
```
5 -
6 -
```txt
7 -
npm run deploy
8 -
```
9 -
10 -
[For generating/synchronizing types based on your Worker configuration run](https://developers.cloudflare.com/workers/wrangler/commands/#types):
11 -
12 -
```txt
13 -
npm run cf-typegen
14 -
```
15 -
16 -
Pass the `CloudflareBindings` as generics when instantiation `Hono`:
17 -
18 -
```ts
19 -
// src/index.ts
20 -
const app = new Hono<{ Bindings: CloudflareBindings }>()
21 -
```
packages/server/package.json (deleted) +0 −21
1 -
{
2 -
	"name": "server",
3 -
	"type": "module",
4 -
	"private": true,
5 -
	"scripts": {
6 -
		"dev": "wrangler dev",
7 -
		"deploy": "wrangler deploy --minify",
8 -
		"cf-typegen": "wrangler types --env-interface CloudflareBindings",
9 -
		"typecheck": "tsc --noEmit"
10 -
	},
11 -
	"dependencies": {
12 -
		"@atproto/api": "^0.18.12",
13 -
		"feed": "^5.1.0",
14 -
		"hono": "^4.11.3",
15 -
		"jose": "^6.1.3"
16 -
	},
17 -
	"devDependencies": {
18 -
		"@cloudflare/workers-types": "^4.20260103.0",
19 -
		"wrangler": "^4.4.0"
20 -
	}
21 -
}
packages/server/src/index.ts (deleted) +0 −40
1 -
import { Hono } from "hono";
2 -
import { cors } from "hono/cors";
3 -
// COMMENTS FUNCTIONALITY DISABLED
4 -
// import { home, now, auth, guestAuth } from "./routes";
5 -
import { home, now, auth } from "./routes";
6 -
7 -
interface Env {
8 -
	SESSIONS: KVNamespace;
9 -
	ALLOWED_DID: string;
10 -
	PDS_URL: string;
11 -
	CLIENT_URL: string;
12 -
	API_URL: string;
13 -
}
14 -
15 -
const app = new Hono<{ Bindings: Env }>();
16 -
17 -
// Configure CORS to allow credentials from the client
18 -
app.use(
19 -
	cors({
20 -
		origin: (origin) => {
21 -
			const allowedOrigins = [
22 -
				"https://stevedylan.dev",
23 -
				"http://localhost:4321",
24 -
				"http://localhost:3000",
25 -
			];
26 -
			return allowedOrigins.includes(origin) ? origin : allowedOrigins[0];
27 -
		},
28 -
		credentials: true,
29 -
		allowMethods: ["GET", "POST", "OPTIONS"],
30 -
		allowHeaders: ["Content-Type"],
31 -
	}),
32 -
);
33 -
34 -
app.route("/", home);
35 -
app.route("/now", now);
36 -
app.route("/auth", auth);
37 -
// COMMENTS FUNCTIONALITY DISABLED
38 -
// app.route("/guest-auth", guestAuth);
39 -
40 -
export default app;
packages/server/src/lib/dpop.ts (deleted) +0 −130
1 -
import * as jose from "jose";
2 -
3 -
export interface DPoPKeyPair {
4 -
	privateKey: CryptoKey;
5 -
	publicKey: CryptoKey;
6 -
	publicJwk: jose.JWK;
7 -
}
8 -
9 -
export interface DPoPProofOptions {
10 -
	method: string;
11 -
	url: string;
12 -
	nonce?: string;
13 -
	accessToken?: string;
14 -
}
15 -
16 -
/**
17 -
 * Generate a new ES256 keypair for DPoP proofs
18 -
 */
19 -
export async function generateDPoPKeyPair(): Promise<DPoPKeyPair> {
20 -
	const keyPair = (await crypto.subtle.generateKey(
21 -
		{
22 -
			name: "ECDSA",
23 -
			namedCurve: "P-256",
24 -
		},
25 -
		true,
26 -
		["sign", "verify"],
27 -
	)) as CryptoKeyPair;
28 -
29 -
	const publicJwk = await jose.exportJWK(keyPair.publicKey);
30 -
31 -
	return {
32 -
		privateKey: keyPair.privateKey,
33 -
		publicKey: keyPair.publicKey,
34 -
		publicJwk,
35 -
	};
36 -
}
37 -
38 -
/**
39 -
 * Export a DPoP keypair to a storable format
40 -
 */
41 -
export async function exportDPoPKeyPair(
42 -
	keyPair: DPoPKeyPair,
43 -
): Promise<{ privateJwk: jose.JWK; publicJwk: jose.JWK }> {
44 -
	const privateJwk = await jose.exportJWK(keyPair.privateKey);
45 -
	return {
46 -
		privateJwk,
47 -
		publicJwk: keyPair.publicJwk,
48 -
	};
49 -
}
50 -
51 -
/**
52 -
 * Import a DPoP keypair from stored JWKs
53 -
 */
54 -
export async function importDPoPKeyPair(stored: {
55 -
	privateJwk: jose.JWK;
56 -
	publicJwk: jose.JWK;
57 -
}): Promise<DPoPKeyPair> {
58 -
	// Use crypto.subtle.importKey with extractable: true
59 -
	// jose.importJWK creates non-extractable keys by default
60 -
	const privateKey = await crypto.subtle.importKey(
61 -
		"jwk",
62 -
		stored.privateJwk as JsonWebKey,
63 -
		{ name: "ECDSA", namedCurve: "P-256" },
64 -
		true, // extractable
65 -
		["sign"],
66 -
	);
67 -
68 -
	const publicKey = await crypto.subtle.importKey(
69 -
		"jwk",
70 -
		stored.publicJwk as JsonWebKey,
71 -
		{ name: "ECDSA", namedCurve: "P-256" },
72 -
		true, // extractable
73 -
		["verify"],
74 -
	);
75 -
76 -
	return {
77 -
		privateKey,
78 -
		publicKey,
79 -
		publicJwk: stored.publicJwk,
80 -
	};
81 -
}
82 -
83 -
/**
84 -
 * Create a DPoP proof JWT for a request
85 -
 */
86 -
export async function createDPoPProof(
87 -
	keyPair: DPoPKeyPair,
88 -
	options: DPoPProofOptions,
89 -
): Promise<string> {
90 -
	const now = Math.floor(Date.now() / 1000);
91 -
	const jti = crypto.randomUUID();
92 -
93 -
	const payload: jose.JWTPayload = {
94 -
		jti,
95 -
		htm: options.method.toUpperCase(),
96 -
		htu: options.url,
97 -
		iat: now,
98 -
	};
99 -
100 -
	// Add nonce if provided (required after first request)
101 -
	if (options.nonce) {
102 -
		payload.nonce = options.nonce;
103 -
	}
104 -
105 -
	// Add access token hash if provided (for resource server requests)
106 -
	if (options.accessToken) {
107 -
		const encoder = new TextEncoder();
108 -
		const data = encoder.encode(options.accessToken);
109 -
		const hashBuffer = await crypto.subtle.digest("SHA-256", data);
110 -
		const hashArray = new Uint8Array(hashBuffer);
111 -
		payload.ath = jose.base64url.encode(hashArray);
112 -
	}
113 -
114 -
	const jwt = await new jose.SignJWT(payload)
115 -
		.setProtectedHeader({
116 -
			alg: "ES256",
117 -
			typ: "dpop+jwt",
118 -
			jwk: keyPair.publicJwk,
119 -
		})
120 -
		.sign(keyPair.privateKey);
121 -
122 -
	return jwt;
123 -
}
124 -
125 -
/**
126 -
 * Extract DPoP nonce from response headers
127 -
 */
128 -
export function extractDPoPNonce(response: Response): string | null {
129 -
	return response.headers.get("DPoP-Nonce");
130 -
}
packages/server/src/lib/oauth.ts (deleted) +0 −427
1 -
import * as jose from "jose";
2 -
import {
3 -
	type DPoPKeyPair,
4 -
	createDPoPProof,
5 -
	extractDPoPNonce,
6 -
	generateDPoPKeyPair,
7 -
} from "./dpop";
8 -
import { storeAuthState, getAndDeleteAuthState } from "./session";
9 -
10 -
export interface OAuthServerMetadata {
11 -
	issuer: string;
12 -
	authorization_endpoint: string;
13 -
	token_endpoint: string;
14 -
	pushed_authorization_request_endpoint: string;
15 -
	scopes_supported?: string[];
16 -
	response_types_supported?: string[];
17 -
	grant_types_supported?: string[];
18 -
	dpop_signing_alg_values_supported?: string[];
19 -
}
20 -
21 -
export interface PKCEPair {
22 -
	codeVerifier: string;
23 -
	codeChallenge: string;
24 -
}
25 -
26 -
export interface TokenResponse {
27 -
	access_token: string;
28 -
	token_type: string;
29 -
	expires_in: number;
30 -
	refresh_token?: string;
31 -
	scope: string;
32 -
	sub: string; // The DID of the authenticated user
33 -
}
34 -
35 -
export interface PARResponse {
36 -
	request_uri: string;
37 -
	expires_in: number;
38 -
}
39 -
40 -
interface OAuthErrorResponse {
41 -
	error: string;
42 -
	error_description?: string;
43 -
}
44 -
45 -
interface ProtectedResourceMetadata {
46 -
	resource: string;
47 -
	authorization_servers: string[];
48 -
}
49 -
50 -
/**
51 -
 * Fetch OAuth server metadata from PDS
52 -
 * First checks for protected resource metadata to find the authorization server,
53 -
 * then fetches OAuth metadata from there.
54 -
 */
55 -
export async function fetchOAuthMetadata(
56 -
	pdsUrl: string,
57 -
): Promise<OAuthServerMetadata> {
58 -
	// First, try to get the authorization server from protected resource metadata
59 -
	let authServerUrl = pdsUrl;
60 -
61 -
	try {
62 -
		const protectedResourceUrl = `${pdsUrl}/.well-known/oauth-protected-resource`;
63 -
		const prResponse = await fetch(protectedResourceUrl);
64 -
		if (prResponse.ok) {
65 -
			const prData = (await prResponse.json()) as ProtectedResourceMetadata;
66 -
			if (
67 -
				prData.authorization_servers &&
68 -
				prData.authorization_servers.length > 0
69 -
			) {
70 -
				authServerUrl = prData.authorization_servers[0];
71 -
			}
72 -
		}
73 -
	} catch {
74 -
		// If protected resource metadata fails, fall back to PDS URL
75 -
	}
76 -
77 -
	const metadataUrl = `${authServerUrl}/.well-known/oauth-authorization-server`;
78 -
	const response = await fetch(metadataUrl);
79 -
80 -
	if (!response.ok) {
81 -
		throw new Error(
82 -
			`Failed to fetch OAuth metadata: ${response.status} ${response.statusText}`,
83 -
		);
84 -
	}
85 -
86 -
	return response.json();
87 -
}
88 -
89 -
/**
90 -
 * Generate PKCE code verifier and challenge
91 -
 */
92 -
export async function generatePKCE(): Promise<PKCEPair> {
93 -
	// Generate 32 random bytes for code verifier
94 -
	const verifierBytes = new Uint8Array(32);
95 -
	crypto.getRandomValues(verifierBytes);
96 -
	const codeVerifier = jose.base64url.encode(verifierBytes);
97 -
98 -
	// Generate S256 challenge
99 -
	const encoder = new TextEncoder();
100 -
	const data = encoder.encode(codeVerifier);
101 -
	const hashBuffer = await crypto.subtle.digest("SHA-256", data);
102 -
	const codeChallenge = jose.base64url.encode(new Uint8Array(hashBuffer));
103 -
104 -
	return { codeVerifier, codeChallenge };
105 -
}
106 -
107 -
/**
108 -
 * Generate a random state token
109 -
 */
110 -
export function generateState(): string {
111 -
	const stateBytes = new Uint8Array(32);
112 -
	crypto.getRandomValues(stateBytes);
113 -
	return jose.base64url.encode(stateBytes);
114 -
}
115 -
116 -
/**
117 -
 * Send a Pushed Authorization Request (PAR) to the PDS
118 -
 */
119 -
export async function sendPAR(
120 -
	metadata: OAuthServerMetadata,
121 -
	clientId: string,
122 -
	redirectUri: string,
123 -
	state: string,
124 -
	pkce: PKCEPair,
125 -
	dpopKeyPair: DPoPKeyPair,
126 -
	scope: string,
127 -
	dpopNonce?: string,
128 -
): Promise<{ parResponse: PARResponse; dpopNonce: string }> {
129 -
	const parEndpoint = metadata.pushed_authorization_request_endpoint;
130 -
131 -
	const params = new URLSearchParams({
132 -
		client_id: clientId,
133 -
		redirect_uri: redirectUri,
134 -
		response_type: "code",
135 -
		state,
136 -
		scope,
137 -
		code_challenge: pkce.codeChallenge,
138 -
		code_challenge_method: "S256",
139 -
	});
140 -
141 -
	// Create DPoP proof for this request
142 -
	const dpopProof = await createDPoPProof(dpopKeyPair, {
143 -
		method: "POST",
144 -
		url: parEndpoint,
145 -
		nonce: dpopNonce,
146 -
	});
147 -
148 -
	const response = await fetch(parEndpoint, {
149 -
		method: "POST",
150 -
		headers: {
151 -
			"Content-Type": "application/x-www-form-urlencoded",
152 -
			DPoP: dpopProof,
153 -
		},
154 -
		body: params.toString(),
155 -
	});
156 -
157 -
	// Handle DPoP nonce requirement
158 -
	const newNonce = extractDPoPNonce(response);
159 -
160 -
	if (response.status === 400 || response.status === 401) {
161 -
		const error: OAuthErrorResponse = await response.json();
162 -
		if (error.error === "use_dpop_nonce" && newNonce) {
163 -
			// Retry with the nonce
164 -
			return sendPAR(
165 -
				metadata,
166 -
				clientId,
167 -
				redirectUri,
168 -
				state,
169 -
				pkce,
170 -
				dpopKeyPair,
171 -
				scope,
172 -
				newNonce,
173 -
			);
174 -
		}
175 -
		throw new Error(`PAR failed: ${error.error_description || error.error}`);
176 -
	}
177 -
178 -
	if (!response.ok) {
179 -
		throw new Error(`PAR failed: ${response.status} ${response.statusText}`);
180 -
	}
181 -
182 -
	const parResponse: PARResponse = await response.json();
183 -
	return {
184 -
		parResponse,
185 -
		dpopNonce: newNonce || dpopNonce || "",
186 -
	};
187 -
}
188 -
189 -
/**
190 -
 * Build the authorization URL for redirecting the user
191 -
 */
192 -
export function buildAuthorizationUrl(
193 -
	metadata: OAuthServerMetadata,
194 -
	requestUri: string,
195 -
	clientId: string,
196 -
): string {
197 -
	const url = new URL(metadata.authorization_endpoint);
198 -
	url.searchParams.set("request_uri", requestUri);
199 -
	url.searchParams.set("client_id", clientId);
200 -
	return url.toString();
201 -
}
202 -
203 -
/**
204 -
 * Exchange authorization code for tokens
205 -
 */
206 -
export async function exchangeCodeForTokens(
207 -
	metadata: OAuthServerMetadata,
208 -
	code: string,
209 -
	codeVerifier: string,
210 -
	clientId: string,
211 -
	redirectUri: string,
212 -
	dpopKeyPair: DPoPKeyPair,
213 -
	dpopNonce?: string,
214 -
): Promise<{ tokenResponse: TokenResponse; dpopNonce: string }> {
215 -
	const tokenEndpoint = metadata.token_endpoint;
216 -
217 -
	const params = new URLSearchParams({
218 -
		grant_type: "authorization_code",
219 -
		code,
220 -
		redirect_uri: redirectUri,
221 -
		client_id: clientId,
222 -
		code_verifier: codeVerifier,
223 -
	});
224 -
225 -
	// Create DPoP proof for token request
226 -
	const dpopProof = await createDPoPProof(dpopKeyPair, {
227 -
		method: "POST",
228 -
		url: tokenEndpoint,
229 -
		nonce: dpopNonce,
230 -
	});
231 -
232 -
	const response = await fetch(tokenEndpoint, {
233 -
		method: "POST",
234 -
		headers: {
235 -
			"Content-Type": "application/x-www-form-urlencoded",
236 -
			DPoP: dpopProof,
237 -
		},
238 -
		body: params.toString(),
239 -
	});
240 -
241 -
	// Handle DPoP nonce requirement
242 -
	const newNonce = extractDPoPNonce(response);
243 -
244 -
	if (response.status === 400 || response.status === 401) {
245 -
		const error: OAuthErrorResponse = await response.json();
246 -
		if (error.error === "use_dpop_nonce" && newNonce) {
247 -
			// Retry with the nonce
248 -
			return exchangeCodeForTokens(
249 -
				metadata,
250 -
				code,
251 -
				codeVerifier,
252 -
				clientId,
253 -
				redirectUri,
254 -
				dpopKeyPair,
255 -
				newNonce,
256 -
			);
257 -
		}
258 -
		throw new Error(
259 -
			`Token exchange failed: ${error.error_description || error.error}`,
260 -
		);
261 -
	}
262 -
263 -
	if (!response.ok) {
264 -
		throw new Error(
265 -
			`Token exchange failed: ${response.status} ${response.statusText}`,
266 -
		);
267 -
	}
268 -
269 -
	const tokenResponse: TokenResponse = await response.json();
270 -
	return {
271 -
		tokenResponse,
272 -
		dpopNonce: newNonce || dpopNonce || "",
273 -
	};
274 -
}
275 -
276 -
export interface OAuthFlowConfig {
277 -
	pdsUrl: string;
278 -
	clientId: string;
279 -
	redirectUri: string;
280 -
	scope: string;
281 -
}
282 -
283 -
export interface InitiateOAuthResult {
284 -
	authUrl: string;
285 -
	state: string;
286 -
}
287 -
288 -
/**
289 -
 * Initiates an OAuth login flow - generates PKCE, DPoP keypair, sends PAR, and stores auth state
290 -
 */
291 -
export async function initiateOAuthFlow(
292 -
	kv: KVNamespace,
293 -
	config: OAuthFlowConfig,
294 -
): Promise<InitiateOAuthResult> {
295 -
	const metadata = await fetchOAuthMetadata(config.pdsUrl);
296 -
	const pkce = await generatePKCE();
297 -
	const state = generateState();
298 -
	const dpopKeyPair = await generateDPoPKeyPair();
299 -
300 -
	const { parResponse, dpopNonce } = await sendPAR(
301 -
		metadata,
302 -
		config.clientId,
303 -
		config.redirectUri,
304 -
		state,
305 -
		pkce,
306 -
		dpopKeyPair,
307 -
		config.scope,
308 -
	);
309 -
310 -
	await storeAuthState(kv, state, pkce.codeVerifier, dpopKeyPair, dpopNonce);
311 -
312 -
	const authUrl = buildAuthorizationUrl(
313 -
		metadata,
314 -
		parResponse.request_uri,
315 -
		config.clientId,
316 -
	);
317 -
318 -
	return { authUrl, state };
319 -
}
320 -
321 -
export interface CompleteOAuthResult {
322 -
	tokenResponse: TokenResponse;
323 -
	dpopKeyPair: DPoPKeyPair;
324 -
	dpopNonce: string;
325 -
}
326 -
327 -
/**
328 -
 * Completes an OAuth callback - validates state, exchanges code for tokens
329 -
 */
330 -
export async function completeOAuthFlow(
331 -
	kv: KVNamespace,
332 -
	pdsUrl: string,
333 -
	code: string,
334 -
	state: string,
335 -
	clientId: string,
336 -
	redirectUri: string,
337 -
): Promise<CompleteOAuthResult | null> {
338 -
	const authState = await getAndDeleteAuthState(kv, state);
339 -
	if (!authState) {
340 -
		return null;
341 -
	}
342 -
343 -
	const metadata = await fetchOAuthMetadata(pdsUrl);
344 -
345 -
	const { tokenResponse, dpopNonce } = await exchangeCodeForTokens(
346 -
		metadata,
347 -
		code,
348 -
		authState.codeVerifier,
349 -
		clientId,
350 -
		redirectUri,
351 -
		authState.dpopKeyPair,
352 -
		authState.dpopNonce,
353 -
	);
354 -
355 -
	return {
356 -
		tokenResponse,
357 -
		dpopKeyPair: authState.dpopKeyPair,
358 -
		dpopNonce,
359 -
	};
360 -
}
361 -
362 -
/**
363 -
 * Refresh an access token
364 -
 */
365 -
export async function refreshAccessToken(
366 -
	metadata: OAuthServerMetadata,
367 -
	refreshToken: string,
368 -
	clientId: string,
369 -
	dpopKeyPair: DPoPKeyPair,
370 -
	dpopNonce?: string,
371 -
): Promise<{ tokenResponse: TokenResponse; dpopNonce: string }> {
372 -
	const tokenEndpoint = metadata.token_endpoint;
373 -
374 -
	const params = new URLSearchParams({
375 -
		grant_type: "refresh_token",
376 -
		refresh_token: refreshToken,
377 -
		client_id: clientId,
378 -
	});
379 -
380 -
	// Create DPoP proof for token request
381 -
	const dpopProof = await createDPoPProof(dpopKeyPair, {
382 -
		method: "POST",
383 -
		url: tokenEndpoint,
384 -
		nonce: dpopNonce,
385 -
	});
386 -
387 -
	const response = await fetch(tokenEndpoint, {
388 -
		method: "POST",
389 -
		headers: {
390 -
			"Content-Type": "application/x-www-form-urlencoded",
391 -
			DPoP: dpopProof,
392 -
		},
393 -
		body: params.toString(),
394 -
	});
395 -
396 -
	// Handle DPoP nonce requirement
397 -
	const newNonce = extractDPoPNonce(response);
398 -
399 -
	if (response.status === 400 || response.status === 401) {
400 -
		const error: OAuthErrorResponse = await response.json();
401 -
		if (error.error === "use_dpop_nonce" && newNonce) {
402 -
			// Retry with the nonce
403 -
			return refreshAccessToken(
404 -
				metadata,
405 -
				refreshToken,
406 -
				clientId,
407 -
				dpopKeyPair,
408 -
				newNonce,
409 -
			);
410 -
		}
411 -
		throw new Error(
412 -
			`Token refresh failed: ${error.error_description || error.error}`,
413 -
		);
414 -
	}
415 -
416 -
	if (!response.ok) {
417 -
		throw new Error(
418 -
			`Token refresh failed: ${response.status} ${response.statusText}`,
419 -
		);
420 -
	}
421 -
422 -
	const tokenResponse: TokenResponse = await response.json();
423 -
	return {
424 -
		tokenResponse,
425 -
		dpopNonce: newNonce || dpopNonce || "",
426 -
	};
427 -
}
packages/server/src/lib/session.ts (deleted) +0 −237
1 -
import type { Context } from "hono";
2 -
import type { JWK } from "jose";
3 -
import { exportDPoPKeyPair, importDPoPKeyPair, type DPoPKeyPair } from "./dpop";
4 -
5 -
export interface StoredSession {
6 -
	accessToken: string;
7 -
	refreshToken: string;
8 -
	dpopPrivateJwk: JWK;
9 -
	dpopPublicJwk: JWK;
10 -
	dpopNonce: string;
11 -
	did: string;
12 -
	handle?: string;
13 -
	pdsUrl?: string; // User's PDS URL (for guest sessions)
14 -
	expiresAt: number; // Unix timestamp
15 -
	createdAt: number;
16 -
}
17 -
18 -
export interface AuthState {
19 -
	codeVerifier: string;
20 -
	state: string;
21 -
	dpopPrivateJwk: JWK;
22 -
	dpopPublicJwk: JWK;
23 -
	dpopNonce: string;
24 -
	createdAt: number;
25 -
}
26 -
27 -
const SESSION_COOKIE_NAME = "session_id";
28 -
const SESSION_TTL = 60 * 60 * 24 * 14; // 14 days in seconds
29 -
const AUTH_STATE_TTL = 60 * 10; // 10 minutes in seconds
30 -
31 -
/**
32 -
 * Generate a unique session ID
33 -
 */
34 -
export function generateSessionId(): string {
35 -
	const bytes = new Uint8Array(32);
36 -
	crypto.getRandomValues(bytes);
37 -
	return Array.from(bytes)
38 -
		.map((b) => b.toString(16).padStart(2, "0"))
39 -
		.join("");
40 -
}
41 -
42 -
/**
43 -
 * Store auth state during OAuth flow
44 -
 */
45 -
export async function storeAuthState(
46 -
	kv: KVNamespace,
47 -
	state: string,
48 -
	codeVerifier: string,
49 -
	dpopKeyPair: DPoPKeyPair,
50 -
	dpopNonce: string,
51 -
): Promise<void> {
52 -
	const exported = await exportDPoPKeyPair(dpopKeyPair);
53 -
54 -
	const authState: AuthState = {
55 -
		codeVerifier,
56 -
		state,
57 -
		dpopPrivateJwk: exported.privateJwk,
58 -
		dpopPublicJwk: exported.publicJwk,
59 -
		dpopNonce,
60 -
		createdAt: Date.now(),
61 -
	};
62 -
63 -
	await kv.put(`auth_state:${state}`, JSON.stringify(authState), {
64 -
		expirationTtl: AUTH_STATE_TTL,
65 -
	});
66 -
}
67 -
68 -
/**
69 -
 * Retrieve and delete auth state
70 -
 */
71 -
export async function getAndDeleteAuthState(
72 -
	kv: KVNamespace,
73 -
	state: string,
74 -
): Promise<{
75 -
	codeVerifier: string;
76 -
	dpopKeyPair: DPoPKeyPair;
77 -
	dpopNonce: string;
78 -
} | null> {
79 -
	const data = await kv.get(`auth_state:${state}`);
80 -
	if (!data) return null;
81 -
82 -
	// Delete the auth state (one-time use)
83 -
	await kv.delete(`auth_state:${state}`);
84 -
85 -
	const authState: AuthState = JSON.parse(data);
86 -
	const dpopKeyPair = await importDPoPKeyPair({
87 -
		privateJwk: authState.dpopPrivateJwk,
88 -
		publicJwk: authState.dpopPublicJwk,
89 -
	});
90 -
91 -
	return {
92 -
		codeVerifier: authState.codeVerifier,
93 -
		dpopKeyPair,
94 -
		dpopNonce: authState.dpopNonce,
95 -
	};
96 -
}
97 -
98 -
/**
99 -
 * Create a new session and store it in KV
100 -
 */
101 -
export async function createSession(
102 -
	kv: KVNamespace,
103 -
	accessToken: string,
104 -
	refreshToken: string,
105 -
	dpopKeyPair: DPoPKeyPair,
106 -
	dpopNonce: string,
107 -
	did: string,
108 -
	expiresIn: number,
109 -
	handle?: string,
110 -
	pdsUrl?: string,
111 -
): Promise<string> {
112 -
	const sessionId = generateSessionId();
113 -
	const exported = await exportDPoPKeyPair(dpopKeyPair);
114 -
115 -
	const session: StoredSession = {
116 -
		accessToken,
117 -
		refreshToken,
118 -
		dpopPrivateJwk: exported.privateJwk,
119 -
		dpopPublicJwk: exported.publicJwk,
120 -
		dpopNonce,
121 -
		did,
122 -
		handle,
123 -
		pdsUrl,
124 -
		expiresAt: Date.now() + expiresIn * 1000,
125 -
		createdAt: Date.now(),
126 -
	};
127 -
128 -
	await kv.put(`session:${sessionId}`, JSON.stringify(session), {
129 -
		expirationTtl: SESSION_TTL,
130 -
	});
131 -
132 -
	return sessionId;
133 -
}
134 -
135 -
/**
136 -
 * Get session from KV by session ID
137 -
 */
138 -
export async function getSession(
139 -
	kv: KVNamespace,
140 -
	sessionId: string,
141 -
): Promise<{ session: StoredSession; dpopKeyPair: DPoPKeyPair } | null> {
142 -
	const data = await kv.get(`session:${sessionId}`);
143 -
	if (!data) return null;
144 -
145 -
	const session: StoredSession = JSON.parse(data);
146 -
	const dpopKeyPair = await importDPoPKeyPair({
147 -
		privateJwk: session.dpopPrivateJwk,
148 -
		publicJwk: session.dpopPublicJwk,
149 -
	});
150 -
151 -
	return { session, dpopKeyPair };
152 -
}
153 -
154 -
/**
155 -
 * Update session with new tokens
156 -
 */
157 -
export async function updateSession(
158 -
	kv: KVNamespace,
159 -
	sessionId: string,
160 -
	accessToken: string,
161 -
	refreshToken: string,
162 -
	dpopNonce: string,
163 -
	expiresIn: number,
164 -
): Promise<void> {
165 -
	const data = await kv.get(`session:${sessionId}`);
166 -
	if (!data) throw new Error("Session not found");
167 -
168 -
	const session: StoredSession = JSON.parse(data);
169 -
	session.accessToken = accessToken;
170 -
	session.refreshToken = refreshToken;
171 -
	session.dpopNonce = dpopNonce;
172 -
	session.expiresAt = Date.now() + expiresIn * 1000;
173 -
174 -
	await kv.put(`session:${sessionId}`, JSON.stringify(session), {
175 -
		expirationTtl: SESSION_TTL,
176 -
	});
177 -
}
178 -
179 -
/**
180 -
 * Delete a session
181 -
 */
182 -
export async function deleteSession(
183 -
	kv: KVNamespace,
184 -
	sessionId: string,
185 -
): Promise<void> {
186 -
	await kv.delete(`session:${sessionId}`);
187 -
}
188 -
189 -
/**
190 -
 * Get session ID from cookie
191 -
 */
192 -
export function getSessionIdFromCookie(c: Context): string | null {
193 -
	const cookie = c.req.header("Cookie");
194 -
	if (!cookie) return null;
195 -
196 -
	const match = cookie.match(new RegExp(`${SESSION_COOKIE_NAME}=([^;]+)`));
197 -
	return match ? match[1] : null;
198 -
}
199 -
200 -
/**
201 -
 * Set session cookie in response
202 -
 */
203 -
export function setSessionCookie(
204 -
	c: Context,
205 -
	sessionId: string,
206 -
	clientUrl: string,
207 -
): void {
208 -
	const isLocalhost = clientUrl.includes("localhost");
209 -
	const domain = isLocalhost ? "" : "; Domain=.stevedylan.dev";
210 -
	const secure = isLocalhost ? "" : "; Secure";
211 -
212 -
	c.header(
213 -
		"Set-Cookie",
214 -
		`${SESSION_COOKIE_NAME}=${sessionId}; HttpOnly; SameSite=Lax; Path=/${domain}${secure}; Max-Age=${SESSION_TTL}`,
215 -
	);
216 -
}
217 -
218 -
/**
219 -
 * Clear session cookie
220 -
 */
221 -
export function clearSessionCookie(c: Context, clientUrl: string): void {
222 -
	const isLocalhost = clientUrl.includes("localhost");
223 -
	const domain = isLocalhost ? "" : "; Domain=.stevedylan.dev";
224 -
	const secure = isLocalhost ? "" : "; Secure";
225 -
226 -
	c.header(
227 -
		"Set-Cookie",
228 -
		`${SESSION_COOKIE_NAME}=; HttpOnly; SameSite=Lax; Path=/${domain}${secure}; Max-Age=0`,
229 -
	);
230 -
}
231 -
232 -
/**
233 -
 * Check if token is expired or about to expire (within 1 minute)
234 -
 */
235 -
export function isTokenExpired(expiresAt: number): boolean {
236 -
	return Date.now() > expiresAt - 60000;
237 -
}
packages/server/src/routes/auth.ts (deleted) +0 −205
1 -
import { Hono } from "hono";
2 -
import {
3 -
	fetchOAuthMetadata,
4 -
	refreshAccessToken,
5 -
	initiateOAuthFlow,
6 -
	completeOAuthFlow,
7 -
} from "../lib/oauth";
8 -
import {
9 -
	createSession,
10 -
	getSession,
11 -
	deleteSession,
12 -
	getSessionIdFromCookie,
13 -
	setSessionCookie,
14 -
	clearSessionCookie,
15 -
	isTokenExpired,
16 -
	updateSession,
17 -
} from "../lib/session";
18 -
19 -
interface Env {
20 -
	SESSIONS: KVNamespace;
21 -
	ALLOWED_DID: string;
22 -
	PDS_URL: string;
23 -
	CLIENT_URL: string;
24 -
	API_URL: string;
25 -
}
26 -
27 -
const auth = new Hono<{ Bindings: Env }>();
28 -
29 -
// OAuth client metadata endpoint
30 -
auth.get("/client-metadata.json", (c) => {
31 -
	const clientId = `${c.env.API_URL}/auth/client-metadata.json`;
32 -
	const redirectUri = `${c.env.API_URL}/auth/callback`;
33 -
34 -
	return c.json({
35 -
		client_id: clientId,
36 -
		client_name: "Steve Dylan's Blog",
37 -
		client_uri: c.env.API_URL,
38 -
		redirect_uris: [redirectUri],
39 -
		grant_types: ["authorization_code", "refresh_token"],
40 -
		response_types: ["code"],
41 -
		scope: "atproto blob:*/* repo:site.standard.document",
42 -
		token_endpoint_auth_method: "none",
43 -
		application_type: "web",
44 -
		dpop_bound_access_tokens: true,
45 -
	});
46 -
});
47 -
48 -
// Start OAuth login flow
49 -
auth.get("/login", async (c) => {
50 -
	try {
51 -
		const clientId = `${c.env.API_URL}/auth/client-metadata.json`;
52 -
		const redirectUri = `${c.env.API_URL}/auth/callback`;
53 -
54 -
		const { authUrl } = await initiateOAuthFlow(c.env.SESSIONS, {
55 -
			pdsUrl: c.env.PDS_URL,
56 -
			clientId,
57 -
			redirectUri,
58 -
      scope: "atproto blob:*/* repo:site.standard.document",
59 -
		});
60 -
61 -
		return c.redirect(authUrl);
62 -
	} catch (error) {
63 -
		console.error("Login error:", error);
64 -
		return c.redirect(`${c.env.CLIENT_URL}/now?error=login_failed`);
65 -
	}
66 -
});
67 -
68 -
// OAuth callback handler
69 -
auth.get("/callback", async (c) => {
70 -
	try {
71 -
		const code = c.req.query("code");
72 -
		const state = c.req.query("state");
73 -
		const error = c.req.query("error");
74 -
		const errorDescription = c.req.query("error_description");
75 -
76 -
		// Handle OAuth errors
77 -
		if (error) {
78 -
			console.error("OAuth error:", error, errorDescription);
79 -
			return c.redirect(
80 -
				`${c.env.CLIENT_URL}/now?error=${encodeURIComponent(error)}`,
81 -
			);
82 -
		}
83 -
84 -
		if (!code || !state) {
85 -
			return c.redirect(`${c.env.CLIENT_URL}/now?error=missing_params`);
86 -
		}
87 -
88 -
		const clientId = `${c.env.API_URL}/auth/client-metadata.json`;
89 -
		const redirectUri = `${c.env.API_URL}/auth/callback`;
90 -
91 -
		const oauthResult = await completeOAuthFlow(
92 -
			c.env.SESSIONS,
93 -
			c.env.PDS_URL,
94 -
			code,
95 -
			state,
96 -
			clientId,
97 -
			redirectUri,
98 -
		);
99 -
100 -
		if (!oauthResult) {
101 -
			return c.redirect(`${c.env.CLIENT_URL}/now?error=invalid_state`);
102 -
		}
103 -
104 -
		const { tokenResponse, dpopKeyPair, dpopNonce } = oauthResult;
105 -
106 -
		// CRITICAL: Only allow the site owner
107 -
		if (tokenResponse.sub !== c.env.ALLOWED_DID) {
108 -
			console.error("Unauthorized login attempt from:", tokenResponse.sub);
109 -
			return c.redirect(`${c.env.CLIENT_URL}/now?error=unauthorized`);
110 -
		}
111 -
112 -
		// Create session
113 -
		const sessionId = await createSession(
114 -
			c.env.SESSIONS,
115 -
			tokenResponse.access_token,
116 -
			tokenResponse.refresh_token || "",
117 -
			dpopKeyPair,
118 -
			dpopNonce,
119 -
			tokenResponse.sub,
120 -
			tokenResponse.expires_in,
121 -
		);
122 -
123 -
		// Set session cookie and redirect to /now
124 -
		setSessionCookie(c, sessionId, c.env.CLIENT_URL);
125 -
		return c.redirect(`${c.env.CLIENT_URL}/now/post`);
126 -
	} catch (error) {
127 -
		console.error("Callback error:", error);
128 -
		return c.redirect(`${c.env.CLIENT_URL}/now?error=callback_failed`);
129 -
	}
130 -
});
131 -
132 -
// Logout endpoint
133 -
auth.post("/logout", async (c) => {
134 -
	const sessionId = getSessionIdFromCookie(c);
135 -
136 -
	if (sessionId) {
137 -
		await deleteSession(c.env.SESSIONS, sessionId);
138 -
	}
139 -
140 -
	clearSessionCookie(c, c.env.CLIENT_URL);
141 -
142 -
	return c.json({ success: true });
143 -
});
144 -
145 -
// Check auth status
146 -
auth.get("/status", async (c) => {
147 -
	const sessionId = getSessionIdFromCookie(c);
148 -
149 -
	if (!sessionId) {
150 -
		return c.json({ authenticated: false });
151 -
	}
152 -
153 -
	const sessionData = await getSession(c.env.SESSIONS, sessionId);
154 -
	if (!sessionData) {
155 -
		clearSessionCookie(c, c.env.CLIENT_URL);
156 -
		return c.json({ authenticated: false });
157 -
	}
158 -
159 -
	const { session, dpopKeyPair } = sessionData;
160 -
161 -
	// Check if token needs refresh
162 -
	if (isTokenExpired(session.expiresAt) && session.refreshToken) {
163 -
		try {
164 -
			const metadata = await fetchOAuthMetadata(c.env.PDS_URL);
165 -
			const clientId = `${c.env.API_URL}/auth/client-metadata.json`;
166 -
167 -
			const { tokenResponse, dpopNonce } = await refreshAccessToken(
168 -
				metadata,
169 -
				session.refreshToken,
170 -
				clientId,
171 -
				dpopKeyPair,
172 -
				session.dpopNonce,
173 -
			);
174 -
175 -
			// Update session with new tokens
176 -
			await updateSession(
177 -
				c.env.SESSIONS,
178 -
				sessionId,
179 -
				tokenResponse.access_token,
180 -
				tokenResponse.refresh_token || session.refreshToken,
181 -
				dpopNonce,
182 -
				tokenResponse.expires_in,
183 -
			);
184 -
185 -
			return c.json({
186 -
				authenticated: true,
187 -
				did: session.did,
188 -
				handle: session.handle,
189 -
			});
190 -
		} catch (error) {
191 -
			console.error("Token refresh failed:", error);
192 -
			await deleteSession(c.env.SESSIONS, sessionId);
193 -
			clearSessionCookie(c, c.env.CLIENT_URL);
194 -
			return c.json({ authenticated: false });
195 -
		}
196 -
	}
197 -
198 -
	return c.json({
199 -
		authenticated: true,
200 -
		did: session.did,
201 -
		handle: session.handle,
202 -
	});
203 -
});
204 -
205 -
export default auth;
packages/server/src/routes/guest-auth.ts (deleted) +0 −341
1 -
import { Hono } from "hono";
2 -
import {
3 -
	fetchOAuthMetadata,
4 -
	refreshAccessToken,
5 -
	initiateOAuthFlow,
6 -
	completeOAuthFlow,
7 -
} from "../lib/oauth";
8 -
import {
9 -
	createSession,
10 -
	getSession,
11 -
	deleteSession,
12 -
	getSessionIdFromCookie,
13 -
	setSessionCookie,
14 -
	clearSessionCookie,
15 -
	isTokenExpired,
16 -
	updateSession,
17 -
} from "../lib/session";
18 -
19 -
interface Env {
20 -
	SESSIONS: KVNamespace;
21 -
	ALLOWED_DID: string;
22 -
	PDS_URL: string;
23 -
	CLIENT_URL: string;
24 -
	API_URL: string;
25 -
}
26 -
27 -
const guestAuth = new Hono<{ Bindings: Env }>();
28 -
29 -
// OAuth client metadata endpoint for guests
30 -
guestAuth.get("/client-metadata.json", (c) => {
31 -
	const clientId = `${c.env.API_URL}/guest-auth/client-metadata.json`;
32 -
	const redirectUri = `${c.env.API_URL}/guest-auth/callback`;
33 -
34 -
	return c.json({
35 -
		client_id: clientId,
36 -
		client_name: "Steve Dylan's Blog (Guest)",
37 -
		client_uri: c.env.API_URL,
38 -
		redirect_uris: [redirectUri],
39 -
		grant_types: ["authorization_code", "refresh_token"],
40 -
		response_types: ["code"],
41 -
		scope: "atproto repo:site.standard.document.comment?action=create",
42 -
		token_endpoint_auth_method: "none",
43 -
		application_type: "web",
44 -
		dpop_bound_access_tokens: true,
45 -
	});
46 -
});
47 -
48 -
// Resolve handle to PDS URL
49 -
async function resolveHandleToPDS(handle: string): Promise<string> {
50 -
	// First, resolve the handle to a DID
51 -
	let did: string;
52 -
53 -
	if (handle.startsWith("did:")) {
54 -
		did = handle;
55 -
	} else {
56 -
		// Try to resolve handle via Bluesky API
57 -
		const resolveUrl = `https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle?handle=${encodeURIComponent(handle)}`;
58 -
		const resolveResponse = await fetch(resolveUrl);
59 -
		if (!resolveResponse.ok) {
60 -
			throw new Error("Could not resolve handle");
61 -
		}
62 -
		const resolveData = (await resolveResponse.json()) as { did: string };
63 -
		did = resolveData.did;
64 -
	}
65 -
66 -
	// Now resolve the DID to get the PDS URL from the DID document
67 -
	let pdsUrl: string | undefined;
68 -
69 -
	if (did.startsWith("did:plc:")) {
70 -
		// Fetch DID document from plc.directory
71 -
		const didDocUrl = `https://plc.directory/${did}`;
72 -
		const didDocResponse = await fetch(didDocUrl);
73 -
		if (!didDocResponse.ok) {
74 -
			throw new Error("Could not fetch DID document");
75 -
		}
76 -
		const didDoc = (await didDocResponse.json()) as {
77 -
			service?: Array<{ id: string; type: string; serviceEndpoint: string }>;
78 -
		};
79 -
80 -
		// Find the PDS service endpoint
81 -
		const pdsService = didDoc.service?.find(
82 -
			(s) => s.id === "#atproto_pds" || s.type === "AtprotoPersonalDataServer",
83 -
		);
84 -
		pdsUrl = pdsService?.serviceEndpoint;
85 -
	} else if (did.startsWith("did:web:")) {
86 -
		// For did:web, fetch the DID document from the domain
87 -
		const domain = did.replace("did:web:", "");
88 -
		const didDocUrl = `https://${domain}/.well-known/did.json`;
89 -
		const didDocResponse = await fetch(didDocUrl);
90 -
		if (!didDocResponse.ok) {
91 -
			throw new Error("Could not fetch DID document");
92 -
		}
93 -
		const didDoc = (await didDocResponse.json()) as {
94 -
			service?: Array<{ id: string; type: string; serviceEndpoint: string }>;
95 -
		};
96 -
97 -
		const pdsService = didDoc.service?.find(
98 -
			(s) => s.id === "#atproto_pds" || s.type === "AtprotoPersonalDataServer",
99 -
		);
100 -
		pdsUrl = pdsService?.serviceEndpoint;
101 -
	}
102 -
103 -
	if (!pdsUrl) {
104 -
		throw new Error("Could not find PDS URL for user");
105 -
	}
106 -
107 -
	return pdsUrl;
108 -
}
109 -
110 -
// Start OAuth login flow for guests
111 -
guestAuth.get("/login", async (c) => {
112 -
	try {
113 -
		const clientId = `${c.env.API_URL}/guest-auth/client-metadata.json`;
114 -
		const redirectUri = `${c.env.API_URL}/guest-auth/callback`;
115 -
116 -
		// Get handle from query params (required for guests)
117 -
		const handle = c.req.query("handle");
118 -
		const returnTo = c.req.query("returnTo") || "/now";
119 -
120 -
		if (!handle) {
121 -
			return c.redirect(`${c.env.CLIENT_URL}/now?error=handle_required`);
122 -
		}
123 -
124 -
		// Resolve handle to their PDS
125 -
		let pdsUrl: string;
126 -
		try {
127 -
			pdsUrl = await resolveHandleToPDS(handle);
128 -
		} catch (err) {
129 -
			console.error("Failed to resolve handle:", err);
130 -
			return c.redirect(`${c.env.CLIENT_URL}/now?error=invalid_handle`);
131 -
		}
132 -
133 -
		const { authUrl, state } = await initiateOAuthFlow(c.env.SESSIONS, {
134 -
			pdsUrl,
135 -
			clientId,
136 -
			redirectUri,
137 -
			scope: "atproto repo:site.standard.document.comment?action=create",
138 -
		});
139 -
140 -
		// Store returnTo and pdsUrl separately to retrieve after callback
141 -
		await c.env.SESSIONS.put(
142 -
			`guest_return:${state}`,
143 -
			returnTo,
144 -
			{ expirationTtl: 600 }, // 10 minutes
145 -
		);
146 -
		await c.env.SESSIONS.put(
147 -
			`guest_pds:${state}`,
148 -
			pdsUrl,
149 -
			{ expirationTtl: 600 }, // 10 minutes
150 -
		);
151 -
152 -
		return c.redirect(authUrl);
153 -
	} catch (error) {
154 -
		console.error("Guest login error:", error);
155 -
		return c.redirect(`${c.env.CLIENT_URL}/now?error=login_failed`);
156 -
	}
157 -
});
158 -
159 -
// OAuth callback handler for guests
160 -
guestAuth.get("/callback", async (c) => {
161 -
	try {
162 -
		const code = c.req.query("code");
163 -
		const state = c.req.query("state");
164 -
		const error = c.req.query("error");
165 -
		const errorDescription = c.req.query("error_description");
166 -
167 -
		// Handle OAuth errors
168 -
		if (error) {
169 -
			console.error("OAuth error:", error, errorDescription);
170 -
			return c.redirect(
171 -
				`${c.env.CLIENT_URL}/now?error=${encodeURIComponent(error)}`,
172 -
			);
173 -
		}
174 -
175 -
		if (!code || !state) {
176 -
			return c.redirect(`${c.env.CLIENT_URL}/now?error=missing_params`);
177 -
		}
178 -
179 -
		// Get return URL and PDS URL
180 -
		const returnTo =
181 -
			(await c.env.SESSIONS.get(`guest_return:${state}`)) || "/now";
182 -
		const pdsUrl = await c.env.SESSIONS.get(`guest_pds:${state}`);
183 -
		await c.env.SESSIONS.delete(`guest_return:${state}`);
184 -
		await c.env.SESSIONS.delete(`guest_pds:${state}`);
185 -
186 -
		if (!pdsUrl) {
187 -
			return c.redirect(`${c.env.CLIENT_URL}/now?error=missing_pds`);
188 -
		}
189 -
190 -
		const clientId = `${c.env.API_URL}/guest-auth/client-metadata.json`;
191 -
		const redirectUri = `${c.env.API_URL}/guest-auth/callback`;
192 -
193 -
		const oauthResult = await completeOAuthFlow(
194 -
			c.env.SESSIONS,
195 -
			pdsUrl,
196 -
			code,
197 -
			state,
198 -
			clientId,
199 -
			redirectUri,
200 -
		);
201 -
202 -
		if (!oauthResult) {
203 -
			return c.redirect(`${c.env.CLIENT_URL}/now?error=invalid_state`);
204 -
		}
205 -
206 -
		const { tokenResponse, dpopKeyPair, dpopNonce } = oauthResult;
207 -
208 -
		// For guests, allow any ATProto account (no DID check)
209 -
		// Create session with a "guest_" prefix to differentiate from admin sessions
210 -
		const sessionId = await createSession(
211 -
			c.env.SESSIONS,
212 -
			tokenResponse.access_token,
213 -
			tokenResponse.refresh_token || "",
214 -
			dpopKeyPair,
215 -
			dpopNonce,
216 -
			tokenResponse.sub,
217 -
			tokenResponse.expires_in,
218 -
			undefined, // handle
219 -
			pdsUrl, // user's PDS URL
220 -
		);
221 -
222 -
		// Prefix session ID to mark as guest
223 -
		const guestSessionId = `guest_${sessionId}`;
224 -
225 -
		// Store the original session ID mapping
226 -
		await c.env.SESSIONS.put(
227 -
			`guest_session:${guestSessionId}`,
228 -
			sessionId,
229 -
			{ expirationTtl: 60 * 60 * 24 * 14 }, // 14 days
230 -
		);
231 -
232 -
		// Set session cookie and redirect to return URL
233 -
		setSessionCookie(c, guestSessionId, c.env.CLIENT_URL);
234 -
		return c.redirect(`${c.env.CLIENT_URL}${returnTo}`);
235 -
	} catch (error) {
236 -
		console.error("Guest callback error:", error);
237 -
		return c.redirect(`${c.env.CLIENT_URL}/now?error=callback_failed`);
238 -
	}
239 -
});
240 -
241 -
// Logout endpoint for guests
242 -
guestAuth.post("/logout", async (c) => {
243 -
	const sessionId = getSessionIdFromCookie(c);
244 -
245 -
	if (sessionId?.startsWith("guest_")) {
246 -
		// Get original session ID
247 -
		const originalSessionId = await c.env.SESSIONS.get(
248 -
			`guest_session:${sessionId}`,
249 -
		);
250 -
		if (originalSessionId) {
251 -
			await deleteSession(c.env.SESSIONS, originalSessionId);
252 -
			await c.env.SESSIONS.delete(`guest_session:${sessionId}`);
253 -
		}
254 -
	}
255 -
256 -
	clearSessionCookie(c, c.env.CLIENT_URL);
257 -
	return c.json({ success: true });
258 -
});
259 -
260 -
// Check auth status for guests
261 -
guestAuth.get("/status", async (c) => {
262 -
	const sessionId = getSessionIdFromCookie(c);
263 -
264 -
	if (!sessionId || !sessionId.startsWith("guest_")) {
265 -
		return c.json({ authenticated: false });
266 -
	}
267 -
268 -
	// Get original session ID
269 -
	const originalSessionId = await c.env.SESSIONS.get(
270 -
		`guest_session:${sessionId}`,
271 -
	);
272 -
	if (!originalSessionId) {
273 -
		clearSessionCookie(c, c.env.CLIENT_URL);
274 -
		return c.json({ authenticated: false });
275 -
	}
276 -
277 -
	const sessionData = await getSession(c.env.SESSIONS, originalSessionId);
278 -
	if (!sessionData) {
279 -
		clearSessionCookie(c, c.env.CLIENT_URL);
280 -
		await c.env.SESSIONS.delete(`guest_session:${sessionId}`);
281 -
		return c.json({ authenticated: false });
282 -
	}
283 -
284 -
	const { session, dpopKeyPair } = sessionData;
285 -
286 -
	// Check if token needs refresh
287 -
	if (isTokenExpired(session.expiresAt) && session.refreshToken) {
288 -
		try {
289 -
			// Use the user's PDS URL stored in session
290 -
			if (!session.pdsUrl) {
291 -
				console.error("No PDS URL in session for token refresh");
292 -
				await deleteSession(c.env.SESSIONS, originalSessionId);
293 -
				await c.env.SESSIONS.delete(`guest_session:${sessionId}`);
294 -
				clearSessionCookie(c, c.env.CLIENT_URL);
295 -
				return c.json({ authenticated: false });
296 -
			}
297 -
			const metadata = await fetchOAuthMetadata(session.pdsUrl);
298 -
			const clientId = `${c.env.API_URL}/guest-auth/client-metadata.json`;
299 -
300 -
			const { tokenResponse, dpopNonce } = await refreshAccessToken(
301 -
				metadata,
302 -
				session.refreshToken,
303 -
				clientId,
304 -
				dpopKeyPair,
305 -
				session.dpopNonce,
306 -
			);
307 -
308 -
			// Update session with new tokens
309 -
			await updateSession(
310 -
				c.env.SESSIONS,
311 -
				originalSessionId,
312 -
				tokenResponse.access_token,
313 -
				tokenResponse.refresh_token || session.refreshToken,
314 -
				dpopNonce,
315 -
				tokenResponse.expires_in,
316 -
			);
317 -
318 -
			return c.json({
319 -
				authenticated: true,
320 -
				did: session.did,
321 -
				handle: session.handle,
322 -
				isGuest: true,
323 -
			});
324 -
		} catch (error) {
325 -
			console.error("Token refresh failed:", error);
326 -
			await deleteSession(c.env.SESSIONS, originalSessionId);
327 -
			await c.env.SESSIONS.delete(`guest_session:${sessionId}`);
328 -
			clearSessionCookie(c, c.env.CLIENT_URL);
329 -
			return c.json({ authenticated: false });
330 -
		}
331 -
	}
332 -
333 -
	return c.json({
334 -
		authenticated: true,
335 -
		did: session.did,
336 -
		handle: session.handle,
337 -
		isGuest: true,
338 -
	});
339 -
});
340 -
341 -
export default guestAuth;
packages/server/src/routes/home.ts (deleted) +0 −9
1 -
import { Hono } from "hono";
2 -
3 -
const home = new Hono();
4 -
5 -
home.get("/", (c) => {
6 -
	return c.text("Hello Hono!");
7 -
});
8 -
9 -
export default home;
packages/server/src/routes/index.ts (deleted) +0 −5
1 -
export { default as home } from "./home";
2 -
export { default as now } from "./now";
3 -
export { default as auth } from "./auth";
4 -
// COMMENTS FUNCTIONALITY DISABLED
5 -
// export { default as guestAuth } from "./guest-auth";
packages/server/src/routes/now.ts (deleted) +0 −770
1 -
import { Hono } from "hono";
2 -
import { Feed } from "feed";
3 -
import type { ListRecordsResponse } from "../types";
4 -
import { createDPoPProof, extractDPoPNonce } from "../lib/dpop";
5 -
import { fetchOAuthMetadata, refreshAccessToken } from "../lib/oauth";
6 -
import {
7 -
	getSession,
8 -
	getSessionIdFromCookie,
9 -
	isTokenExpired,
10 -
	updateSession,
11 -
} from "../lib/session";
12 -
13 -
interface Env {
14 -
	SESSIONS: KVNamespace;
15 -
	ALLOWED_DID: string;
16 -
	PDS_URL: string;
17 -
	CLIENT_URL: string;
18 -
	API_URL: string;
19 -
}
20 -
21 -
const now = new Hono<{ Bindings: Env }>();
22 -
23 -
const PDS_URL = "https://andromeda.social";
24 -
25 -
// COMMENTS FUNCTIONALITY DISABLED
26 -
// // Helper function to get session for both admin and guest users
27 -
// async function getAnySession(c: any, sessionId: string) {
28 -
// 	if (sessionId.startsWith("guest_")) {
29 -
// 		// Guest session
30 -
// 		const originalSessionId = await c.env.SESSIONS.get(
31 -
// 			`guest_session:${sessionId}`,
32 -
// 		);
33 -
// 		if (!originalSessionId) return null;
34 -
// 		return await getSession(c.env.SESSIONS, originalSessionId);
35 -
// 	} else {
36 -
// 		// Admin session
37 -
// 		return await getSession(c.env.SESSIONS, sessionId);
38 -
// 	}
39 -
// }
40 -
41 -
// Upload an image blob to the PDS
42 -
now.post("/upload", async (c) => {
43 -
	try {
44 -
		const sessionId = getSessionIdFromCookie(c);
45 -
		if (!sessionId) {
46 -
			return c.json({ error: "Not authenticated" }, 401);
47 -
		}
48 -
49 -
		const sessionData = await getSession(c.env.SESSIONS, sessionId);
50 -
		if (!sessionData) {
51 -
			return c.json({ error: "Session not found" }, 401);
52 -
		}
53 -
54 -
		let { session, dpopKeyPair } = sessionData;
55 -
56 -
		// Refresh token if expired
57 -
		if (isTokenExpired(session.expiresAt) && session.refreshToken) {
58 -
			const metadata = await fetchOAuthMetadata(c.env.PDS_URL);
59 -
			const clientId = `${c.env.API_URL}/auth/client-metadata.json`;
60 -
61 -
			const { tokenResponse, dpopNonce } = await refreshAccessToken(
62 -
				metadata,
63 -
				session.refreshToken,
64 -
				clientId,
65 -
				dpopKeyPair,
66 -
				session.dpopNonce,
67 -
			);
68 -
69 -
			await updateSession(
70 -
				c.env.SESSIONS,
71 -
				sessionId,
72 -
				tokenResponse.access_token,
73 -
				tokenResponse.refresh_token || session.refreshToken,
74 -
				dpopNonce,
75 -
				tokenResponse.expires_in,
76 -
			);
77 -
78 -
			session.accessToken = tokenResponse.access_token;
79 -
			session.dpopNonce = dpopNonce;
80 -
		}
81 -
82 -
		// Parse multipart form data
83 -
		const body = await c.req.parseBody();
84 -
		const file = body["file"];
85 -
86 -
		if (!file || !(file instanceof File)) {
87 -
			return c.json({ error: "No file provided" }, 400);
88 -
		}
89 -
90 -
		// Validate file type
91 -
		const allowedTypes = ["image/png", "image/jpeg", "image/webp", "image/gif"];
92 -
		if (!allowedTypes.includes(file.type)) {
93 -
			return c.json(
94 -
				{ error: "Invalid file type. Allowed: png, jpeg, webp, gif" },
95 -
				400,
96 -
			);
97 -
		}
98 -
99 -
		// Validate file size (max 100MB - matches PDS_BLOB_UPLOAD_LIMIT)
100 -
		const maxSize = 100 * 1024 * 1024;
101 -
		if (file.size > maxSize) {
102 -
			return c.json({ error: "File too large. Maximum size is 100MB" }, 400);
103 -
		}
104 -
105 -
		const fileBytes = new Uint8Array(await file.arrayBuffer());
106 -
		const uploadUrl = `${c.env.PDS_URL}/xrpc/com.atproto.repo.uploadBlob`;
107 -
108 -
		const makeUploadRequest = async (nonce?: string): Promise<Response> => {
109 -
			const dpopProof = await createDPoPProof(dpopKeyPair, {
110 -
				method: "POST",
111 -
				url: uploadUrl,
112 -
				nonce: nonce || session.dpopNonce,
113 -
				accessToken: session.accessToken,
114 -
			});
115 -
116 -
			return fetch(uploadUrl, {
117 -
				method: "POST",
118 -
				headers: {
119 -
					"Content-Type": file.type,
120 -
					Authorization: `DPoP ${session.accessToken}`,
121 -
					DPoP: dpopProof,
122 -
				},
123 -
				body: fileBytes,
124 -
			});
125 -
		};
126 -
127 -
		let response = await makeUploadRequest();
128 -
129 -
		// Handle DPoP nonce requirement
130 -
		if (response.status === 401) {
131 -
			const newNonce = extractDPoPNonce(response);
132 -
			if (newNonce) {
133 -
				response = await makeUploadRequest(newNonce);
134 -
135 -
				await updateSession(
136 -
					c.env.SESSIONS,
137 -
					sessionId,
138 -
					session.accessToken,
139 -
					session.refreshToken,
140 -
					newNonce,
141 -
					Math.floor((session.expiresAt - Date.now()) / 1000),
142 -
				);
143 -
			}
144 -
		}
145 -
146 -
		if (!response.ok) {
147 -
			const errorData = await response.json();
148 -
			console.error("Failed to upload blob:", errorData);
149 -
			return c.json(
150 -
				{ error: "Failed to upload image", details: errorData },
151 -
				response.status as 400 | 401 | 403 | 500,
152 -
			);
153 -
		}
154 -
155 -
		const result = (await response.json()) as {
156 -
			blob: {
157 -
				$type: string;
158 -
				ref: { $link: string };
159 -
				mimeType: string;
160 -
				size: number;
161 -
			};
162 -
		};
163 -
164 -
		// Build public blob URL
165 -
		const blobUrl = `https://andromeda.social/xrpc/com.atproto.sync.getBlob?did=${session.did}&cid=${result.blob.ref.$link}`;
166 -
167 -
		return c.json({ blob: result.blob, blobUrl });
168 -
	} catch (error) {
169 -
		console.error("Error uploading blob:", error);
170 -
		return c.json({ error: "Internal server error" }, 500);
171 -
	}
172 -
});
173 -
174 -
// Create a new post
175 -
now.post("/post", async (c) => {
176 -
	try {
177 -
		// Get session from cookie
178 -
		const sessionId = getSessionIdFromCookie(c);
179 -
		if (!sessionId) {
180 -
			return c.json({ error: "Not authenticated" }, 401);
181 -
		}
182 -
183 -
		const sessionData = await getSession(c.env.SESSIONS, sessionId);
184 -
		if (!sessionData) {
185 -
			return c.json({ error: "Session not found" }, 401);
186 -
		}
187 -
188 -
		let { session, dpopKeyPair } = sessionData;
189 -
190 -
		// Refresh token if expired
191 -
		if (isTokenExpired(session.expiresAt) && session.refreshToken) {
192 -
			const metadata = await fetchOAuthMetadata(c.env.PDS_URL);
193 -
			const clientId = `${c.env.API_URL}/auth/client-metadata.json`;
194 -
195 -
			const { tokenResponse, dpopNonce } = await refreshAccessToken(
196 -
				metadata,
197 -
				session.refreshToken,
198 -
				clientId,
199 -
				dpopKeyPair,
200 -
				session.dpopNonce,
201 -
			);
202 -
203 -
			// Update session with new tokens
204 -
			await updateSession(
205 -
				c.env.SESSIONS,
206 -
				sessionId,
207 -
				tokenResponse.access_token,
208 -
				tokenResponse.refresh_token || session.refreshToken,
209 -
				dpopNonce,
210 -
				tokenResponse.expires_in,
211 -
			);
212 -
213 -
			// Update local session object
214 -
			session.accessToken = tokenResponse.access_token;
215 -
			session.dpopNonce = dpopNonce;
216 -
		}
217 -
218 -
		// Parse request body
219 -
		const body = await c.req.json<{
220 -
			title: string;
221 -
			path?: string;
222 -
			content: string;
223 -
			coverImage?: {
224 -
				$type: string;
225 -
				ref: { $link: string };
226 -
				mimeType: string;
227 -
				size: number;
228 -
			};
229 -
		}>();
230 -
231 -
		if (!body.title || body.title.trim().length === 0) {
232 -
			return c.json({ error: "Document title is required" }, 400);
233 -
		}
234 -
235 -
		if (body.title.length > 128) {
236 -
			return c.json({ error: "Title must be 128 characters or less" }, 400);
237 -
		}
238 -
239 -
		if (!body.content || body.content.trim().length === 0) {
240 -
			return c.json({ error: "Content is required" }, 400);
241 -
		}
242 -
243 -
		// Normalize and validate path if provided
244 -
		let normalizedPath = body.path;
245 -
		if (normalizedPath) {
246 -
			// Add leading / if missing
247 -
			if (!normalizedPath.startsWith("/")) {
248 -
				normalizedPath = `/${normalizedPath}`;
249 -
			}
250 -
			// Ensure path starts with /now/
251 -
			if (!normalizedPath.startsWith("/now/")) {
252 -
				normalizedPath = `/now${normalizedPath}`;
253 -
			}
254 -
			// Basic validation: no spaces, no special chars except dashes and underscores
255 -
			if (!/^\/[a-zA-Z0-9\-_\/]*$/.test(normalizedPath)) {
256 -
				return c.json(
257 -
					{
258 -
						error:
259 -
							"Path can only contain letters, numbers, dashes, underscores, and slashes",
260 -
					},
261 -
					400,
262 -
				);
263 -
			}
264 -
		}
265 -
266 -
		// Create the document record using site.standard.document lexicon
267 -
		const createRecordUrl = `${c.env.PDS_URL}/xrpc/com.atproto.repo.createRecord`;
268 -
269 -
		// Create markdown content with $type
270 -
		const markdownContent = {
271 -
			$type: "site.standard.content.markdown",
272 -
			markdown: body.content.trim(),
273 -
		};
274 -
275 -
		// Strip markdown for textContent (basic implementation)
276 -
		const textContent = body.content
277 -
			.trim()
278 -
			.replace(/#{1,6}\s/g, "") // Remove headers
279 -
			.replace(/\*\*([^*]+)\*\*/g, "$1") // Remove bold
280 -
			.replace(/\*([^*]+)\*/g, "$1") // Remove italic
281 -
			.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") // Remove links, keep text
282 -
			.replace(/`([^`]+)`/g, "$1") // Remove code formatting
283 -
			.trim();
284 -
285 -
		const defaultCoverImage = {
286 -
			$type: "blob",
287 -
			ref: {
288 -
				$link:
289 -
					"bafkreibuxyp2gth3igqik7fxu4cm4nducetgp67hhlx36bwahgnuw4xmoa",
290 -
			},
291 -
			mimeType: "image/png",
292 -
			size: 2522,
293 -
		};
294 -
295 -
		const documentRecord = {
296 -
			repo: session.did,
297 -
			collection: "site.standard.document",
298 -
			record: {
299 -
				$type: "site.standard.document",
300 -
				title: body.title.trim(),
301 -
				site: "at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.publication/3mbykzswhqc2x",
302 -
				...(normalizedPath && { path: normalizedPath.trim() }),
303 -
				content: markdownContent,
304 -
				coverImage: body.coverImage || defaultCoverImage,
305 -
				textContent: textContent,
306 -
				publishedAt: new Date().toISOString(),
307 -
			},
308 -
		};
309 -
310 -
		// Make request with DPoP
311 -
		const makeRequest = async (nonce?: string): Promise<Response> => {
312 -
			const dpopProof = await createDPoPProof(dpopKeyPair, {
313 -
				method: "POST",
314 -
				url: createRecordUrl,
315 -
				nonce: nonce || session.dpopNonce,
316 -
				accessToken: session.accessToken,
317 -
			});
318 -
319 -
			return fetch(createRecordUrl, {
320 -
				method: "POST",
321 -
				headers: {
322 -
					"Content-Type": "application/json",
323 -
					Authorization: `DPoP ${session.accessToken}`,
324 -
					DPoP: dpopProof,
325 -
				},
326 -
				body: JSON.stringify(documentRecord),
327 -
			});
328 -
		};
329 -
330 -
		let response = await makeRequest();
331 -
332 -
		// Handle DPoP nonce requirement
333 -
		if (response.status === 401) {
334 -
			const newNonce = extractDPoPNonce(response);
335 -
			if (newNonce) {
336 -
				// Retry with new nonce
337 -
				response = await makeRequest(newNonce);
338 -
339 -
				// Update session with new nonce
340 -
				await updateSession(
341 -
					c.env.SESSIONS,
342 -
					sessionId,
343 -
					session.accessToken,
344 -
					session.refreshToken,
345 -
					newNonce,
346 -
					Math.floor((session.expiresAt - Date.now()) / 1000),
347 -
				);
348 -
			}
349 -
		}
350 -
351 -
		if (!response.ok) {
352 -
			const errorData = await response.json();
353 -
			console.error("Failed to create document:", errorData);
354 -
			return c.json(
355 -
				{ error: "Failed to create document", details: errorData },
356 -
				response.status as 400 | 401 | 403 | 500,
357 -
			);
358 -
		}
359 -
360 -
		const result = (await response.json()) as { uri: string; cid: string };
361 -
		return c.json({ success: true, uri: result.uri, cid: result.cid });
362 -
	} catch (error) {
363 -
		console.error("Error creating document:", error);
364 -
		return c.json({ error: "Internal server error" }, 500);
365 -
	}
366 -
});
367 -
368 -
now.get("/rss", async (c) => {
369 -
	try {
370 -
		// Fetch documents directly from your PDS using the repo.listRecords endpoint
371 -
		const response = await fetch(
372 -
			`${PDS_URL}/xrpc/com.atproto.repo.listRecords?` +
373 -
				new URLSearchParams({
374 -
					repo: c.env.ALLOWED_DID,
375 -
					collection: "site.standard.document",
376 -
					limit: "50",
377 -
				}),
378 -
		);
379 -
380 -
		if (!response.ok) {
381 -
			throw new Error(`HTTP error! status: ${response.status}`);
382 -
		}
383 -
384 -
		const data = (await response.json()) as ListRecordsResponse;
385 -
386 -
		// Only include documents from the site publication, excluding blog posts
387 -
		const documents = data.records.filter(
388 -
			(doc) =>
389 -
				doc.value?.site ===
390 -
					"at://did:plc:ia2zdnhjaokf5lazhxrmj6eu/site.standard.publication/3mbykzswhqc2x" &&
391 -
				!doc.value?.path?.includes("/posts"),
392 -
		);
393 -
394 -
		// Create the feed
395 -
		const feed = new Feed({
396 -
			title: "Steve Dylan - Updates",
397 -
			description:
398 -
				"Small updates from my life that don't quite fit into a blog",
399 -
			id: "https://stevedylan.dev/",
400 -
			link: "https://stevedylan.dev/",
401 -
			language: "en",
402 -
			favicon: "https://stevedylan.dev/favicon.ico",
403 -
			copyright: "All rights reserved, Steve Dylan",
404 -
			updated: new Date(),
405 -
			feedLinks: {
406 -
				rss: "https://stevedylan.dev/now/rss",
407 -
			},
408 -
			author: {
409 -
				name: "Steve Dylan",
410 -
				link: "https://stevedylan.dev",
411 -
			},
412 -
		});
413 -
414 -
		// Add documents to the feed
415 -
		documents.forEach((record) => {
416 -
			const doc = record.value;
417 -
			const rkey = record.uri.split("/").pop();
418 -
419 -
			// Use custom path if available, otherwise use rkey
420 -
			const urlPath = doc.path || `/${rkey}`;
421 -
			const fullUrl = `https://stevedylan.dev${urlPath}`;
422 -
423 -
			// Extract content - prefer markdown content, fallback to textContent
424 -
			let content = doc.title;
425 -
			let description = doc.title;
426 -
427 -
			if (doc.content && doc.content.markdown) {
428 -
				content = doc.content.markdown;
429 -
				description = doc.textContent || doc.title;
430 -
			} else if (doc.textContent) {
431 -
				content = doc.textContent;
432 -
				description = doc.textContent;
433 -
			}
434 -
435 -
			feed.addItem({
436 -
				title: doc.title,
437 -
				id: fullUrl,
438 -
				link: fullUrl,
439 -
				description: description,
440 -
				content: content,
441 -
				date: new Date(doc.publishedAt),
442 -
			});
443 -
		});
444 -
445 -
		// Return RSS 2.0 feed
446 -
		const rssOutput = feed.rss2();
447 -
448 -
		return c.text(rssOutput, 200, {
449 -
			"Content-Type": "application/xml",
450 -
		});
451 -
	} catch (error) {
452 -
		console.error("Error generating RSS feed:", error);
453 -
454 -
		// Return an empty feed on error
455 -
		const errorFeed = new Feed({
456 -
			title: "Steve Dylan - Updates",
457 -
			description:
458 -
				"Small updates from my life that don't quite fit into a blog",
459 -
			id: "https://stevedylan.dev/",
460 -
			link: "https://stevedylan.dev/",
461 -
			language: "en",
462 -
			updated: new Date(),
463 -
			copyright: "All rights reserved, Steve Dylan",
464 -
			author: {
465 -
				name: "Steve Dylan",
466 -
				link: "https://stevedylan.dev",
467 -
			},
468 -
		});
469 -
470 -
		return c.text(errorFeed.rss2(), 200, {
471 -
			"Content-Type": "application/xml",
472 -
		});
473 -
	}
474 -
});
475 -
476 -
// COMMENTS FUNCTIONALITY DISABLED
477 -
// // Create a reply to a post (for guests)
478 -
// now.post("/reply", async (c) => {
479 -
// 	try {
480 -
// 		// Get session from cookie
481 -
// 		const sessionId = getSessionIdFromCookie(c);
482 -
// 		if (!sessionId) {
483 -
// 			return c.json({ error: "Not authenticated" }, 401);
484 -
// 		}
485 -
486 -
// 		const sessionData = await getAnySession(c, sessionId);
487 -
// 		if (!sessionData) {
488 -
// 			return c.json({ error: "Session not found" }, 401);
489 -
// 		}
490 -
491 -
// 		let { session, dpopKeyPair } = sessionData;
492 -
493 -
// 		// Determine which PDS to use (user's PDS for guests, env PDS for admin)
494 -
// 		const isGuest = sessionId.startsWith("guest_");
495 -
// 		const pdsUrl = isGuest && session.pdsUrl ? session.pdsUrl : c.env.PDS_URL;
496 -
497 -
// 		// Refresh token if expired
498 -
// 		if (isTokenExpired(session.expiresAt) && session.refreshToken) {
499 -
// 			const metadata = await fetchOAuthMetadata(pdsUrl);
500 -
// 			const clientId = isGuest
501 -
// 				? `${c.env.API_URL}/guest-auth/client-metadata.json`
502 -
// 				: `${c.env.API_URL}/auth/client-metadata.json`;
503 -
504 -
// 			const { tokenResponse, dpopNonce } = await refreshAccessToken(
505 -
// 				metadata,
506 -
// 				session.refreshToken,
507 -
// 				clientId,
508 -
// 				dpopKeyPair,
509 -
// 				session.dpopNonce,
510 -
// 			);
511 -
512 -
// 			// Get the actual session ID for update
513 -
// 			const actualSessionId = isGuest
514 -
// 				? (await c.env.SESSIONS.get(`guest_session:${sessionId}`)) || ""
515 -
// 				: sessionId;
516 -
517 -
// 			// Update session with new tokens
518 -
// 			await updateSession(
519 -
// 				c.env.SESSIONS,
520 -
// 				actualSessionId,
521 -
// 				tokenResponse.access_token,
522 -
// 				tokenResponse.refresh_token || session.refreshToken,
523 -
// 				dpopNonce,
524 -
// 				tokenResponse.expires_in,
525 -
// 			);
526 -
527 -
// 			// Update local session object
528 -
// 			session.accessToken = tokenResponse.access_token;
529 -
// 			session.dpopNonce = dpopNonce;
530 -
// 		}
531 -
532 -
// 		// Parse request body
533 -
// 		const body = await c.req.json<{
534 -
// 			parentUri: string;
535 -
// 			content: string;
536 -
// 		}>();
537 -
538 -
// 		if (!body.parentUri || body.parentUri.trim().length === 0) {
539 -
// 			return c.json({ error: "Parent URI is required" }, 400);
540 -
// 		}
541 -
542 -
// 		if (!body.content || body.content.trim().length === 0) {
543 -
// 			return c.json({ error: "Content is required" }, 400);
544 -
// 		}
545 -
546 -
// 		// Fetch the parent post to get its CID (use owner's PDS since that's where the post lives)
547 -
// 		const getRecordUrl =
548 -
// 			`${c.env.PDS_URL}/xrpc/com.atproto.repo.getRecord?` +
549 -
// 			new URLSearchParams({
550 -
// 				repo: body.parentUri.split("/")[2], // Extract DID from URI
551 -
// 				collection: body.parentUri.split("/")[3], // Extract collection
552 -
// 				rkey: body.parentUri.split("/")[4], // Extract rkey
553 -
// 			});
554 -
555 -
// 		const parentResponse = await fetch(getRecordUrl);
556 -
// 		if (!parentResponse.ok) {
557 -
// 			console.error("Failed to fetch parent post");
558 -
// 			return c.json({ error: "Failed to fetch parent post" }, 400);
559 -
// 		}
560 -
561 -
// 		const parentData = (await parentResponse.json()) as { cid: string };
562 -
// 		const parentCid = parentData.cid;
563 -
564 -
// 		// Fetch author profile to get handle, displayName, and avatar from Bluesky public API
565 -
// 		let authorHandle = session.did;
566 -
// 		let authorDisplayName: string | undefined;
567 -
// 		let authorAvatar: string | undefined;
568 -
569 -
// 		try {
570 -
// 			const profileUrl = `https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${session.did}`;
571 -
// 			const profileResponse = await fetch(profileUrl);
572 -
// 			if (profileResponse.ok) {
573 -
// 				const profileData = (await profileResponse.json()) as {
574 -
// 					handle?: string;
575 -
// 					displayName?: string;
576 -
// 					avatar?: string;
577 -
// 				};
578 -
// 				authorHandle = profileData.handle || session.did;
579 -
// 				authorDisplayName = profileData.displayName;
580 -
// 				authorAvatar = profileData.avatar;
581 -
// 			}
582 -
// 		} catch (err) {
583 -
// 			console.error("Failed to fetch author profile:", err);
584 -
// 		}
585 -
586 -
// 		// Create the comment record using site.standard.document.comment lexicon
587 -
// 		// Use the user's PDS URL since the record is stored in THEIR repo
588 -
// 		const createRecordUrl = `${pdsUrl}/xrpc/com.atproto.repo.createRecord`;
589 -
590 -
// 		const commentRecord = {
591 -
// 			repo: session.did,
592 -
// 			collection: "site.standard.document.comment",
593 -
// 			record: {
594 -
// 				$type: "site.standard.document.comment",
595 -
// 				parent: {
596 -
// 					uri: body.parentUri,
597 -
// 					cid: parentCid,
598 -
// 				},
599 -
// 				root: {
600 -
// 					uri: body.parentUri,
601 -
// 					cid: parentCid,
602 -
// 				},
603 -
// 				content: body.content.trim(),
604 -
// 				author: {
605 -
// 					did: session.did,
606 -
// 					handle: authorHandle,
607 -
// 					...(authorDisplayName && { displayName: authorDisplayName }),
608 -
// 					...(authorAvatar && { avatar: authorAvatar }),
609 -
// 				},
610 -
// 				createdAt: new Date().toISOString(),
611 -
// 			},
612 -
// 		};
613 -
614 -
// 		// Make request with DPoP
615 -
// 		const makeRequest = async (nonce?: string): Promise<Response> => {
616 -
// 			const dpopProof = await createDPoPProof(dpopKeyPair, {
617 -
// 				method: "POST",
618 -
// 				url: createRecordUrl,
619 -
// 				nonce: nonce || session.dpopNonce,
620 -
// 				accessToken: session.accessToken,
621 -
// 			});
622 -
623 -
// 			return fetch(createRecordUrl, {
624 -
// 				method: "POST",
625 -
// 				headers: {
626 -
// 					"Content-Type": "application/json",
627 -
// 					Authorization: `DPoP ${session.accessToken}`,
628 -
// 					DPoP: dpopProof,
629 -
// 				},
630 -
// 				body: JSON.stringify(commentRecord),
631 -
// 			});
632 -
// 		};
633 -
634 -
// 		let response = await makeRequest();
635 -
636 -
// 		// Handle DPoP nonce requirement
637 -
// 		if (response.status === 401) {
638 -
// 			const newNonce = extractDPoPNonce(response);
639 -
// 			if (newNonce) {
640 -
// 				// Retry with new nonce
641 -
// 				response = await makeRequest(newNonce);
642 -
643 -
// 				// Get the actual session ID for update
644 -
// 				const actualSessionId = isGuest
645 -
// 					? (await c.env.SESSIONS.get(`guest_session:${sessionId}`)) || ""
646 -
// 					: sessionId;
647 -
648 -
// 				// Update session with new nonce
649 -
// 				await updateSession(
650 -
// 					c.env.SESSIONS,
651 -
// 					actualSessionId,
652 -
// 					session.accessToken,
653 -
// 					session.refreshToken,
654 -
// 					newNonce,
655 -
// 					Math.floor((session.expiresAt - Date.now()) / 1000),
656 -
// 				);
657 -
// 			}
658 -
// 		}
659 -
660 -
// 		if (!response.ok) {
661 -
// 			const errorData = await response.json();
662 -
// 			console.error("Failed to create reply:", errorData);
663 -
// 			return c.json(
664 -
// 				{ error: "Failed to create reply", details: errorData },
665 -
// 				response.status as 400 | 401 | 403 | 500,
666 -
// 			);
667 -
// 		}
668 -
669 -
// 		const result = (await response.json()) as { uri: string; cid: string };
670 -
// 		return c.json({ success: true, uri: result.uri, cid: result.cid });
671 -
// 	} catch (error) {
672 -
// 		console.error("Error creating reply:", error);
673 -
// 		return c.json({ error: "Internal server error" }, 500);
674 -
// 	}
675 -
// });
676 -
677 -
// // Get comments for a post via TAP API
678 -
// now.get("/comments/:uri", async (c) => {
679 -
// 	try {
680 -
// 		const encodedUri = c.req.param("uri");
681 -
// 		const uri = decodeURIComponent(encodedUri);
682 -
683 -
// 		// First, get the list of comment URIs from TAP API
684 -
// 		const tapUrl = `https://tap.stevedylan.dev/comments?document=${encodeURIComponent(uri)}`;
685 -
// 		const response = await fetch(tapUrl);
686 -
687 -
// 		if (!response.ok) {
688 -
// 			console.error("Failed to fetch comment list from TAP:", response.status);
689 -
// 			return c.json({ replies: [] });
690 -
// 		}
691 -
692 -
// 		interface CommentReference {
693 -
// 			createdAt: string;
694 -
// 			did: string;
695 -
// 			uri: string;
696 -
// 		}
697 -
698 -
// 		const commentRefs: CommentReference[] = await response.json();
699 -
700 -
// 		// Fetch each individual comment using ATProto getRecord
701 -
// 		const commentPromises = commentRefs.map(async (ref) => {
702 -
// 			try {
703 -
// 				// Parse the AT URI: at://did:plc:.../collection/rkey
704 -
// 				const parts = ref.uri.split("/");
705 -
// 				const did = parts[2];
706 -
// 				const collection = parts[3];
707 -
// 				const rkey = parts[4];
708 -
709 -
// 				// Resolve the DID to find the PDS endpoint
710 -
// 				const didDoc = (await fetch(`https://plc.directory/${did}`).then((r) =>
711 -
// 					r.json(),
712 -
// 				)) as {
713 -
// 					service?: Array<{ type: string; serviceEndpoint: string }>;
714 -
// 				};
715 -
716 -
// 				// Find the PDS service endpoint
717 -
// 				const pdsService = didDoc.service?.find(
718 -
// 					(s) => s.type === "AtprotoPersonalDataServer",
719 -
// 				);
720 -
721 -
// 				if (!pdsService?.serviceEndpoint) {
722 -
// 					console.error(`No PDS found for DID: ${did}`);
723 -
// 					return null;
724 -
// 				}
725 -
726 -
// 				const pdsUrl = pdsService.serviceEndpoint;
727 -
728 -
// 				// Fetch the record from the user's PDS
729 -
// 				const getRecordUrl =
730 -
// 					`${pdsUrl}/xrpc/com.atproto.repo.getRecord?` +
731 -
// 					new URLSearchParams({
732 -
// 						repo: did,
733 -
// 						collection: collection,
734 -
// 						rkey: rkey,
735 -
// 					});
736 -
737 -
// 				const recordResponse = await fetch(getRecordUrl);
738 -
// 				if (!recordResponse.ok) {
739 -
// 					console.error(
740 -
// 						`Failed to fetch comment from PDS ${pdsUrl}: ${ref.uri}`,
741 -
// 					);
742 -
// 					return null;
743 -
// 				}
744 -
745 -
// 				const data = (await recordResponse.json()) as {
746 -
// 					value: Record<string, unknown>;
747 -
// 					cid: string;
748 -
// 				};
749 -
// 				return {
750 -
// 					...data.value,
751 -
// 					uri: ref.uri,
752 -
// 					cid: data.cid,
753 -
// 				};
754 -
// 			} catch (err) {
755 -
// 				console.error(`Error fetching comment ${ref.uri}:`, err);
756 -
// 				return null;
757 -
// 			}
758 -
// 		});
759 -
760 -
// 		const comments = await Promise.all(commentPromises);
761 -
// 		const validComments = comments.filter((comment) => comment !== null);
762 -
763 -
// 		return c.json({ replies: validComments });
764 -
// 	} catch (error) {
765 -
// 		console.error("Error fetching comments:", error);
766 -
// 		return c.json({ replies: [] });
767 -
// 	}
768 -
// });
769 -
770 -
export default now;
packages/server/src/types.ts (deleted) +0 −46
1 -
// Standard.site lexicon types
2 -
export interface StandardSiteMarkdownContent {
3 -
	$type: "site.standard.content.markdown";
4 -
	markdown: string;
5 -
}
6 -
7 -
export interface StandardSiteBlobRef {
8 -
	$type: "blob";
9 -
	ref: {
10 -
		$link: string;
11 -
	};
12 -
	mimeType: string;
13 -
	size: number;
14 -
}
15 -
16 -
export interface StandardSiteStrongRef {
17 -
	uri: string;
18 -
	cid: string;
19 -
}
20 -
21 -
export interface StandardSiteDocument {
22 -
	$type: "site.standard.document";
23 -
	site: string; // URI or HTTPS URL
24 -
	path?: string; // Path to combine with site
25 -
	title: string; // Max 128 graphemes
26 -
	description?: string; // Max 300 graphemes
27 -
	coverImage?: StandardSiteBlobRef; // Max 1MB
28 -
	content?: StandardSiteMarkdownContent; // Union type for content
29 -
	textContent?: string; // Plaintext without formatting
30 -
	bskyPostRef?: StandardSiteStrongRef; // Reference to Bluesky post
31 -
	tags?: string[]; // Max 50 graphemes per tag
32 -
	publishedAt: string; // ISO datetime string
33 -
	updatedAt?: string; // ISO datetime string
34 -
	location?: string; // Custom field for filtering posts by location
35 -
}
36 -
37 -
export interface StandardSiteDocumentRecord {
38 -
	uri: string;
39 -
	cid: string;
40 -
	value: StandardSiteDocument;
41 -
}
42 -
43 -
export interface ListRecordsResponse {
44 -
	records: StandardSiteDocumentRecord[];
45 -
	cursor?: string;
46 -
}
packages/server/tsconfig.json (deleted) +0 −13
1 -
{
2 -
	"compilerOptions": {
3 -
		"target": "ESNext",
4 -
		"module": "ESNext",
5 -
		"moduleResolution": "Bundler",
6 -
		"strict": true,
7 -
		"skipLibCheck": true,
8 -
		"lib": ["ESNext"],
9 -
		"types": ["@cloudflare/workers-types"],
10 -
		"jsx": "react-jsx",
11 -
		"jsxImportSource": "hono/jsx"
12 -
	}
13 -
}
packages/server/wrangler.jsonc (deleted) +0 −19
1 -
{
2 -
	"$schema": "node_modules/wrangler/config-schema.json",
3 -
	"name": "api-stevedylan-dev",
4 -
	"main": "src/index.ts",
5 -
	"compatibility_date": "2026-01-04",
6 -
	"compatibility_flags": ["nodejs_compat"],
7 -
	"vars": {
8 -
		"ALLOWED_DID": "did:plc:ia2zdnhjaokf5lazhxrmj6eu",
9 -
		"PDS_URL": "https://andromeda.social",
10 -
		"CLIENT_URL": "https://stevedylan.dev",
11 -
		"API_URL": "https://api.stevedylan.dev"
12 -
	},
13 -
	"kv_namespaces": [
14 -
		{
15 -
			"binding": "SESSIONS",
16 -
			"id": "796e0c7a685242aa83f7bbe15710d73f"
17 -
		}
18 -
	]
19 -
}