commit 2d48ef2139f1b832b21d454650e6d3cf0d2237b4
parent 1f03e0d4e80812461c08dc05d56a54c9350195c6
Author: Damian Myrda <damian@prime8.dev>
Date: Fri, 16 Jan 2026 22:53:29 -0600
rewrite website
Diffstat:
96 files changed, 7021 insertions(+), 10615 deletions(-)
diff --git a/Dockerfile b/Dockerfile
@@ -1,18 +0,0 @@
-FROM ghcr.io/getzola/zola:v0.19.2 AS web
-COPY ./web/ /src/
-WORKDIR /src/
-RUN ["zola", "build"]
-
-FROM caddy:builder AS caddy
-RUN xcaddy build \
- --with github.com/caddyserver/cache-handler \
- --with github.com/mholt/caddy-ratelimit
-
-FROM caddy:latest
-COPY --from=caddy /usr/bin/caddy /usr/bin/caddy
-COPY ./caddy /etc/caddy/Caddyfile
-COPY --from=web /src/public/ /web/
-EXPOSE 80 443 443/udp
-
-HEALTHCHECK --interval=60s --timeout=5s --start-period=5s \
- CMD curl -f http://localhost/ || exit 1
diff --git a/web/.gitignore b/web/.gitignore
@@ -1,3 +1,30 @@
-/data/
-/config/
-/public/
+# dependencies
+node_modules/
+
+# build output
+dist/
+
+# Astro
+.astro/
+
+# environment variables
+.env
+.env.local
+.env.*.local
+
+# macOS
+.DS_Store
+Thumbs.db
+
+# IDE
+.vscode/
+.idea/
+*.swp
+*.swo
+*~
+
+# logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
diff --git a/web/.husky/pre-commit b/web/.husky/pre-commit
@@ -0,0 +1 @@
+bunx lint-staged
diff --git a/web/.prettierignore b/web/.prettierignore
@@ -0,0 +1,3 @@
+dist
+node_modules
+bun.lock
diff --git a/web/.prettierrc b/web/.prettierrc
@@ -0,0 +1,16 @@
+{
+ "semi": true,
+ "singleQuote": false,
+ "tabWidth": 2,
+ "trailingComma": "all",
+ "printWidth": 80,
+ "plugins": ["prettier-plugin-astro"],
+ "overrides": [
+ {
+ "files": "*.astro",
+ "options": {
+ "parser": "astro"
+ }
+ }
+ ]
+}
diff --git a/web/Dockerfile b/web/Dockerfile
@@ -0,0 +1,22 @@
+FROM oven/bun:1 AS base
+WORKDIR /app
+
+FROM base AS deps
+COPY package.json bun.lock ./
+RUN bun install --frozen-lockfile
+
+FROM base AS build
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+RUN bun run build
+
+FROM oven/bun:1-slim AS runtime
+WORKDIR /app
+COPY --from=build /app/dist ./dist
+COPY --from=build /app/node_modules ./node_modules
+
+ENV HOST=0.0.0.0
+ENV PORT=4321
+EXPOSE 4321
+
+CMD ["bun", "./dist/server/entry.mjs"]
diff --git a/web/astro.config.mjs b/web/astro.config.mjs
@@ -0,0 +1,16 @@
+import { defineConfig } from "astro/config";
+import bun from "astro-bun-adapter";
+
+export default defineConfig({
+ output: "server",
+ site: "https://prime8.dev",
+ adapter: bun(),
+ server: {
+ host: true,
+ },
+ image: {
+ service: {
+ entrypoint: "astro/assets/services/noop",
+ },
+ },
+});
diff --git a/web/blogs/building-my-portfolio.md b/web/blogs/building-my-portfolio.md
@@ -0,0 +1,47 @@
+---
+id: building-my-portfolio
+title: Building a TUI-Inspired Portfolio
+description: How I built this terminal-style portfolio with Astro
+date: 2026-01-16
+tags:
+ - Astro
+ - TypeScript
+ - TUI
+ - Web Development
+ - Portfolio
+---
+
+I've always been drawn to terminal interfaces. There's something satisfying about the simplicity and efficiency of a well-designed TUI. So when it came time to build my portfolio, I knew I wanted to capture that aesthetic—monospace fonts, keyboard navigation, and a dark color scheme that feels like home.
+
+## The Stack
+
+This site is built with **Astro** for server-side rendering. At build/request time, READMEs are fetched directly from my GitLab and GitHub repositories—no CORS issues, no stale content. The markdown is parsed with **marked** and rendered with custom styling to match the terminal aesthetic.
+
+**WakaTime integration** pulls my coding stats in real-time, showing weekly activity breakdowns and total hours coded. It's a nice way to show I'm actually writing code, not just talking about it.
+
+## Design Decisions
+
+A few key choices drove the design:
+
+- **Keyboard-first navigation** – Number keys (`1-4`) switch tabs instantly. Arrow keys navigate lists and timelines. `Tab` cycles through sections. `Enter` opens blog posts, `Escape` closes them. It feels like using a real terminal application.
+- **List-detail pattern** – Projects and experience use a sidebar list with detail views, similar to email clients or file managers. The experience page features a timeline visualization that's navigable with arrow keys.
+- **Live data everywhere** – WakaTime stats update on every page load. Project READMEs are fetched fresh from git repositories. No static snapshots that go stale.
+- **Lightbox for images** – Experience photos open in a full-screen lightbox with keyboard navigation (arrow keys to cycle, escape to close).
+
+## The Color Palette
+
+The palette is inspired by classic terminal emulators:
+
+- Background: `#0d0d0d` (near-black)
+- Foreground: `#c0c0c0` (soft gray)
+- Accent: `#d7af5f` (warm gold)
+- Links: `#5fafff` (light blue)
+- Cyan, magenta, red for semantic colors
+
+JetBrains Mono is the font throughout—it's readable and has great character distinction.
+
+## Conclusion
+
+Building this portfolio was a chance to combine two things I love: terminal aesthetics and modern web development. The result is something that feels personal—a site that reflects how I actually work, not just what I've worked on.
+
+If you're thinking about building your own portfolio, my advice is simple: make it yours. Pick a style that resonates with you, add the features you'd actually want to use, and don't be afraid to over-engineer the parts you find interesting. That's where the best learning happens.
diff --git a/web/bun.lock b/web/bun.lock
@@ -0,0 +1,1187 @@
+{
+ "lockfileVersion": 1,
+ "configVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "prime8dev",
+ "dependencies": {
+ "astro": "^5.16.11",
+ "astro-bun-adapter": "^1.0.2",
+ "gray-matter": "^4.0.3",
+ "jimp": "^1.6.0",
+ "marked": "^17.0.1",
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.2",
+ "eslint": "^9.39.2",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-astro": "^1.5.0",
+ "globals": "^17.0.0",
+ "husky": "^9.1.7",
+ "lint-staged": "^16.2.7",
+ "prettier": "^3.8.0",
+ "prettier-plugin-astro": "^0.14.1",
+ "typescript-eslint": "^8.53.0",
+ },
+ },
+ },
+ "packages": {
+ "@astrojs/compiler": ["@astrojs/compiler@2.13.0", "", {}, "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw=="],
+
+ "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.5", "", {}, "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA=="],
+
+ "@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=="],
+
+ "@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="],
+
+ "@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=="],
+
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
+
+ "@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="],
+
+ "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="],
+
+ "@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="],
+
+ "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
+
+ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="],
+
+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
+
+ "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="],
+
+ "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="],
+
+ "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="],
+
+ "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="],
+
+ "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="],
+
+ "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="],
+
+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="],
+
+ "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
+
+ "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="],
+
+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
+
+ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
+
+ "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="],
+
+ "@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=="],
+
+ "@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=="],
+
+ "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
+
+ "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
+
+ "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
+
+ "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
+
+ "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
+
+ "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
+
+ "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
+
+ "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
+
+ "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
+
+ "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
+
+ "@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=="],
+
+ "@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=="],
+
+ "@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=="],
+
+ "@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=="],
+
+ "@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=="],
+
+ "@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=="],
+
+ "@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=="],
+
+ "@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=="],
+
+ "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
+
+ "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
+
+ "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
+
+ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
+
+ "@jimp/core": ["@jimp/core@1.6.0", "", { "dependencies": { "@jimp/file-ops": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "await-to-js": "^3.0.0", "exif-parser": "^0.1.12", "file-type": "^16.0.0", "mime": "3" } }, "sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w=="],
+
+ "@jimp/diff": ["@jimp/diff@1.6.0", "", { "dependencies": { "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "pixelmatch": "^5.3.0" } }, "sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw=="],
+
+ "@jimp/file-ops": ["@jimp/file-ops@1.6.0", "", {}, "sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ=="],
+
+ "@jimp/js-bmp": ["@jimp/js-bmp@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "bmp-ts": "^1.0.9" } }, "sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw=="],
+
+ "@jimp/js-gif": ["@jimp/js-gif@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "gifwrap": "^0.10.1", "omggif": "^1.0.10" } }, "sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g=="],
+
+ "@jimp/js-jpeg": ["@jimp/js-jpeg@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "jpeg-js": "^0.4.4" } }, "sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA=="],
+
+ "@jimp/js-png": ["@jimp/js-png@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "pngjs": "^7.0.0" } }, "sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg=="],
+
+ "@jimp/js-tiff": ["@jimp/js-tiff@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "utif2": "^4.1.0" } }, "sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw=="],
+
+ "@jimp/plugin-blit": ["@jimp/plugin-blit@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA=="],
+
+ "@jimp/plugin-blur": ["@jimp/plugin-blur@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/utils": "1.6.0" } }, "sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw=="],
+
+ "@jimp/plugin-circle": ["@jimp/plugin-circle@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw=="],
+
+ "@jimp/plugin-color": ["@jimp/plugin-color@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "tinycolor2": "^1.6.0", "zod": "^3.23.8" } }, "sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA=="],
+
+ "@jimp/plugin-contain": ["@jimp/plugin-contain@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ=="],
+
+ "@jimp/plugin-cover": ["@jimp/plugin-cover@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA=="],
+
+ "@jimp/plugin-crop": ["@jimp/plugin-crop@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang=="],
+
+ "@jimp/plugin-displace": ["@jimp/plugin-displace@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q=="],
+
+ "@jimp/plugin-dither": ["@jimp/plugin-dither@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0" } }, "sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ=="],
+
+ "@jimp/plugin-fisheye": ["@jimp/plugin-fisheye@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA=="],
+
+ "@jimp/plugin-flip": ["@jimp/plugin-flip@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg=="],
+
+ "@jimp/plugin-hash": ["@jimp/plugin-hash@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/js-bmp": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/js-tiff": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "any-base": "^1.1.0" } }, "sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q=="],
+
+ "@jimp/plugin-mask": ["@jimp/plugin-mask@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA=="],
+
+ "@jimp/plugin-print": ["@jimp/plugin-print@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/types": "1.6.0", "parse-bmfont-ascii": "^1.0.6", "parse-bmfont-binary": "^1.0.6", "parse-bmfont-xml": "^1.1.6", "simple-xml-to-json": "^1.2.2", "zod": "^3.23.8" } }, "sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A=="],
+
+ "@jimp/plugin-quantize": ["@jimp/plugin-quantize@1.6.0", "", { "dependencies": { "image-q": "^4.0.0", "zod": "^3.23.8" } }, "sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg=="],
+
+ "@jimp/plugin-resize": ["@jimp/plugin-resize@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/types": "1.6.0", "zod": "^3.23.8" } }, "sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA=="],
+
+ "@jimp/plugin-rotate": ["@jimp/plugin-rotate@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw=="],
+
+ "@jimp/plugin-threshold": ["@jimp/plugin-threshold@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-hash": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0", "zod": "^3.23.8" } }, "sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w=="],
+
+ "@jimp/types": ["@jimp/types@1.6.0", "", { "dependencies": { "zod": "^3.23.8" } }, "sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg=="],
+
+ "@jimp/utils": ["@jimp/utils@1.6.0", "", { "dependencies": { "@jimp/types": "1.6.0", "tinycolor2": "^1.6.0" } }, "sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@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=="],
+
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
+
+ "@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=="],
+
+ "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
+
+ "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="],
+
+ "@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=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.55.1", "", { "os": "android", "cpu": "arm" }, "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.55.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.55.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.55.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.55.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.55.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA=="],
+
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g=="],
+
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw=="],
+
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.55.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w=="],
+
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.55.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg=="],
+
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.55.1", "", { "os": "none", "cpu": "arm64" }, "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw=="],
+
+ "@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=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.55.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA=="],
+
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw=="],
+
+ "@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=="],
+
+ "@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=="],
+
+ "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ=="],
+
+ "@shikijs/langs": ["@shikijs/langs@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA=="],
+
+ "@shikijs/themes": ["@shikijs/themes@3.21.0", "", { "dependencies": { "@shikijs/types": "3.21.0" } }, "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw=="],
+
+ "@shikijs/types": ["@shikijs/types@3.21.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA=="],
+
+ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
+
+ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
+
+ "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
+
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
+ "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
+
+ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
+
+ "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
+
+ "@types/node": ["@types/node@16.9.1", "", {}, "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g=="],
+
+ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
+
+ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.53.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/type-utils": "8.53.0", "@typescript-eslint/utils": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.53.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg=="],
+
+ "@typescript-eslint/parser": ["@typescript-eslint/parser@8.53.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg=="],
+
+ "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.53.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.53.0", "@typescript-eslint/types": "^8.53.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg=="],
+
+ "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0" } }, "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g=="],
+
+ "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.53.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA=="],
+
+ "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/utils": "8.53.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw=="],
+
+ "@typescript-eslint/types": ["@typescript-eslint/types@8.53.0", "", {}, "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ=="],
+
+ "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.53.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.53.0", "@typescript-eslint/tsconfig-utils": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw=="],
+
+ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.53.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.53.0", "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA=="],
+
+ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.53.0", "", { "dependencies": { "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw=="],
+
+ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
+
+ "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="],
+
+ "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+
+ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+
+ "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
+
+ "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
+
+ "ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="],
+
+ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="],
+
+ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
+
+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+
+ "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="],
+
+ "astro": ["astro@5.16.11", "", { "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.2", "diff": "^8.0.3", "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-Z7kvkTTT5n6Hn5lCm6T3WU6pkxx84Hn25dtQ6dR7ATrBGq9eVa8EuB/h1S8xvaoVyCMZnIESu99Z9RJfdLRLDA=="],
+
+ "astro-bun-adapter": ["astro-bun-adapter@1.0.2", "", { "peerDependencies": { "astro": "^4.0.7" } }, "sha512-ugiguVhpLq/O0HTA/DIokAGX9u/aOr+JiwR0++xURN6aAY9zjXU0dfj9A3V4KGXgNXMEEFiZ5gobMhcURAM3Fw=="],
+
+ "astro-eslint-parser": ["astro-eslint-parser@1.2.2", "", { "dependencies": { "@astrojs/compiler": "^2.0.0", "@typescript-eslint/scope-manager": "^7.0.0 || ^8.0.0", "@typescript-eslint/types": "^7.0.0 || ^8.0.0", "astrojs-compiler-sync": "^1.0.0", "debug": "^4.3.4", "entities": "^6.0.0", "eslint-scope": "^8.0.1", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "fast-glob": "^3.3.3", "is-glob": "^4.0.3", "semver": "^7.3.8" } }, "sha512-JepyLROIad6f44uyqMF6HKE2QbunNzp3mYKRcPoDGt0QkxXmH222FAFC64WTyQu2Kg8NNEXHTN/sWuUId9sSxw=="],
+
+ "astrojs-compiler-sync": ["astrojs-compiler-sync@1.1.1", "", { "dependencies": { "synckit": "^0.11.0" }, "peerDependencies": { "@astrojs/compiler": ">=0.27.0" } }, "sha512-0mKvB9sDQRIZPsEJadw6OaFbGJ92cJPPR++ICca9XEyiUAZqgVuk25jNmzHPT0KF80rI94trSZrUR5iHFXGGOQ=="],
+
+ "await-to-js": ["await-to-js@3.0.0", "", {}, "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g=="],
+
+ "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+
+ "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
+
+ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="],
+
+ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+ "bmp-ts": ["bmp-ts@1.0.9", "", {}, "sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw=="],
+
+ "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
+
+ "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=="],
+
+ "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
+
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
+
+ "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
+
+ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
+
+ "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="],
+
+ "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
+
+ "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
+
+ "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
+
+ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
+
+ "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
+
+ "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="],
+
+ "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
+
+ "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
+
+ "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="],
+
+ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="],
+
+ "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
+
+ "commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="],
+
+ "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="],
+
+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
+
+ "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
+
+ "cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
+
+ "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=="],
+
+ "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="],
+
+ "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
+
+ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
+
+ "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="],
+
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="],
+
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
+
+ "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
+
+ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
+
+ "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
+
+ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+ "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="],
+
+ "devalue": ["devalue@5.6.2", "", {}, "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg=="],
+
+ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
+
+ "diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="],
+
+ "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
+
+ "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=="],
+
+ "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
+
+ "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
+
+ "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=="],
+
+ "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="],
+
+ "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+
+ "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
+
+ "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="],
+
+ "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
+
+ "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=="],
+
+ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
+
+ "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="],
+
+ "eslint-compat-utils": ["eslint-compat-utils@0.6.5", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ=="],
+
+ "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="],
+
+ "eslint-plugin-astro": ["eslint-plugin-astro@1.5.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@jridgewell/sourcemap-codec": "^1.4.14", "@typescript-eslint/types": "^7.7.1 || ^8", "astro-eslint-parser": "^1.0.2", "eslint-compat-utils": "^0.6.0", "globals": "^16.0.0", "postcss": "^8.4.14", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "eslint": ">=8.57.0" } }, "sha512-IWy4kY3DKTJxd7g652zIWpBGFuxw7NIIt16kyqc8BlhnIKvI8yGJj+Maua0DiNYED3F/D8AmzoTTTA6A95WX9g=="],
+
+ "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
+
+ "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
+
+ "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
+
+ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
+
+ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
+
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
+
+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
+ "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
+
+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
+
+ "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="],
+
+ "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
+
+ "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
+
+ "exif-parser": ["exif-parser@0.1.12", "", {}, "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="],
+
+ "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
+
+ "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "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=="],
+
+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+
+ "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
+
+ "file-type": ["file-type@16.5.4", "", { "dependencies": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", "token-types": "^4.1.1" } }, "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw=="],
+
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
+
+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
+
+ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
+
+ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
+
+ "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
+
+ "fontace": ["fontace@0.4.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg=="],
+
+ "fontkitten": ["fontkitten@1.0.1", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-m+/cO+/kAU9farlejecXLgQH20+UXyH0K6oosGtogAz7BWco+KTYE60epKwMt8eVxqlOE2Fs+GoHVlGDUbKOoA=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
+
+ "gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="],
+
+ "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
+
+ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
+
+ "globals": ["globals@17.0.0", "", {}, "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw=="],
+
+ "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="],
+
+ "h3": ["h3@1.15.5", "", { "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.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg=="],
+
+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
+ "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=="],
+
+ "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=="],
+
+ "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="],
+
+ "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
+
+ "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=="],
+
+ "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="],
+
+ "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
+
+ "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
+
+ "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
+
+ "image-q": ["image-q@4.0.0", "", { "dependencies": { "@types/node": "16.9.1" } }, "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw=="],
+
+ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
+
+ "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
+
+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
+
+ "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
+
+ "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
+
+ "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="],
+
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
+ "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="],
+
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
+ "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=="],
+
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+
+ "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
+
+ "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "jimp": ["jimp@1.6.0", "", { "dependencies": { "@jimp/core": "1.6.0", "@jimp/diff": "1.6.0", "@jimp/js-bmp": "1.6.0", "@jimp/js-gif": "1.6.0", "@jimp/js-jpeg": "1.6.0", "@jimp/js-png": "1.6.0", "@jimp/js-tiff": "1.6.0", "@jimp/plugin-blit": "1.6.0", "@jimp/plugin-blur": "1.6.0", "@jimp/plugin-circle": "1.6.0", "@jimp/plugin-color": "1.6.0", "@jimp/plugin-contain": "1.6.0", "@jimp/plugin-cover": "1.6.0", "@jimp/plugin-crop": "1.6.0", "@jimp/plugin-displace": "1.6.0", "@jimp/plugin-dither": "1.6.0", "@jimp/plugin-fisheye": "1.6.0", "@jimp/plugin-flip": "1.6.0", "@jimp/plugin-hash": "1.6.0", "@jimp/plugin-mask": "1.6.0", "@jimp/plugin-print": "1.6.0", "@jimp/plugin-quantize": "1.6.0", "@jimp/plugin-resize": "1.6.0", "@jimp/plugin-rotate": "1.6.0", "@jimp/plugin-threshold": "1.6.0", "@jimp/types": "1.6.0", "@jimp/utils": "1.6.0" } }, "sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg=="],
+
+ "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
+
+ "jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="],
+
+ "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
+
+ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
+
+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+
+ "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
+
+ "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
+
+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
+
+ "lint-staged": ["lint-staged@16.2.7", "", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="],
+
+ "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="],
+
+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
+
+ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
+
+ "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="],
+
+ "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
+
+ "lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="],
+
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "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=="],
+
+ "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
+
+ "marked": ["marked@17.0.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="],
+
+ "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=="],
+
+ "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=="],
+
+ "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="],
+
+ "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="],
+
+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
+
+ "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="],
+
+ "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="],
+
+ "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="],
+
+ "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=="],
+
+ "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=="],
+
+ "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
+
+ "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
+
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
+
+ "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="],
+
+ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
+
+ "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
+
+ "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "nano-spawn": ["nano-spawn@2.0.0", "", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="],
+
+ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
+
+ "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="],
+
+ "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="],
+
+ "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
+
+ "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="],
+
+ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
+
+ "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
+
+ "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=="],
+
+ "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
+
+ "omggif": ["omggif@1.0.10", "", {}, "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="],
+
+ "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
+
+ "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="],
+
+ "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=="],
+
+ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
+
+ "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="],
+
+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
+
+ "p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="],
+
+ "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="],
+
+ "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
+
+ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="],
+
+ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
+
+ "parse-bmfont-ascii": ["parse-bmfont-ascii@1.0.6", "", {}, "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="],
+
+ "parse-bmfont-binary": ["parse-bmfont-binary@1.0.6", "", {}, "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="],
+
+ "parse-bmfont-xml": ["parse-bmfont-xml@1.1.6", "", { "dependencies": { "xml-parse-from-string": "^1.0.0", "xml2js": "^0.5.0" } }, "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA=="],
+
+ "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=="],
+
+ "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
+
+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "peek-readable": ["peek-readable@4.1.0", "", {}, "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg=="],
+
+ "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
+
+ "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="],
+
+ "pixelmatch": ["pixelmatch@5.3.0", "", { "dependencies": { "pngjs": "^6.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" } }, "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q=="],
+
+ "pngjs": ["pngjs@7.0.0", "", {}, "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow=="],
+
+ "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=="],
+
+ "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
+
+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
+
+ "prettier": ["prettier@3.8.0", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA=="],
+
+ "prettier-plugin-astro": ["prettier-plugin-astro@0.14.1", "", { "dependencies": { "@astrojs/compiler": "^2.9.1", "prettier": "^3.0.0", "sass-formatter": "^0.7.6" } }, "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw=="],
+
+ "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
+
+ "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="],
+
+ "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
+
+ "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
+
+ "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
+
+ "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="],
+
+ "readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="],
+
+ "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
+
+ "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
+
+ "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
+
+ "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
+
+ "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "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=="],
+
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
+
+ "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
+
+ "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=="],
+
+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
+
+ "s.color": ["s.color@0.0.15", "", {}, "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA=="],
+
+ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
+
+ "sass-formatter": ["sass-formatter@0.7.9", "", { "dependencies": { "suf-log": "^2.5.3" } }, "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw=="],
+
+ "sax": ["sax@1.4.4", "", {}, "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw=="],
+
+ "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="],
+
+ "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
+
+ "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=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "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=="],
+
+ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
+ "simple-xml-to-json": ["simple-xml-to-json@1.2.3", "", {}, "sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA=="],
+
+ "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
+
+ "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="],
+
+ "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
+
+ "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
+
+ "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="],
+
+ "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=="],
+
+ "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
+
+ "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=="],
+
+ "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="],
+
+ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
+
+ "strtok3": ["strtok3@6.3.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" } }, "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw=="],
+
+ "suf-log": ["suf-log@2.5.3", "", { "dependencies": { "s.color": "0.0.15" } }, "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="],
+
+ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
+
+ "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=="],
+
+ "synckit": ["synckit@0.11.12", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ=="],
+
+ "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="],
+
+ "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="],
+
+ "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
+
+ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+
+ "token-types": ["token-types@4.2.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ=="],
+
+ "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
+
+ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
+
+ "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="],
+
+ "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
+
+ "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
+
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+
+ "typescript-eslint": ["typescript-eslint@8.53.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.53.0", "@typescript-eslint/parser": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", "@typescript-eslint/utils": "8.53.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw=="],
+
+ "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
+
+ "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="],
+
+ "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
+
+ "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=="],
+
+ "unifont": ["unifont@0.7.3", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA=="],
+
+ "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=="],
+
+ "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
+
+ "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=="],
+
+ "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
+
+ "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=="],
+
+ "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "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=="],
+
+ "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="],
+
+ "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=="],
+
+ "unstorage": ["unstorage@1.17.4", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.5", "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "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 || ^7 || ^8", "@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 || ^2 || ^3", "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-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw=="],
+
+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
+
+ "utif2": ["utif2@4.1.0", "", { "dependencies": { "pako": "^1.0.11" } }, "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w=="],
+
+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
+ "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
+
+ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "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=="],
+
+ "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=="],
+
+ "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="],
+
+ "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="],
+
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
+ "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=="],
+
+ "xml-parse-from-string": ["xml-parse-from-string@1.0.1", "", {}, "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="],
+
+ "xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="],
+
+ "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="],
+
+ "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
+
+ "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="],
+
+ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
+
+ "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="],
+
+ "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="],
+
+ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
+
+ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+
+ "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
+
+ "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="],
+
+ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
+
+ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
+
+ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
+
+ "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
+
+ "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
+
+ "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "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=="],
+
+ "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+
+ "boxen/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
+
+ "cli-truncate/string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="],
+
+ "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=="],
+
+ "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "eslint-plugin-astro/globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="],
+
+ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
+
+ "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
+
+ "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+
+ "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
+
+ "pixelmatch/pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="],
+
+ "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
+
+ "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "ansi-align/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+
+ "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
+
+ "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
+
+ "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+ "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+ }
+}
diff --git a/web/config.toml b/web/config.toml
@@ -1,6 +0,0 @@
-base_url = "https://prime8.dev"
-
-[extra]
-tabs = [
- { name = "home", url = "/" },
-]
diff --git a/web/config/about.json b/web/config/about.json
@@ -0,0 +1,18 @@
+{
+ "name": "Damian Myrda",
+ "handle": "moncheeta",
+ "bio": "Passionate about low-level systems programming, TUI/CLI tooling, and UNIX philosophy",
+ "location": "Chicago, IL",
+ "profession": "Software Engineer",
+ "profession_short": "SWE",
+ "languages": ["Zig", "Rust", "C", "Go", "TypeScript", "Python"],
+ "interests": [
+ "Low-level systems",
+ "TUI/CLI tooling",
+ "Embedded OS",
+ "UNIX philosophy"
+ ],
+ "tools": ["Zed (Vim mode)", "Neovim", "OpenCode", "Linux", "Fish", "Ghostty"],
+ "school": "Prospect High School (Senior)",
+ "graduating": "May 2026"
+}
diff --git a/web/config/contact.json b/web/config/contact.json
@@ -0,0 +1,5 @@
+{
+ "email": "damian@prime8.dev",
+ "gitlab": "https://git.prime8.dev/moncheeta",
+ "linkedin": "https://linkedin.com/in/damian-myrda"
+}
diff --git a/web/config/experience.json b/web/config/experience.json
@@ -0,0 +1,35 @@
+[
+ {
+ "id": "mandolin",
+ "company": "Mandolin",
+ "role": "Senior SWE Intern",
+ "startDate": "2024-10",
+ "description": [
+ "Building AI agents for specialty drug access. Automating prior authorizations, benefits verification, and revenue cycle management.",
+ "Mandolin raised $40M to automate access to life-saving medicines, wiring AI labor into thousands of infusion centers, specialty pharmacies, and health systems."
+ ],
+ "tech": ["TypeScript", "Temporal"],
+ "url": "https://mandolin.com",
+ "logo": "/mandolin/logo.svg",
+ "images": [
+ "/mandolin/company.jpeg",
+ "/mandolin/company_silly.jpeg",
+ "/mandolin/employee_polaroids.jpeg",
+ "/mandolin/moment_polaroids.jpeg"
+ ]
+ },
+ {
+ "id": "amplifier-health",
+ "company": "Amplifier Health",
+ "role": "SWE Intern",
+ "startDate": "2024-06",
+ "endDate": "2024-08",
+ "description": [
+ "Voice AI for early disease detection. Large Acoustic Model analyzing 1000+ voice biomarkers across 30+ health conditions."
+ ],
+ "tech": ["Python", "PyTorch"],
+ "url": "https://amplifierhealth.com",
+ "logo": "/amplifier/logo.svg",
+ "logoFilter": "logo-invert"
+ }
+]
diff --git a/web/config/projects.json b/web/config/projects.json
@@ -0,0 +1,38 @@
+[
+ {
+ "id": "janitor",
+ "name": "janitor",
+ "subtitle": "Audio classification with AST",
+ "tech": ["Rust", "CUDA"],
+ "url": "https://git.prime8.dev/moncheeta/janitor",
+ "dateCreated": "2025-09-15",
+ "dateModified": "2026-01-10"
+ },
+ {
+ "id": "summarizer",
+ "name": "summarizer",
+ "subtitle": "Audio transcription microservices",
+ "tech": ["Python", "Docker", "Kafka"],
+ "url": "https://git.prime8.dev/moncheeta/summarizer",
+ "dateCreated": "2025-06-01",
+ "dateModified": "2025-12-20"
+ },
+ {
+ "id": "finger",
+ "name": "finger",
+ "subtitle": "Mobile auth app",
+ "tech": ["TypeScript", "React Native", "Supabase"],
+ "url": "https://git.prime8.dev/moncheeta/finger",
+ "dateCreated": "2025-03-10",
+ "dateModified": "2025-08-15"
+ },
+ {
+ "id": "computer-science-club",
+ "name": "computer-science-club",
+ "subtitle": "CS Club website",
+ "tech": ["Python"],
+ "url": "https://github.com/moncheeta/computer-science-club",
+ "dateCreated": "2024-09-01",
+ "dateModified": "2025-05-20"
+ }
+]
diff --git a/web/env.example b/web/env.example
@@ -0,0 +1 @@
+WAKATIME_API_KEY=your_wakatime_api_key_here
diff --git a/web/eslint.config.js b/web/eslint.config.js
@@ -0,0 +1,24 @@
+import js from "@eslint/js";
+import globals from "globals";
+import prettier from "eslint-config-prettier";
+import eslintPluginAstro from "eslint-plugin-astro";
+import tseslint from "typescript-eslint";
+
+export default [
+ { ignores: ["dist", "node_modules", ".astro"] },
+ js.configs.recommended,
+ ...tseslint.configs.recommended,
+ ...eslintPluginAstro.configs.recommended,
+ prettier,
+ {
+ files: ["**/*.js", "**/*.ts"],
+ languageOptions: {
+ ecmaVersion: 2022,
+ sourceType: "module",
+ globals: {
+ ...globals.browser,
+ ...globals.node,
+ },
+ },
+ },
+];
diff --git a/web/package.json b/web/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "prime8dev",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "astro dev",
+ "build": "astro build",
+ "preview": "astro preview",
+ "lint": "bun eslint .",
+ "format": "bun prettier --write .",
+ "prepare": "husky"
+ },
+ "lint-staged": {
+ "*.{ts,astro,js}": [
+ "eslint --fix",
+ "prettier --write"
+ ],
+ "*.{json,md,css}": [
+ "prettier --write"
+ ]
+ },
+ "dependencies": {
+ "astro-bun-adapter": "^1.0.2",
+ "astro": "^5.16.11",
+ "gray-matter": "^4.0.3",
+ "jimp": "^1.6.0",
+ "marked": "^17.0.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.2",
+ "eslint": "^9.39.2",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-astro": "^1.5.0",
+ "globals": "^17.0.0",
+ "husky": "^9.1.7",
+ "lint-staged": "^16.2.7",
+ "prettier": "^3.8.0",
+ "prettier-plugin-astro": "^0.14.1",
+ "typescript-eslint": "^8.53.0"
+ }
+}
diff --git a/web/public/amplifier/logo.svg b/web/public/amplifier/logo.svg
@@ -0,0 +1,9 @@
+<svg width="165" height="50" viewBox="0 0 165 50" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<rect width="164.167" height="50" fill="url(#pattern0_1_14974)"/>
+<defs>
+<pattern id="pattern0_1_14974" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_1_14974" transform="matrix(0.00200374 0 0 0.00657895 -0.00093511 0)"/>
+</pattern>
+<image id="image0_1_14974" width="500" height="152" xlink:href="data:image/png;base64,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"/>
+</defs>
+</svg>
diff --git a/web/public/favicon.png b/web/public/favicon.png
Binary files differ.
diff --git a/web/public/mandolin/company.jpeg b/web/public/mandolin/company.jpeg
Binary files differ.
diff --git a/web/public/mandolin/company_silly.jpeg b/web/public/mandolin/company_silly.jpeg
Binary files differ.
diff --git a/web/public/mandolin/employee_polaroids.jpeg b/web/public/mandolin/employee_polaroids.jpeg
Binary files differ.
diff --git a/web/public/mandolin/logo.svg b/web/public/mandolin/logo.svg
@@ -0,0 +1,11 @@
+<svg width="148" height="25" viewBox="0 0 148 25" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_5341_382)">
+<path d="M-11.2273 8.155C-7.23482 12.1475 -5.14863 14.3079 -3.5057 16.0249C-1.86502 17.7397 -0.677597 19.0004 1.52874 21.2068C3.73442 23.4125 4.78203 24.3868 6.39141 25.922C8.00364 27.46 10.1643 29.5467 14.5808 33.9631L13.4783 35.0653C13.8714 35.457 14.2851 35.8694 14.7204 36.3046L13.4009 37.6244C8.99312 33.2167 6.84298 31.1405 5.24295 29.6142C3.64008 28.0851 2.57372 27.0932 0.348847 24.8684C-1.87525 22.6443 -3.0784 21.3666 -4.7143 19.6569C-6.34804 17.9494 -8.42472 15.7988 -12.4072 11.8164L-11.3077 10.7169C-11.6994 10.3236 -12.1116 9.91002 -12.5469 9.47478L-11.2273 8.155ZM17.6108 32.3116L16.291 33.6314L-9.51682 7.82329L-8.19727 6.50351L17.6108 32.3116ZM-4.88882 5.40061C-2.86324 7.42619 -0.715327 9.37416 1.45242 11.34C3.61427 13.3004 5.79612 15.2788 7.85905 17.3418C10.1334 19.6161 12.2837 21.9698 14.4179 24.3054C16.5566 26.646 18.6792 28.9686 20.9193 31.2087L19.5995 32.5285C17.3248 30.2538 15.1744 27.9 13.0402 25.5644C10.9015 23.2237 8.77896 20.9012 6.53927 18.6615C4.51403 16.6363 2.36645 14.6884 0.198711 12.7226C-1.96313 10.7622 -4.14513 8.78363 -6.20837 6.72039L-4.88882 5.40061ZM-3.23618 3.05881C0.710573 7.00557 3.07486 8.77848 4.99531 10.1134C6.93579 11.4622 8.5358 12.4355 10.8228 14.7225C13.1149 17.0146 13.9018 18.4334 15.161 20.2816C16.4043 22.1064 18.1952 24.4904 22.5717 28.8669L21.2521 30.1867C16.8045 25.739 14.9361 23.266 13.6187 21.3323C12.3171 19.422 11.6416 18.1807 9.50325 16.0422C7.35972 13.8987 5.91766 13.0275 3.93 11.6459C1.92231 10.2504 -0.52773 8.40683 -4.55597 4.3786L-3.23618 3.05881ZM-1.03062 0.439756C2.8884 4.35878 5.43193 5.9252 7.53303 7.06167C9.66269 8.21359 11.5369 9.01396 13.8699 11.347C16.2126 13.6897 16.8051 15.3708 17.845 17.3809C18.8661 19.3548 20.4255 21.8957 24.7774 26.2476L23.4577 27.5674C18.9855 23.0952 17.3062 20.4012 16.1874 18.2385C15.0873 16.1121 14.6383 14.7547 12.5504 12.6668C10.453 10.5694 8.86419 9.9035 6.64498 8.70314C4.39719 7.48732 1.70572 5.81521 -2.35018 1.75931L-1.03062 0.439756ZM0.966248 -1.55689C4.8157 2.29255 7.75733 3.3601 10.2835 4.02182C12.8243 4.68735 15.3518 4.9902 17.7894 7.42779C20.2431 9.8815 20.3273 12.2362 20.8835 14.6416C21.4338 17.0216 22.4866 19.9636 26.7741 24.2512L25.4545 25.5707C20.918 21.0342 19.6936 17.7799 19.0652 15.0619C18.4427 12.3694 18.4466 10.7244 16.4699 8.74757C14.4769 6.75464 12.5801 6.55255 9.81058 5.8271C7.02661 5.09785 3.77191 3.88832 -0.353533 -0.237108L0.966248 -1.55689ZM2.88885 -3.47949C6.63379 0.265398 10.149 0.670448 13.3728 0.663706C14.9562 0.660392 16.6569 0.543751 18.1533 0.715422C19.7176 0.894902 21.2221 1.39527 22.522 2.69521C23.8261 3.99936 24.2842 5.4596 24.407 6.97556C24.4671 7.71701 24.4477 8.47791 24.412 9.23169C24.3754 10.0048 24.3232 10.7469 24.3038 11.5466C24.2658 13.116 24.3623 14.7549 24.9709 16.5161C25.5782 18.274 26.7153 20.2091 28.8345 22.3284L27.515 23.6481C25.2222 21.3553 23.9181 19.1841 23.2068 17.1258C22.4968 15.0708 22.3972 13.1836 22.4379 11.5015C22.4579 10.6755 22.5137 9.86057 22.5477 9.1433C22.5827 8.40674 22.5966 7.7438 22.5466 7.12638C22.4492 5.92451 22.1136 4.92589 21.2024 4.01476C20.2871 3.09944 19.2266 2.71723 17.9405 2.56968C16.5864 2.41433 15.1509 2.52632 13.3767 2.53004C9.88532 2.53734 5.7991 2.0701 1.56907 -2.15994L2.88885 -3.47949Z" fill="white"/>
+</g>
+<path d="M32.4499 23.1855V2.38053H35.5707L42.9119 20.2134L50.2233 2.38053H53.3738V23.1855H50.8772V6.71986L44.1007 23.1855H41.6933L34.9465 6.77931V23.1855H32.4499ZM61.8154 23.4233C58.2488 23.4233 55.9603 21.5806 55.9603 18.6976C55.9603 15.0716 59.4674 14.388 62.6179 14.0611C65.0253 13.8233 67.1058 13.853 67.1355 12.575C67.1058 10.5837 65.4711 9.18674 63.0934 9.18674C60.8049 9.18674 59.0216 10.4648 58.7541 12.3372H56.3169C56.6141 9.24619 59.408 7.07652 63.1529 7.07652C67.0464 7.07652 69.543 9.39479 69.543 12.7236V20.3917C69.543 20.897 69.8105 21.1645 70.3454 21.1645H71.2371V23.1855H69.8402C68.1461 23.1855 67.2544 22.4128 67.2544 20.9564V20.4809C66.3331 22.2939 64.5498 23.4233 61.8154 23.4233ZM58.4271 18.6382C58.4271 20.2728 59.9132 21.3131 62.1721 21.3131C65.1145 21.3131 67.1355 19.4406 67.1355 16.8252V14.7744C66.4519 15.6957 64.6984 15.8741 62.7665 16.0821C60.5968 16.3199 58.4271 16.6171 58.4271 18.6382ZM72.814 23.1855V7.43318H74.7756L75.0133 9.84062C76.0833 8.17622 78.1341 7.07652 80.4821 7.07652C83.8703 7.07652 86.1292 9.27591 86.1292 12.7533V23.1855H83.6623V12.8425C83.6623 10.6431 82.2357 9.24619 79.8579 9.24619C77.0344 9.24619 75.3106 11.2078 75.2808 13.6152V23.1855H72.814ZM95.1682 23.5125C90.9478 23.5125 88.0053 20.1242 88.0053 15.2202C88.0053 10.4053 90.918 7.07652 95.1385 7.07652C97.5162 7.07652 99.5075 8.11677 100.637 9.78117V0.89446H103.104V23.1855H101.142L100.875 20.154C99.8345 22.2047 97.754 23.5125 95.1682 23.5125ZM90.5614 15.2202C90.5614 18.8462 92.6122 21.3725 95.5546 21.3725C98.5564 21.3725 100.637 18.8165 100.637 15.1608C100.637 11.6239 98.6159 9.18674 95.7032 9.18674C92.6716 9.18674 90.5614 11.6536 90.5614 15.2202ZM112.975 23.5125C107.922 23.5125 105.247 19.9162 105.247 15.1608C105.247 9.90006 108.695 7.07652 112.975 7.07652C117.998 7.07652 120.702 10.7025 120.702 15.1608C120.702 20.5998 117.403 23.5125 112.975 23.5125ZM107.774 15.1608C107.774 19.2029 110.122 21.3725 112.975 21.3725C116.333 21.3725 118.176 18.5787 118.176 15.1608C118.176 11.6239 116.125 9.21647 112.975 9.21647C109.824 9.21647 107.774 11.6239 107.774 15.1608ZM122.829 23.1855V0.89446H125.296V23.1855H122.829ZM128.227 23.1855V7.43318H130.694V23.1855H128.227ZM127.633 2.94524C127.633 1.90499 128.435 1.13223 129.475 1.13223C130.516 1.13223 131.288 1.90499 131.288 2.94524C131.288 3.98549 130.516 4.78797 129.475 4.78797C128.435 4.78797 127.633 3.98549 127.633 2.94524ZM133.54 23.1855V7.43318H135.501L135.739 9.84062C136.809 8.17622 138.86 7.07652 141.208 7.07652C144.596 7.07652 146.855 9.27591 146.855 12.7533V23.1855H144.388V12.8425C144.388 10.6431 142.961 9.24619 140.584 9.24619C137.76 9.24619 136.036 11.2078 136.007 13.6152V23.1855H133.54Z" fill="white"/>
+<defs>
+<clipPath id="clip0_5341_382">
+<rect x="0.168457" y="0.563477" width="24.2623" height="24.2623" rx="4.41133" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/web/public/mandolin/moment_polaroids.jpeg b/web/public/mandolin/moment_polaroids.jpeg
Binary files differ.
diff --git a/web/public/me.jpg b/web/public/me.jpg
Binary files differ.
diff --git a/web/public/robots.txt b/web/public/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: https://prime8.dev/sitemap.xml
diff --git a/web/public/site.webmanifest b/web/public/site.webmanifest
@@ -0,0 +1,21 @@
+{
+ "name": "Damian Myrda | Software Engineer",
+ "short_name": "Damian Myrda",
+ "description": "Software Engineer portfolio - low-level programming, TUI development, and embedded systems",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#0d0d0d",
+ "theme_color": "#0d0d0d",
+ "icons": [
+ {
+ "src": "/favicon.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/favicon.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ]
+}
diff --git a/web/src/components/Article.astro b/web/src/components/Article.astro
@@ -0,0 +1,418 @@
+---
+import type Blog from "../lib/types/blog";
+
+interface Props {
+ blog: Blog;
+ isStandalone?: boolean;
+}
+
+const { blog, isStandalone = true } = Astro.props;
+---
+
+<article class="blog-article" data-id={blog.id} data-blog-id={blog.id}>
+ {
+ isStandalone ? (
+ <a href="/#blog" class="blog-back-btn">
+ ← See all posts
+ </a>
+ ) : (
+ <button class="blog-back-btn blog-back-btn-internal">
+ <span class="color-dim">← Back to posts</span>
+ </button>
+ )
+ }
+ <header class="blog-article-header">
+ <div class="blog-article-header-top">
+ <h1 class="blog-article-title">{blog.title}</h1>
+ <button
+ class="blog-share-btn"
+ data-blog-id={blog.id}
+ data-blog-title={blog.title}
+ >
+ [Share]
+ </button>
+ </div>
+ <time class="blog-article-date" datetime={blog.date}>{blog.date}</time>
+ </header>
+ <div class="blog-article-content" data-blog-id={blog.id}>
+ {
+ blog.url ? (
+ <a
+ class="external-link"
+ href={blog.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ Read on external site →
+ </a>
+ ) : blog.content ? (
+ <Fragment set:html={blog.content} />
+ ) : (
+ <p class="color-dim">Content not available</p>
+ )
+ }
+ </div>
+</article>
+
+<style>
+ .blog-back-btn {
+ display: inline-block;
+ background: transparent;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ padding: 8px 16px;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 12px;
+ margin-bottom: 24px;
+ transition: all 0.15s;
+ text-decoration: none;
+ }
+
+ .blog-back-btn:hover {
+ background: var(--bg-alt);
+ color: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .blog-article {
+ animation: fadeIn 0.2s ease;
+ }
+
+ @keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+ }
+
+ .blog-article-header {
+ margin-bottom: 24px;
+ padding-bottom: 16px;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .blog-article-header-top {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 16px;
+ }
+
+ .blog-article-title {
+ font-size: 28px;
+ font-weight: 500;
+ color: var(--accent);
+ margin: 0 0 8px 0;
+ line-height: 1.3;
+ }
+
+ .blog-share-btn {
+ background: transparent;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ padding: 6px 12px;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 12px;
+ transition: all 0.15s;
+ flex-shrink: 0;
+ }
+
+ .blog-share-btn:hover {
+ background: var(--bg-alt);
+ color: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .blog-share-btn.copied {
+ color: var(--green);
+ border-color: var(--green);
+ }
+
+ .blog-article-date {
+ color: var(--fg-dim);
+ font-size: 13px;
+ }
+
+ .blog-article-content {
+ font-size: 14px;
+ line-height: 1.7;
+ color: var(--fg);
+ padding-bottom: 64px;
+ }
+
+ .blog-article-content :global(p) {
+ margin-bottom: 16px;
+ }
+
+ .blog-article-content :global(p:last-child) {
+ margin-bottom: 0;
+ }
+
+ .blog-article-content :global(h2) {
+ font-size: 20px;
+ color: var(--accent);
+ margin: 32px 0 12px;
+ font-weight: 600;
+ }
+
+ .blog-article-content :global(h2:first-child) {
+ margin-top: 0;
+ }
+
+ .blog-article-content :global(h3) {
+ font-size: 17px;
+ color: var(--accent);
+ margin: 24px 0 10px;
+ font-weight: 500;
+ }
+
+ .blog-article-content :global(h4) {
+ font-size: 15px;
+ color: var(--fg);
+ margin: 20px 0 8px;
+ font-weight: 500;
+ }
+
+ .blog-article-content :global(h5),
+ .blog-article-content :global(h6) {
+ font-size: 14px;
+ color: var(--fg-dim);
+ margin: 16px 0 8px;
+ font-weight: 500;
+ }
+
+ .blog-article-content :global(ul),
+ .blog-article-content :global(ol) {
+ margin: 12px 0;
+ padding-left: 24px;
+ }
+
+ .blog-article-content :global(li) {
+ margin-bottom: 8px;
+ }
+
+ .blog-article-content :global(li > ul),
+ .blog-article-content :global(li > ol) {
+ margin: 6px 0;
+ }
+
+ .blog-article-content :global(code) {
+ background: var(--bg-alt);
+ padding: 2px 6px;
+ font-size: 13px;
+ border-radius: 2px;
+ }
+
+ .blog-article-content :global(pre) {
+ display: block;
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ padding: 16px;
+ margin: 16px 0;
+ overflow-x: auto;
+ font-size: 13px;
+ line-height: 1.5;
+ }
+
+ .blog-article-content :global(pre code) {
+ background: none;
+ padding: 0;
+ font-size: inherit;
+ }
+
+ .blog-article-content :global(a) {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ .blog-article-content :global(a:hover) {
+ opacity: 0.8;
+ }
+
+ .blog-article-content :global(strong) {
+ font-weight: 600;
+ color: var(--fg);
+ }
+
+ .blog-article-content :global(em) {
+ font-style: italic;
+ color: var(--fg-dim);
+ }
+
+ .blog-article-content :global(del) {
+ text-decoration: line-through;
+ color: var(--fg-dim);
+ }
+
+ .blog-article-content :global(blockquote) {
+ border-left: 3px solid var(--accent);
+ margin: 16px 0;
+ padding: 12px 20px;
+ color: var(--fg-dim);
+ background: var(--bg-alt);
+ }
+
+ .blog-article-content :global(blockquote p) {
+ margin-bottom: 0;
+ }
+
+ .blog-article-content :global(hr) {
+ border: none;
+ border-top: 1px solid var(--border);
+ margin: 24px 0;
+ }
+
+ .blog-article-content :global(table) {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 16px 0;
+ font-size: 13px;
+ }
+
+ .blog-article-content :global(th),
+ .blog-article-content :global(td) {
+ border: 1px solid var(--border);
+ padding: 10px 14px;
+ text-align: left;
+ }
+
+ .blog-article-content :global(th) {
+ background: var(--bg-alt);
+ color: var(--accent);
+ font-weight: 500;
+ }
+
+ .blog-article-content :global(tr:nth-child(even)) {
+ background: rgba(255, 255, 255, 0.02);
+ }
+
+ .blog-article-content :global(img) {
+ max-width: 100%;
+ height: auto;
+ margin: 16px 0;
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 14px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ @media (max-width: 768px) {
+ .blog-back-btn {
+ padding: 6px 12px;
+ font-size: 11px;
+ margin-bottom: 16px;
+ }
+
+ .blog-article-header {
+ margin-bottom: 16px;
+ padding-bottom: 12px;
+ }
+
+ .blog-article-header-top {
+ flex-direction: column;
+ gap: 12px;
+ }
+
+ .blog-article-title {
+ font-size: 22px;
+ }
+
+ .blog-share-btn {
+ align-self: flex-start;
+ }
+
+ .blog-article-content {
+ font-size: 13px;
+ padding-bottom: 32px;
+ }
+
+ .blog-article-content :global(h2) {
+ font-size: 18px;
+ margin: 24px 0 10px;
+ }
+
+ .blog-article-content :global(h3) {
+ font-size: 15px;
+ margin: 20px 0 8px;
+ }
+
+ .blog-article-content :global(pre) {
+ padding: 12px;
+ font-size: 12px;
+ }
+
+ .blog-article-content :global(code) {
+ font-size: 12px;
+ }
+
+ .blog-article-content :global(table) {
+ font-size: 12px;
+ }
+
+ .blog-article-content :global(th),
+ .blog-article-content :global(td) {
+ padding: 8px 10px;
+ }
+ }
+</style>
+
+<script>
+ import { closeBlogPost } from "../scripts/ui/blog";
+ import { updateUrl } from "../scripts/ui/url";
+
+ document.addEventListener("DOMContentLoaded", () => {
+ const shareButtons = document.querySelectorAll(".blog-share-btn");
+
+ shareButtons.forEach((btn) => {
+ btn.addEventListener("click", async (e) => {
+ e.stopPropagation();
+ const button = e.currentTarget as HTMLButtonElement;
+ const blogId = button.dataset.blogId;
+ const title = button.dataset.blogTitle;
+ const url = `${window.location.origin}/#blog/${blogId}`;
+
+ if (navigator.share) {
+ try {
+ await navigator.share({
+ title,
+ url,
+ });
+ } catch {
+ // User cancelled share dialog
+ }
+ } else {
+ copyToClipboard(url, button);
+ }
+ });
+ });
+
+ function copyToClipboard(text: string, btn: HTMLButtonElement) {
+ navigator.clipboard.writeText(text).then(() => {
+ const originalText = btn.textContent;
+ btn.textContent = "[Copied!]";
+ btn.classList.add("copied");
+ setTimeout(() => {
+ btn.textContent = originalText;
+ btn.classList.remove("copied");
+ }, 2000);
+ });
+ }
+
+ document.querySelectorAll(".blog-back-btn-internal").forEach((btn) => {
+ btn.addEventListener("click", () => {
+ closeBlogPost();
+ updateUrl();
+ });
+ });
+ });
+</script>
diff --git a/web/src/components/Footer.astro b/web/src/components/Footer.astro
@@ -0,0 +1,51 @@
+---
+import type { WakaTimeData } from "../lib/wakatime";
+
+interface Props {
+ wakaTimeData: WakaTimeData | null;
+}
+
+const { wakaTimeData } = Astro.props;
+---
+
+<footer id="statusbar">
+ <span class="time" id="status-time"></span>
+ <span class="spacer"></span>
+ {
+ wakaTimeData?.weeklyStats && (
+ <span class="wakatime">{wakaTimeData.allTimeStats?.totalText}</span>
+ )
+ }
+</footer>
+
+<style>
+ #statusbar {
+ display: flex;
+ align-items: center;
+ background: var(--bg-alt);
+ border-top: 1px solid var(--border);
+ padding: 0 12px;
+ height: 24px;
+ font-size: 12px;
+ flex-shrink: 0;
+ }
+
+ #statusbar .time {
+ color: var(--cyan);
+ }
+
+ #statusbar .spacer {
+ flex: 1;
+ }
+
+ #statusbar .wakatime {
+ color: var(--magenta);
+ }
+
+ @media (max-width: 768px) {
+ #statusbar {
+ font-size: 11px;
+ padding: 0 10px;
+ }
+ }
+</style>
diff --git a/web/src/components/Header.astro b/web/src/components/Header.astro
@@ -0,0 +1,140 @@
+<header id="tabs">
+ <nav class="tab-nav" aria-label="Main navigation">
+ <div class="tab active" data-tab="about" aria-current="page">[1] About</div>
+ <div class="tab" data-tab="experience">[2] Experience</div>
+ <div class="tab" data-tab="projects">[3] Projects</div>
+ <div class="tab" data-tab="blog">[4] Blog</div>
+ </nav>
+ <div class="tab-spacer"></div>
+ <div class="status" id="header-status">
+ <span class="dpad">
+ <span class="dpad-row"><span class="dpad-key">↑</span></span>
+ <span class="dpad-row"
+ ><span class="dpad-key">←</span><span class="dpad-key">↓</span><span
+ class="dpad-key">→</span
+ ></span
+ >
+ </span>
+ <span class="navigate"> navigate · Tab cycle</span>
+ </div>
+</header>
+
+<style>
+ #tabs {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background: var(--bg-alt);
+ border-bottom: 1px solid var(--border);
+ padding: 0 12px;
+ height: 36px;
+ flex-shrink: 0;
+ position: relative;
+ z-index: 10;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ }
+
+ #tabs * {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ }
+
+ .tab-nav {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ }
+
+ .tab {
+ padding: 6px 12px;
+ color: var(--fg-dim);
+ cursor: pointer;
+ border-bottom: 2px solid transparent;
+ transition:
+ color 0.15s,
+ border-color 0.15s;
+ }
+
+ .tab:hover {
+ color: var(--fg);
+ }
+
+ .tab.active {
+ color: var(--accent);
+ border-bottom-color: var(--accent);
+ }
+
+ .tab-spacer {
+ flex: 1;
+ }
+
+ .status {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ color: var(--fg-dim);
+ font-size: 11px;
+ margin-right: 8px;
+ }
+
+ .dpad {
+ display: inline-flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 1px;
+ font-size: 8px;
+ line-height: 1;
+ }
+
+ .dpad-row {
+ display: flex;
+ gap: 1px;
+ }
+
+ .dpad-key {
+ width: 12px;
+ height: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--border);
+ border-radius: 2px;
+ color: var(--fg);
+ }
+
+ @media (max-width: 768px) {
+ #tabs {
+ flex-wrap: wrap;
+ height: auto;
+ min-height: 36px;
+ padding: 8px 12px;
+ gap: 8px;
+ }
+
+ .tab-nav {
+ width: 100%;
+ justify-content: space-between;
+ gap: 0;
+ }
+
+ .tab {
+ padding: 6px 8px;
+ font-size: 12px;
+ flex: 1;
+ text-align: center;
+ }
+
+ .tab-spacer {
+ display: none;
+ }
+
+ .status {
+ display: none;
+ }
+ }
+</style>
diff --git a/web/src/components/Lightbox.astro b/web/src/components/Lightbox.astro
@@ -0,0 +1,139 @@
+---
+
+---
+
+<div id="image-lightbox" class="lightbox hidden">
+ <div class="lightbox-overlay"></div>
+ <div class="lightbox-content">
+ <img src="" alt="" class="lightbox-image" />
+ <button class="lightbox-close">[X]</button>
+ </div>
+</div>
+
+<style>
+ .lightbox {
+ position: fixed;
+ inset: 0;
+ z-index: 1000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .lightbox.hidden {
+ display: none;
+ }
+
+ .lightbox-overlay {
+ position: absolute;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.9);
+ cursor: pointer;
+ }
+
+ .lightbox-content {
+ position: relative;
+ max-width: 90vw;
+ max-height: 90vh;
+ z-index: 1;
+ }
+
+ .lightbox-image {
+ max-width: 100%;
+ max-height: 90vh;
+ border-radius: 4px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
+ }
+
+ .lightbox-close {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ background: rgba(0, 0, 0, 0.7);
+ border: 1px solid var(--border);
+ color: var(--fg);
+ font-family: "JetBrains Mono", monospace;
+ font-size: 12px;
+ cursor: pointer;
+ padding: 4px 8px;
+ line-height: 1;
+ transition:
+ color 0.15s,
+ background 0.15s;
+ z-index: 10;
+ }
+
+ .lightbox-close:hover {
+ color: var(--accent);
+ background: rgba(0, 0, 0, 0.9);
+ }
+</style>
+
+<script>
+ document.addEventListener("DOMContentLoaded", () => {
+ const lightbox = document.getElementById("image-lightbox");
+ const lightboxImage = lightbox?.querySelector(
+ ".lightbox-image",
+ ) as HTMLImageElement;
+ const lightboxOverlay = lightbox?.querySelector(".lightbox-overlay");
+ const lightboxClose = lightbox?.querySelector(".lightbox-close");
+
+ let lightboxImages: string[] = [];
+ let currentLightboxIndex = 0;
+
+ (window as Window & { isLightboxOpen?: () => boolean }).isLightboxOpen =
+ () => !lightbox?.classList.contains("hidden");
+
+ (
+ window as Window & {
+ openLightbox?: (images: string[], startIndex?: number) => void;
+ }
+ ).openLightbox = (images: string[], startIndex: number = 0) => {
+ if (lightbox && lightboxImage && images.length > 0) {
+ lightboxImages = images;
+ currentLightboxIndex = startIndex;
+ lightboxImage.src = images[startIndex];
+ lightbox.classList.remove("hidden");
+ }
+ };
+
+ function closeLightbox() {
+ lightbox?.classList.add("hidden");
+ lightboxImages = [];
+ currentLightboxIndex = 0;
+ }
+
+ function navigateLightboxImage(direction: number) {
+ if (lightboxImages.length <= 1) return;
+ currentLightboxIndex =
+ (currentLightboxIndex + direction + lightboxImages.length) %
+ lightboxImages.length;
+ if (lightboxImage) {
+ lightboxImage.src = lightboxImages[currentLightboxIndex];
+ }
+ }
+
+ (
+ window as Window & { navigateLightboxImage?: (direction: number) => void }
+ ).navigateLightboxImage = navigateLightboxImage;
+
+ lightboxOverlay?.addEventListener("click", closeLightbox);
+ lightboxClose?.addEventListener("click", closeLightbox);
+
+ document.addEventListener("keydown", (e) => {
+ if (!lightbox?.classList.contains("hidden")) {
+ if (e.key === "Escape") {
+ closeLightbox();
+ } else if (e.key === "ArrowLeft") {
+ e.preventDefault();
+ e.stopPropagation();
+ navigateLightboxImage(-1);
+ } else if (e.key === "ArrowRight") {
+ e.preventDefault();
+ e.stopPropagation();
+ navigateLightboxImage(1);
+ }
+ }
+ });
+ });
+</script>
diff --git a/web/src/components/pages/About.astro b/web/src/components/pages/About.astro
@@ -0,0 +1,385 @@
+---
+import rawAbout from "../../../config/about.json";
+import type About from "../../lib/types/about";
+import rawContact from "../../../config/contact.json";
+import type Contact from "../../lib/types/contact";
+import type { WakaTimeData } from "../../lib/wakatime";
+import { getTagClass } from "../../lib/utils/tags";
+
+const about = rawAbout as About;
+const contact = rawContact as Contact;
+
+interface Props {
+ wakaTimeData: WakaTimeData | null;
+}
+
+const { wakaTimeData } = Astro.props;
+---
+
+<section id="about" class="page active">
+ <div class="about-layout">
+ <div class="about-left">
+ <img
+ class="profile-image"
+ src="/me.jpg"
+ alt="Damian Myrda - Software Engineer and high school senior from Chicago"
+ width="280"
+ height="280"
+ loading="eager"
+ />
+ <div class="contact-box">
+ <div class="box-title">─ Contact ─</div>
+ <div class="contact-item">
+ <span class="label">Email</span>
+ <a href={`mailto:${contact.email}`}>{contact.email}</a>
+ </div>
+ <div class="contact-item">
+ <span class="label">GitLab</span>
+ <a href={contact.gitlab} target="_blank" rel="noopener noreferrer me"
+ >git.prime8.dev/moncheeta</a
+ >
+ </div>
+ <div class="contact-item">
+ <span class="label">LinkedIn</span>
+ <a
+ href={contact.linkedin}
+ target="_blank"
+ rel="noopener noreferrer me">linkedin.com/in/damian-myrda</a
+ >
+ </div>
+ </div>
+ </div>
+ <div class="about-right">
+ <div class="section">
+ <h1>
+ {about.name}
+ <span class="dim">@{about.handle}</span>
+ </h1>
+ <p class="bio">{about.bio}</p>
+ </div>
+ <div class="section">
+ <div class="box-title">─ Info ─</div>
+ <div class="info-row">
+ <span class="label">Location</span>
+ {about.location}
+ </div>
+ <div class="info-row">
+ <span class="label">School</span>
+ {about.school}
+ </div>
+ <div class="info-row">
+ <span class="label">Graduating</span>
+ {about.graduating}
+ </div>
+ </div>
+ <div class="section">
+ <div class="box-title">─ Interests ─</div>
+ <div class="tags">
+ {
+ about.interests.map((interest) => (
+ <span class={`tag ${getTagClass(interest)}`}>{interest}</span>
+ ))
+ }
+ </div>
+ </div>
+ <div class="section">
+ <div class="box-title">─ Tools ─</div>
+ <div class="tags">
+ {
+ about.tools.map((tool) => (
+ <span class={`tag ${getTagClass(tool)}`}>{tool}</span>
+ ))
+ }
+ </div>
+ </div>
+ <div class="section">
+ <div class="box-title">─ Languages ─</div>
+ <div class="tags">
+ {
+ about.languages.map((lang) => (
+ <span class={`tag ${getTagClass(lang)}`}>{lang}</span>
+ ))
+ }
+ </div>
+ </div>
+ {
+ wakaTimeData?.weeklyStats && (
+ <div class="section">
+ <div class="box-title">─ Activity ─</div>
+ <div class="weekly-stats">
+ <div class="weekly-total">
+ {wakaTimeData.weeklyStats.totalText}
+ </div>
+ <div class="weekly-days">
+ {wakaTimeData.weeklyStats.days.map((day) => (
+ <div class="weekly-day-row">
+ <span class="weekly-day-name">{day.dayText}</span>
+ <div class="weekly-day-bar-container">
+ <div
+ class="weekly-day-bar"
+ style={`width: ${day.barWidthPercent}`}
+ />
+ </div>
+ <span class="weekly-day-time">{day.timeText}</span>
+ </div>
+ ))}
+ </div>
+ </div>
+ </div>
+ )
+ }
+ </div>
+ </div>
+</section>
+
+<style>
+ .about-layout {
+ display: flex;
+ width: 100%;
+ height: 100%;
+ }
+
+ .about-left {
+ width: 320px;
+ flex-shrink: 0;
+ border-right: 1px solid var(--border);
+ display: flex;
+ flex-direction: column;
+ padding: 16px;
+ gap: 16px;
+ overflow-y: auto;
+ }
+
+ .about-right {
+ flex: 1;
+ padding: 24px 32px;
+ overflow-y: auto;
+ }
+
+ .profile-image {
+ width: 100%;
+ max-width: 280px;
+ height: auto;
+ border-radius: 4px;
+ border: 1px solid var(--border);
+ }
+
+ .contact-box {
+ border: 1px solid var(--border);
+ padding: 12px;
+ }
+
+ .box-title {
+ color: var(--accent);
+ font-size: 12px;
+ margin-bottom: 8px;
+ text-align: center;
+ }
+
+ .contact-item {
+ display: flex;
+ margin-bottom: 4px;
+ font-size: 12px;
+ }
+
+ .contact-item .label {
+ color: var(--fg-dim);
+ width: 70px;
+ flex-shrink: 0;
+ }
+
+ .contact-item a {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ .contact-item a:hover {
+ opacity: 0.8;
+ }
+
+ .section {
+ margin-bottom: 20px;
+ }
+
+ .section h1 {
+ font-size: 18px;
+ font-weight: 400;
+ margin-bottom: 4px;
+ }
+
+ .section h1 .dim {
+ color: var(--fg-dim);
+ font-size: 14px;
+ }
+
+ .section .bio {
+ color: var(--fg-dim);
+ font-style: italic;
+ }
+
+ .info-row {
+ display: flex;
+ font-size: 13px;
+ margin-bottom: 4px;
+ }
+
+ .info-row .label {
+ color: var(--fg-dim);
+ width: 100px;
+ flex-shrink: 0;
+ }
+
+ .tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ }
+
+ .weekly-stats {
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ padding: 12px;
+ }
+
+ .weekly-total {
+ font-size: 16px;
+ font-weight: 500;
+ color: var(--accent);
+ margin-bottom: 12px;
+ }
+
+ .weekly-days {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ }
+
+ .weekly-day-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 12px;
+ }
+
+ .weekly-day-name {
+ width: 32px;
+ flex-shrink: 0;
+ color: var(--fg-dim);
+ }
+
+ .weekly-day-bar-container {
+ flex: 1;
+ height: 8px;
+ background: var(--bg);
+ border-radius: 2px;
+ overflow: hidden;
+ }
+
+ .weekly-day-bar {
+ height: 100%;
+ background: var(--accent);
+ border-radius: 2px;
+ }
+
+ .weekly-day-time {
+ min-width: 50px;
+ flex-shrink: 0;
+ text-align: right;
+ color: var(--fg-dim);
+ white-space: nowrap;
+ }
+
+ @media (max-width: 768px) {
+ .about-layout {
+ flex-direction: column;
+ }
+
+ .about-left {
+ width: 100%;
+ border-right: none;
+ border-bottom: 1px solid var(--border);
+ padding: 16px;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 16px;
+ }
+
+ .profile-image {
+ width: 120px;
+ max-width: 120px;
+ height: 120px;
+ }
+
+ .contact-box {
+ flex: 1;
+ min-width: 200px;
+ }
+
+ .about-right {
+ padding: 16px;
+ }
+
+ .section h1 {
+ font-size: 16px;
+ }
+
+ .section h1 .dim {
+ font-size: 12px;
+ }
+
+ .tags {
+ gap: 4px;
+ }
+
+ .tag {
+ font-size: 11px;
+ padding: 2px 6px;
+ }
+
+ .weekly-stats {
+ padding: 10px;
+ }
+
+ .weekly-total {
+ font-size: 14px;
+ }
+
+ .weekly-day-row {
+ font-size: 11px;
+ }
+
+ .weekly-day-name {
+ width: 28px;
+ }
+
+ .weekly-day-time {
+ min-width: 45px;
+ }
+ }
+
+ @media (max-width: 480px) {
+ .about-left {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .profile-image {
+ width: 150px;
+ max-width: 150px;
+ height: 150px;
+ }
+
+ .contact-box {
+ width: 100%;
+ }
+
+ .contact-item {
+ flex-direction: column;
+ gap: 2px;
+ }
+
+ .contact-item .label {
+ width: auto;
+ }
+ }
+</style>
diff --git a/web/src/components/pages/Blog.astro b/web/src/components/pages/Blog.astro
@@ -0,0 +1,205 @@
+---
+import rawBlogs from "../../lib/blogs";
+import type Blog from "../../lib/types/blog";
+import BlogArticle from "../Article.astro";
+
+const blogs = rawBlogs as Blog[];
+---
+
+<section id="blog" class="page">
+ {
+ blogs.length === 0 ? (
+ <div class="blog-empty">
+ <p class="color-dim">No blog posts yet.</p>
+ <p class="color-dim">Check back soon!</p>
+ </div>
+ ) : (
+ <>
+ <div id="blog-list-view" class="blog-list-view">
+ <div class="blog-list-container">
+ {blogs.map((blog, i) => (
+ <div class="blog-list-item" data-index={i} data-id={blog.id}>
+ <span class="blog-list-date">{blog.date}</span>
+ <span class="blog-list-title">{blog.title}</span>
+ <span class="blog-list-arrow">→</span>
+ </div>
+ ))}
+ </div>
+ </div>
+
+ <div id="blog-post-view" class="blog-post-view hidden">
+ <div class="blog-post-container">
+ {blogs.map((blog, i) => (
+ <div
+ class="blog-post hidden"
+ data-index={i}
+ data-id={blog.id}
+ data-blog-id={blog.id}
+ >
+ <BlogArticle blog={blog} isStandalone={false} />
+ </div>
+ ))}
+ </div>
+ </div>
+ </>
+ )
+ }
+</section>
+
+<style>
+ .blog-empty {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ width: 100%;
+ gap: 8px;
+ }
+
+ .blog-list-view {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ width: 100%;
+ }
+
+ .blog-list-view.hidden {
+ display: none;
+ }
+
+ .blog-list-container {
+ max-width: 600px;
+ width: 100%;
+ padding: 32px;
+ }
+
+ .blog-list-item {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 16px 20px;
+ border: 1px solid var(--border);
+ margin-bottom: 12px;
+ cursor: pointer;
+ transition:
+ background 0.15s ease,
+ border-color 0.15s ease;
+ text-decoration: none;
+ color: inherit;
+ }
+
+ .blog-list-item:hover {
+ background: var(--selection);
+ border-color: var(--accent);
+ }
+
+ .blog-list-item.selected {
+ background: var(--bg-alt);
+ border-color: var(--accent);
+ }
+
+ .blog-list-item.selected:hover {
+ background: var(--selection);
+ }
+
+ .blog-list-item:last-child {
+ margin-bottom: 0;
+ }
+
+ .blog-list-date {
+ color: var(--fg-dim);
+ font-size: 12px;
+ flex-shrink: 0;
+ width: 90px;
+ }
+
+ .blog-list-title {
+ flex: 1;
+ color: var(--fg);
+ font-weight: 500;
+ }
+
+ .blog-list-arrow {
+ color: var(--fg-dim);
+ font-size: 14px;
+ transition:
+ transform 0.15s,
+ color 0.15s;
+ }
+
+ .blog-list-item:hover .blog-list-arrow {
+ color: var(--accent);
+ transform: translateX(4px);
+ }
+
+ .blog-post-view {
+ display: flex;
+ justify-content: center;
+ height: 100%;
+ width: 100%;
+ overflow-y: auto;
+ padding: 32px;
+ }
+
+ .blog-post-view.hidden {
+ display: none;
+ }
+
+ .blog-post-container {
+ max-width: 700px;
+ width: 100%;
+ }
+
+ .blog-post.hidden {
+ display: none;
+ }
+
+ @media (max-width: 768px) {
+ .blog-list-container {
+ padding: 16px;
+ }
+
+ .blog-list-item {
+ gap: 12px;
+ padding: 12px 16px;
+ margin-bottom: 10px;
+ }
+
+ .blog-list-date {
+ font-size: 11px;
+ width: 80px;
+ }
+
+ .blog-list-title {
+ font-size: 14px;
+ }
+
+ .blog-post-view {
+ padding: 16px;
+ }
+ }
+
+ @media (max-width: 480px) {
+ .blog-list-item {
+ flex-wrap: wrap;
+ gap: 4px;
+ }
+
+ .blog-list-date {
+ width: auto;
+ order: 2;
+ }
+
+ .blog-list-title {
+ width: 100%;
+ order: 1;
+ }
+
+ .blog-list-arrow {
+ order: 3;
+ margin-left: auto;
+ }
+ }
+</style>
diff --git a/web/src/components/pages/Experience.astro b/web/src/components/pages/Experience.astro
@@ -0,0 +1,623 @@
+---
+import rawExperience from "../../../config/experience.json";
+import type Experience from "../../lib/types/experience";
+import { MONTH_NAMES } from "../../constants/calendar";
+import { calculateMonths } from "../../lib/utils/period";
+import { getTagClass } from "../../lib/utils/tags";
+
+const experience = (rawExperience as Experience[]).sort((a, b) =>
+ a.startDate.localeCompare(b.startDate),
+);
+
+const dates = experience.map((exp) => {
+ const [year, month] = exp.startDate.split("-").map(Number);
+ return new Date(year, month - 1, 1);
+});
+const endDates = experience.map((exp) =>
+ exp.endDate
+ ? new Date(
+ parseInt(exp.endDate.split("-")[0]),
+ parseInt(exp.endDate.split("-")[1]) - 1,
+ 28,
+ )
+ : new Date(),
+);
+const earliestDate = new Date(Math.min(...dates.map((d) => d.getTime())));
+const latestDate = new Date(Math.max(...endDates.map((d) => d.getTime())));
+
+const timelineStart = new Date(
+ earliestDate.getFullYear(),
+ earliestDate.getMonth(),
+ 1,
+);
+const timelineEnd = latestDate;
+const totalDays = Math.ceil(
+ (timelineEnd.getTime() - timelineStart.getTime()) / (1000 * 60 * 60 * 24),
+);
+
+const startYear = timelineStart.getFullYear();
+const endYear = timelineEnd.getFullYear();
+const years = Array.from(
+ { length: endYear - startYear + 1 },
+ (_, i) => startYear + i,
+);
+
+const monthTicks: string[] = [];
+let current = new Date(timelineStart);
+while (current <= timelineEnd) {
+ monthTicks.push(MONTH_NAMES[current.getMonth()][0]);
+ current.setMonth(current.getMonth() + 1);
+}
+---
+
+<section id="experience" class="page">
+ <article class="experience-layout">
+ <div class="timeline-container">
+ <div class="timeline-years">
+ {years.map((year) => <span class="year-marker">{year}</span>)}
+ </div>
+
+ <div class="timeline-bar">
+ {
+ experience.map((exp) => {
+ const [startYear, startMonth] = exp.startDate
+ .split("-")
+ .map(Number);
+ const expStart = new Date(startYear, startMonth - 1, 1);
+ const expEnd = exp.endDate
+ ? new Date(
+ parseInt(exp.endDate.split("-")[0]),
+ parseInt(exp.endDate.split("-")[1]) - 1,
+ 28,
+ )
+ : new Date();
+
+ const startOffset = Math.max(
+ 0,
+ (expStart.getTime() - timelineStart.getTime()) /
+ (1000 * 60 * 60 * 24),
+ );
+ const duration =
+ (expEnd.getTime() - expStart.getTime()) / (1000 * 60 * 60 * 24);
+
+ const leftPercent = (startOffset / totalDays) * 100;
+ const widthPercent = (duration / totalDays) * 100;
+ const months = calculateMonths(exp.startDate, exp.endDate);
+
+ const originalIndex = experience.findIndex((e) => e.id === exp.id);
+
+ return (
+ <div
+ class={`timeline-segment ${originalIndex === 0 ? "selected" : ""}`}
+ style={`left: ${leftPercent}%; width: ${widthPercent}%;`}
+ data-index={originalIndex}
+ data-id={exp.id}
+ >
+ <div class="segment-content">
+ <span class="segment-company">{exp.company}</span>
+ <span class="segment-duration">{months} mos</span>
+ </div>
+ </div>
+ );
+ })
+ }
+ </div>
+
+ <div class="timeline-ticks">
+ {monthTicks.map((m) => <span class="tick-mark">{m}</span>)}
+ </div>
+ </div>
+
+ <div class="experience-detail">
+ {
+ experience.map((exp, index) => {
+ const months = calculateMonths(exp.startDate, exp.endDate);
+ const [startYear, startMonth] = exp.startDate.split("-").map(Number);
+ const startStr = `${MONTH_NAMES[startMonth - 1]} ${startYear}`;
+ const endStr = exp.endDate
+ ? `${MONTH_NAMES[parseInt(exp.endDate.split("-")[1]) - 1]} ${exp.endDate.split("-")[0]}`
+ : "Present";
+
+ return (
+ <div
+ class={`exp-card ${index !== 0 ? "hidden" : ""}`}
+ data-for={index}
+ >
+ <div class="exp-card-header">
+ <div class="exp-card-title">
+ {exp.logo ? (
+ <div class="exp-title-with-logo">
+ <img
+ src={exp.logo}
+ alt={`${exp.company} logo`}
+ class={`exp-logo ${exp.logoFilter || ""}`}
+ />
+ <span class="exp-role">{exp.role}</span>
+ </div>
+ ) : (
+ <div class="exp-title-text">
+ <h2>{exp.company}</h2>
+ <span class="exp-role">{exp.role}</span>
+ </div>
+ )}
+ </div>
+ <div class="exp-card-meta">
+ <span class="exp-dates">
+ {startStr} → {endStr}
+ </span>
+ <span class="exp-duration">{months} months</span>
+ {exp.url && (
+ <a
+ class="external-link"
+ href={exp.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ {new URL(exp.url).hostname} →
+ </a>
+ )}
+ </div>
+ </div>
+ <div class="exp-card-tech">
+ {exp.tech.map((tech) => (
+ <span class={`tag ${getTagClass(tech)}`}>{tech}</span>
+ ))}
+ </div>
+ <div class="exp-card-body">
+ {exp.description.map((description) => (
+ <p>{description}</p>
+ ))}
+ </div>
+ {exp.images && exp.images.length > 0 && (
+ <div class="exp-card-images">
+ <img
+ src={exp.images[0]}
+ alt={`${exp.company} workplace, ${exp.role} experience at ${exp.company}`}
+ class="exp-image-hero"
+ loading="lazy"
+ data-idx="0"
+ />
+ {exp.images.length > 1 && (
+ <div class="exp-image-grid">
+ {exp.images.slice(1).map((image, index) => (
+ <img
+ src={image}
+ alt={`${exp.company} team and office environment, image ${index + 2} of ${exp.images!.length}`}
+ class="exp-image-thumb"
+ loading="lazy"
+ data-idx={index + 1}
+ />
+ ))}
+ </div>
+ )}
+ </div>
+ )}
+ </div>
+ );
+ })
+ }
+ </div>
+ </article>
+</section>
+
+<script>
+ document.addEventListener("DOMContentLoaded", () => {
+ document
+ .querySelectorAll(".exp-image-hero, .exp-image-thumb")
+ .forEach((img) => {
+ img.addEventListener("click", () => {
+ const container = (img as HTMLElement).closest(".exp-card-images");
+ const allImages = container
+ ? Array.from(container.querySelectorAll("img")).map(
+ (i) => (i as HTMLImageElement).src,
+ )
+ : [];
+ const startIndex = allImages.indexOf((img as HTMLImageElement).src);
+ (
+ window as Window & {
+ openLightbox?: (images: string[], startIndex?: number) => void;
+ }
+ ).openLightbox?.(allImages, startIndex);
+ });
+ });
+ });
+</script>
+
+<style>
+ .experience-layout {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ width: 100%;
+ padding: 32px 48px;
+ gap: 24px;
+ }
+
+ .timeline-container {
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ }
+
+ .timeline-years {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 4px;
+ font-size: 12px;
+ color: var(--fg-dim);
+ }
+
+ .year-marker {
+ font-weight: 500;
+ }
+
+ .timeline-bar {
+ position: relative;
+ height: 48px;
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ }
+
+ .timeline-segment {
+ position: absolute;
+ top: 4px;
+ bottom: 4px;
+ background: var(--border);
+ border-radius: 3px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+ }
+
+ .timeline-segment:hover {
+ background: var(--fg-dim);
+ }
+
+ .timeline-segment.selected {
+ background: var(--accent);
+ box-shadow:
+ 0 0 0 2px var(--accent),
+ 0 0 12px rgba(215, 175, 95, 0.3);
+ }
+
+ .segment-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 2px;
+ padding: 0 8px;
+ min-width: 0;
+ }
+
+ .segment-company {
+ font-size: 11px;
+ font-weight: 600;
+ color: var(--bg);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 100%;
+ }
+
+ .segment-duration {
+ font-size: 9px;
+ color: var(--bg);
+ opacity: 0.8;
+ }
+
+ .timeline-segment.selected .segment-company,
+ .timeline-segment.selected .segment-duration {
+ color: var(--bg);
+ }
+
+ .timeline-ticks {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 2px;
+ font-size: 9px;
+ color: var(--fg-dim);
+ opacity: 0.6;
+ }
+
+ .tick-mark {
+ width: 5%;
+ text-align: center;
+ }
+
+ .experience-detail {
+ flex: 1;
+ overflow-y: auto;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .exp-card {
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ padding: 24px;
+ width: 100%;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ animation: slideUp 0.2s ease;
+ }
+
+ @keyframes slideUp {
+ from {
+ opacity: 0;
+ transform: translateY(8px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+
+ .exp-card.hidden {
+ display: none;
+ }
+
+ .exp-card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 16px;
+ gap: 24px;
+ }
+
+ .exp-card-title {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ }
+
+ .exp-logo {
+ height: 32px;
+ width: auto;
+ flex-shrink: 0;
+ }
+
+ .exp-logo.logo-invert {
+ filter: brightness(0) invert(1);
+ }
+
+ .exp-title-with-logo {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .exp-title-with-logo .exp-role {
+ color: #999;
+ font-size: 14px;
+ }
+
+ .exp-title-with-logo .exp-duration {
+ color: #aaa;
+ font-size: 12px;
+ }
+
+ .exp-title-text h2 {
+ font-size: 22px;
+ font-weight: 500;
+ color: var(--accent);
+ margin: 0 0 4px 0;
+ }
+
+ .exp-title-text .exp-role {
+ font-size: 14px;
+ color: #999;
+ }
+
+ .exp-card-meta {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 4px;
+ font-size: 13px;
+ }
+
+ .exp-dates {
+ color: var(--fg);
+ }
+
+ .exp-duration {
+ color: #aaa;
+ font-size: 12px;
+ }
+
+ .exp-card-tech {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-bottom: 20px;
+ }
+
+ .exp-card-body {
+ color: var(--fg);
+ line-height: 1.7;
+ padding-bottom: 0;
+ margin-bottom: 0;
+ }
+
+ .exp-card-body p {
+ margin-bottom: 12px;
+ }
+
+ .exp-card-body p:last-child {
+ margin-bottom: 0;
+ }
+
+ .exp-card-images {
+ display: flex;
+ gap: 16px;
+ margin-top: 12px;
+ padding-top: 12px;
+ border-top: 1px solid var(--border);
+ flex: 1;
+ min-height: 0;
+ overflow: hidden;
+ }
+
+ .exp-image-hero {
+ flex: 1;
+ min-width: 0;
+ height: 100%;
+ border-radius: 4px;
+ border: 1px solid var(--border);
+ object-fit: cover;
+ cursor: pointer;
+ transition:
+ transform 0.15s,
+ box-shadow 0.15s;
+ }
+
+ .exp-image-hero:hover {
+ opacity: 0.8;
+ border-color: var(--accent);
+ }
+
+ .exp-image-grid {
+ width: 180px;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .exp-image-thumb {
+ width: 100%;
+ flex: 1;
+ min-height: 50px;
+ border-radius: 4px;
+ border: 1px solid var(--border);
+ object-fit: cover;
+ cursor: pointer;
+ transition:
+ opacity 0.15s,
+ border-color 0.15s;
+ }
+
+ .exp-image-thumb:hover {
+ opacity: 0.8;
+ border-color: var(--accent);
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 12px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ @media (max-width: 768px) {
+ .experience-layout {
+ padding: 16px;
+ gap: 16px;
+ }
+
+ .timeline-container {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .timeline-bar {
+ min-width: 500px;
+ height: 40px;
+ }
+
+ .timeline-years {
+ min-width: 500px;
+ font-size: 11px;
+ }
+
+ .timeline-ticks {
+ min-width: 500px;
+ font-size: 8px;
+ }
+
+ .segment-content {
+ padding: 0 4px;
+ }
+
+ .segment-company {
+ font-size: 9px;
+ }
+
+ .segment-duration {
+ font-size: 8px;
+ }
+
+ .exp-card {
+ padding: 16px;
+ }
+
+ .exp-card-header {
+ flex-direction: column;
+ gap: 12px;
+ }
+
+ .exp-card-meta {
+ align-items: flex-start;
+ }
+
+ .exp-logo {
+ height: 28px;
+ }
+
+ .exp-title-text h2 {
+ font-size: 18px;
+ }
+
+ .exp-card-tech {
+ gap: 4px;
+ }
+
+ .exp-card-body {
+ font-size: 13px;
+ }
+
+ .exp-card-images {
+ flex-direction: column;
+ gap: 12px;
+ }
+
+ .exp-image-hero {
+ height: auto;
+ max-height: 200px;
+ }
+
+ .exp-image-grid {
+ width: 100%;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 8px;
+ }
+
+ .exp-image-thumb {
+ width: calc(33.33% - 6px);
+ min-height: 60px;
+ max-height: 80px;
+ }
+ }
+
+ @media (max-width: 480px) {
+ .timeline-bar {
+ height: 36px;
+ }
+
+ .exp-image-thumb {
+ width: calc(50% - 4px);
+ }
+ }
+</style>
diff --git a/web/src/components/pages/Projects.astro b/web/src/components/pages/Projects.astro
@@ -0,0 +1,404 @@
+---
+import rawProjects from "../../../config/projects.json";
+import type Project from "../../lib/types/project";
+import { getTagClass, getTechMeta } from "../../lib/utils/tags";
+
+const projects = rawProjects as Project[];
+
+interface Props {
+ readmes?: Record<string, string>;
+}
+
+const { readmes } = Astro.props;
+---
+
+<section id="projects" class="page">
+ <aside class="list-view" aria-label="Project list">
+ {
+ projects.map((prg, i) => (
+ <div
+ class={`list-item ${i === 0 ? "selected" : ""}`}
+ data-index={i}
+ data-id={prg.id}
+ >
+ <div class="list-header">
+ <span class="list-title">{prg.name}</span>
+ <span class="list-meta">{getTechMeta(prg.tech)}</span>
+ </div>
+ <div class="list-subtitle">{prg.subtitle}</div>
+ </div>
+ ))
+ }
+ </aside>
+ <article class="detail-view">
+ {
+ projects.map((prg, index) => (
+ <div
+ class={`detail-content ${index !== 0 ? "hidden" : ""}`}
+ data-for={index}
+ data-id={prg.id}
+ >
+ <div class="detail-header">
+ <h2>{prg.name}</h2>
+ <a
+ class="external-link"
+ href={prg.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ {prg.url.includes("github.com") ? "GitHub" : "GitLab"} →
+ </a>
+ </div>
+ <div class="tech-stack">
+ {prg.tech.map((tech) => (
+ <span class={`tag ${getTagClass(tech)}`}>{tech}</span>
+ ))}
+ </div>
+ <div class="readme-content" data-readme={prg.id}>
+ {readmes?.[prg.id] ? (
+ <Fragment set:html={readmes[prg.id]} />
+ ) : (
+ <p class="color-dim">README not available</p>
+ )}
+ </div>
+ </div>
+ ))
+ }
+ </article>
+</section>
+
+<style>
+ aside.list-view {
+ width: 300px;
+ flex-shrink: 0;
+ border-right: 1px solid var(--border);
+ overflow-y: auto;
+ }
+
+ article.detail-view {
+ flex: 1;
+ padding: 24px 32px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .list-item {
+ padding: 12px 16px;
+ border-bottom: 1px solid var(--border);
+ cursor: pointer;
+ transition: background 0.1s;
+ }
+
+ .list-item:hover {
+ background: var(--bg-alt);
+ }
+
+ .list-item.selected {
+ background: var(--selection);
+ border-left: 3px solid var(--accent);
+ }
+
+ .list-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 2px;
+ }
+
+ .list-title {
+ font-weight: 600;
+ color: var(--fg);
+ }
+
+ .list-meta {
+ font-size: 11px;
+ color: var(--fg-dim);
+ }
+
+ .list-subtitle {
+ font-size: 12px;
+ color: var(--fg-dim);
+ }
+
+ .detail-content {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ }
+
+ .detail-content.hidden {
+ display: none;
+ }
+
+ .detail-content h2 {
+ font-size: 20px;
+ font-weight: 400;
+ color: var(--accent);
+ margin-bottom: 4px;
+ }
+
+ .detail-content .tech-stack {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin-bottom: 16px;
+ }
+
+ .detail-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+ }
+
+ .detail-header h2 {
+ margin-bottom: 0;
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 12px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ .readme-content {
+ flex: 1;
+ min-height: 0;
+ overflow-y: auto;
+ font-size: 13px;
+ line-height: 1.6;
+ color: var(--fg);
+ margin-top: 16px;
+ padding-top: 16px;
+ border-top: 1px solid var(--border);
+ }
+
+ .readme-content :global(p) {
+ margin-bottom: 12px;
+ }
+
+ .readme-content :global(p:last-child) {
+ margin-bottom: 0;
+ }
+
+ .readme-content :global(h2),
+ .readme-content :global(.readme-h1) {
+ font-size: 16px;
+ color: var(--accent);
+ margin: 20px 0 8px;
+ font-weight: 600;
+ }
+
+ .readme-content :global(h2:first-child),
+ .readme-content :global(.readme-h1:first-child) {
+ margin-top: 0;
+ }
+
+ .readme-content :global(h3),
+ .readme-content :global(.readme-h2) {
+ font-size: 14px;
+ color: var(--accent);
+ margin: 16px 0 8px;
+ font-weight: 500;
+ }
+
+ .readme-content :global(h4),
+ .readme-content :global(.readme-h3) {
+ font-size: 13px;
+ color: var(--fg);
+ margin: 12px 0 6px;
+ font-weight: 500;
+ }
+
+ .readme-content :global(h5),
+ .readme-content :global(h6) {
+ font-size: 12px;
+ color: var(--fg-dim);
+ margin: 10px 0 6px;
+ font-weight: 500;
+ }
+
+ .readme-content :global(pre) {
+ display: block;
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ padding: 12px;
+ margin: 12px 0;
+ overflow-x: auto;
+ font-size: 12px;
+ line-height: 1.4;
+ }
+
+ .readme-content :global(pre code) {
+ background: none;
+ padding: 0;
+ font-size: inherit;
+ }
+
+ .readme-content :global(code) {
+ background: var(--bg-alt);
+ padding: 2px 6px;
+ font-size: 12px;
+ border-radius: 2px;
+ }
+
+ .readme-content :global(a) {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ .readme-content :global(a:hover) {
+ opacity: 0.8;
+ }
+
+ .readme-content :global(ul),
+ .readme-content :global(ol) {
+ margin: 8px 0;
+ padding-left: 20px;
+ }
+
+ .readme-content :global(li) {
+ margin-bottom: 4px;
+ }
+
+ .readme-content :global(li > ul),
+ .readme-content :global(li > ol) {
+ margin: 4px 0;
+ }
+
+ .readme-content :global(table) {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 12px 0;
+ font-size: 12px;
+ }
+
+ .readme-content :global(th),
+ .readme-content :global(td) {
+ border: 1px solid var(--border);
+ padding: 8px 12px;
+ text-align: left;
+ }
+
+ .readme-content :global(th) {
+ background: var(--bg-alt);
+ color: var(--accent);
+ font-weight: 500;
+ }
+
+ .readme-content :global(tr:nth-child(even)) {
+ background: rgba(255, 255, 255, 0.02);
+ }
+
+ .readme-content :global(blockquote) {
+ border-left: 3px solid var(--accent);
+ margin: 12px 0;
+ padding: 8px 16px;
+ color: var(--fg-dim);
+ background: var(--bg-alt);
+ }
+
+ .readme-content :global(blockquote p) {
+ margin-bottom: 0;
+ }
+
+ .readme-content :global(hr) {
+ border: none;
+ border-top: 1px solid var(--border);
+ margin: 20px 0;
+ }
+
+ .readme-content :global(img) {
+ max-width: 100%;
+ height: auto;
+ margin: 12px 0;
+ }
+
+ .readme-content :global(strong) {
+ color: var(--fg);
+ font-weight: 600;
+ }
+
+ .readme-content :global(em) {
+ font-style: italic;
+ color: var(--fg-dim);
+ }
+
+ .readme-content :global(del) {
+ text-decoration: line-through;
+ color: var(--fg-dim);
+ }
+
+ @media (max-width: 768px) {
+ #projects {
+ flex-direction: column;
+ }
+
+ aside.list-view {
+ width: 100%;
+ border-right: none;
+ border-bottom: 1px solid var(--border);
+ max-height: 200px;
+ overflow-y: auto;
+ }
+
+ .list-item {
+ padding: 10px 14px;
+ }
+
+ .list-title {
+ font-size: 13px;
+ }
+
+ .list-subtitle {
+ font-size: 11px;
+ }
+
+ article.detail-view {
+ padding: 16px;
+ overflow-y: auto;
+ }
+
+ .detail-content h2 {
+ font-size: 18px;
+ }
+
+ .detail-header {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 8px;
+ }
+
+ .readme-content {
+ font-size: 12px;
+ }
+
+ .readme-content :global(pre) {
+ font-size: 11px;
+ padding: 10px;
+ }
+
+ .readme-content :global(code) {
+ font-size: 11px;
+ }
+ }
+
+ @media (max-width: 480px) {
+ aside.list-view {
+ max-height: 150px;
+ }
+
+ .list-item {
+ padding: 8px 12px;
+ }
+
+ .list-meta {
+ display: none;
+ }
+ }
+</style>
diff --git a/web/src/components/styles.css b/web/src/components/styles.css
@@ -0,0 +1,111 @@
+/* Tag colors */
+.tag {
+ border: none;
+ padding: 2px 8px;
+ font-size: 12px;
+ color: var(--bg);
+ background: var(--fg-dim);
+}
+
+/* Language tags */
+.tag.lang-zig {
+ background: #f7a41d;
+}
+.tag.lang-rust {
+ background: #dea584;
+}
+.tag.lang-c {
+ background: #a8b1c2;
+}
+.tag.lang-go {
+ background: #00add8;
+}
+.tag.lang-ts {
+ background: #3178c6;
+ color: #fff;
+}
+.tag.lang-python {
+ background: #3572a5;
+ color: #fff;
+}
+
+/* Tool tags */
+.tag.tool-zed {
+ background: #084ccf;
+ color: #fff;
+}
+.tag.tool-neovim {
+ background: #57a143;
+}
+.tag.tool-opencode {
+ background: #af5faf;
+ color: #fff;
+}
+.tag.tool-linux {
+ background: #f7c94c;
+}
+.tag.tool-fish {
+ background: #d78700;
+}
+.tag.tool-ghostty {
+ background: #8b5cf6;
+ color: #fff;
+}
+
+/* Interest tags */
+.tag.interest-lowlevel {
+ background: #d75f5f;
+ color: #fff;
+}
+.tag.interest-tui {
+ background: #5faf5f;
+ color: #0d0d0d;
+}
+.tag.interest-embedded {
+ background: #5fafaf;
+ color: #0d0d0d;
+}
+.tag.interest-unix {
+ background: #d7af5f;
+ color: #0d0d0d;
+}
+
+/* Tech tags */
+.tag.tech-temporal {
+ background: #4c35c9;
+ color: #fff;
+}
+.tag.tech-postgres {
+ background: #336791;
+ color: #fff;
+}
+.tag.tech-pytorch {
+ background: #ee4c2c;
+ color: #fff;
+}
+.tag.tech-cuda {
+ background: #76b900;
+}
+.tag.tech-docker {
+ background: #2496ed;
+ color: #fff;
+}
+.tag.tech-kafka {
+ background: #4c35c9;
+ color: #fff;
+}
+.tag.tech-rn {
+ background: #61dafb;
+}
+.tag.tech-supabase {
+ background: #3ecf8e;
+}
+
+/* Utility classes */
+.color-dim {
+ color: var(--fg-dim);
+}
+
+.hidden {
+ display: none;
+}
diff --git a/web/src/constants/calendar.ts b/web/src/constants/calendar.ts
@@ -0,0 +1,24 @@
+export const MONTH_NAMES = [
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December",
+];
+
+export const DAY_NAMES = [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+];
diff --git a/web/src/constants/tags.ts b/web/src/constants/tags.ts
@@ -0,0 +1,33 @@
+export const TAG_CLASS_MAP: Record<string, string> = {
+ // Languages
+ Zig: "lang-zig",
+ Rust: "lang-rust",
+ C: "lang-c",
+ Go: "lang-go",
+ TypeScript: "lang-ts",
+ Python: "lang-python",
+ // Tools
+ "Zed (Vim mode)": "tool-zed",
+ Neovim: "tool-neovim",
+ OpenCode: "tool-opencode",
+ Linux: "tool-linux",
+ Fish: "tool-fish",
+ Ghostty: "tool-ghostty",
+ // Interests
+ "Low-level systems": "interest-lowlevel",
+ "TUI/CLI tooling": "interest-tui",
+ "Embedded OS": "interest-embedded",
+ "UNIX philosophy": "interest-unix",
+ // Tech
+ Temporal: "tech-temporal",
+ PyTorch: "tech-pytorch",
+ CUDA: "tech-cuda",
+ Docker: "tech-docker",
+ Kafka: "tech-kafka",
+ "React Native": "tech-rn",
+ Supabase: "tech-supabase",
+};
+
+export const TECH_ABBREVIATIONS: Record<string, string> = {
+ TypeScript: "TS",
+};
diff --git a/web/src/constants/website.ts b/web/src/constants/website.ts
@@ -0,0 +1 @@
+export const URL = "https://prime8.dev";
diff --git a/web/src/layouts/Layout.astro b/web/src/layouts/Layout.astro
@@ -0,0 +1,557 @@
+---
+import Lightbox from "../components/Lightbox.astro";
+import about from "../../config/about.json";
+import { URL } from "../constants/website";
+
+interface Props {
+ title: string;
+ description: string;
+ type: "website" | "article";
+ url: string;
+ image?: string;
+ keywords?: string;
+ publishedTime?: string;
+ modifiedTime?: string;
+}
+
+const {
+ title,
+ description,
+ type,
+ url,
+ image,
+ keywords,
+ publishedTime,
+ modifiedTime,
+} = Astro.props;
+
+const ogImage = image
+ ? image.startsWith("http")
+ ? image
+ : `${URL}${image}`
+ : `${URL}/me.jpg`;
+---
+
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>{title}</title>
+ <meta name="description" content={description} />
+ {keywords && <meta name="keywords" content={keywords} />}
+
+ <link rel="canonical" href={url} />
+ <link rel="alternate" hreflang="en" href={url} />
+ <link rel="alternate" hreflang="x-default" href={url} />
+
+ <!-- Preconnect for external resources -->
+ <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
+ <link rel="dns-prefetch" href="https://cdn.jsdelivr.net" />
+
+ <!-- Preload font for performance -->
+ <link
+ rel="preload"
+ href="https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@5.0.18/files/jetbrains-mono-latin-400-normal.woff2"
+ as="font"
+ type="font/woff2"
+ crossorigin
+ />
+
+ <!-- Open Graph -->
+ <meta property="og:type" content={type} />
+ <meta property="og:url" content={url} />
+ <meta property="og:title" content={title} />
+ <meta property="og:description" content={description} />
+ <meta property="og:image" content={ogImage} />
+ <meta property="og:image:width" content="1200" />
+ <meta property="og:image:height" content="630" />
+ <meta property="og:site_name" content={about.name} />
+ <meta property="og:locale" content="en_US" />
+ {
+ type === "article" && publishedTime && (
+ <meta property="article:published_time" content={publishedTime} />
+ )
+ }
+ {
+ type === "article" && modifiedTime && (
+ <meta property="article:modified_time" content={modifiedTime} />
+ )
+ }
+ {
+ type === "article" && (
+ <meta property="article:author" content={about.name} />
+ )
+ }
+
+ <!-- Twitter Card -->
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:url" content={url} />
+ <meta name="twitter:title" content={title} />
+ <meta name="twitter:description" content={description} />
+ <meta name="twitter:image" content={ogImage} />
+
+ <!-- Additional Meta -->
+ <meta name="author" content={about.name} />
+ <meta name="robots" content="index, follow" />
+ <meta name="theme-color" content="#0d0d0d" />
+
+ <!-- Favicons -->
+ <link rel="icon" type="image/png" href="/favicon.png" />
+ <link rel="apple-touch-icon" href="/favicon.png" />
+ <link rel="manifest" href="/site.webmanifest" />
+ </head>
+ <body>
+ <div id="app">
+ <slot />
+ </div>
+
+ <Lightbox />
+ </body>
+</html>
+
+<style is:global>
+ * {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+ :root {
+ --bg: #0d0d0d;
+ --bg-alt: #161616;
+ --fg: #c0c0c0;
+ --fg-dim: #606060;
+ --accent: #d7af5f;
+ --accent-dim: #a68a3d;
+ --cyan: #5fafaf;
+ --blue: #5f87d7;
+ --light-blue: #5fafff;
+ --yellow: #d7af5f;
+ --magenta: #af5faf;
+ --red: #d75f5f;
+ --border: #333;
+ --selection: #3d3520;
+ }
+
+ @font-face {
+ font-family: "JetBrains Mono";
+ src: url("https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@5.0.18/files/jetbrains-mono-latin-400-normal.woff2")
+ format("woff2");
+ font-weight: 400;
+ }
+
+ body {
+ background: var(--bg);
+ color: var(--fg);
+ font-family: "JetBrains Mono", "SF Mono", "Fira Code", monospace;
+ font-size: 14px;
+ line-height: 1.5;
+ min-height: 100vh;
+ overflow: hidden;
+ }
+
+ ::-webkit-scrollbar {
+ width: 8px;
+ }
+
+ ::-webkit-scrollbar-track {
+ background: var(--bg);
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background: var(--fg-dim);
+ border-radius: 4px;
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background: var(--fg);
+ }
+
+ .link {
+ color: var(--light-blue);
+ text-decoration: underline;
+ cursor: pointer;
+ }
+
+ .link:hover {
+ color: var(--light-blue);
+ opacity: 0.8;
+ }
+
+ a {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ a:hover {
+ opacity: 0.8;
+ }
+
+ .color-green {
+ color: var(--accent);
+ }
+ .color-blue {
+ color: var(--blue);
+ }
+ .color-cyan {
+ color: var(--cyan);
+ }
+ .color-yellow {
+ color: var(--yellow);
+ }
+ .color-red {
+ color: var(--red);
+ }
+ .color-magenta {
+ color: var(--magenta);
+ }
+ .color-dim {
+ color: var(--fg-dim);
+ }
+ .bold {
+ font-weight: 700;
+ }
+
+ #app {
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+ opacity: 0;
+ }
+
+ #app.ready {
+ opacity: 1;
+ }
+
+ #content {
+ flex: 1;
+ overflow: hidden;
+ }
+
+ .page {
+ display: none;
+ height: 100%;
+ }
+
+ .page.active {
+ display: flex;
+ }
+
+ .tag {
+ border: none;
+ padding: 2px 8px;
+ font-size: 12px;
+ color: var(--bg);
+ background: var(--fg-dim);
+ }
+
+ .tag.lang-zig {
+ background: #f7a41d;
+ }
+ .tag.lang-rust {
+ background: #dea584;
+ }
+ .tag.lang-c {
+ background: #a8b1c2;
+ }
+ .tag.lang-go {
+ background: #00add8;
+ }
+ .tag.lang-ts {
+ background: #3178c6;
+ color: #fff;
+ }
+ .tag.lang-python {
+ background: #3572a5;
+ color: #fff;
+ }
+
+ .tag.tool-zed {
+ background: #084ccf;
+ color: #fff;
+ }
+ .tag.tool-neovim {
+ background: #57a143;
+ }
+ .tag.tool-opencode {
+ background: #af5faf;
+ color: #fff;
+ }
+ .tag.tool-linux {
+ background: #f7c94c;
+ }
+ .tag.tool-fish {
+ background: #d78700;
+ }
+ .tag.tool-ghostty {
+ background: #8b5cf6;
+ color: #fff;
+ }
+
+ .tag.interest-lowlevel {
+ background: #d75f5f;
+ color: #fff;
+ }
+ .tag.interest-tui {
+ background: #5faf5f;
+ color: #0d0d0d;
+ }
+ .tag.interest-embedded {
+ background: #5fafaf;
+ color: #0d0d0d;
+ }
+ .tag.interest-unix {
+ background: #d7af5f;
+ color: #0d0d0d;
+ }
+
+ .tag.tech-temporal {
+ background: #4c35c9;
+ color: #fff;
+ }
+ .tag.tech-postgres {
+ background: #336791;
+ color: #fff;
+ }
+ .tag.tech-pytorch {
+ background: #ee4c2c;
+ color: #fff;
+ }
+ .tag.tech-cuda {
+ background: #76b900;
+ }
+ .tag.tech-docker {
+ background: #2496ed;
+ color: #fff;
+ }
+ .tag.tech-kafka {
+ background: #4c35c9;
+ color: #fff;
+ }
+ .tag.tech-rn {
+ background: #61dafb;
+ }
+ .tag.tech-supabase {
+ background: #3ecf8e;
+ }
+
+ @media (max-width: 768px) {
+ body {
+ font-size: 13px;
+ overflow-y: auto;
+ }
+
+ #app {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ height: auto;
+ }
+
+ #content {
+ flex: 1;
+ overflow: visible;
+ }
+
+ .page {
+ height: auto;
+ min-height: calc(100vh - 60px - 24px);
+ }
+
+ .page.active {
+ display: block;
+ }
+ }
+
+ /* Boot Animation */
+ #boot-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+ background: var(--bg);
+ z-index: 9999;
+ display: flex;
+ align-items: flex-start;
+ justify-content: flex-start;
+ padding: 20px;
+ overflow: hidden;
+ }
+
+ #boot-overlay.fade-out {
+ animation: bootFadeOut 0.6s ease-out forwards;
+ }
+
+ .boot-scanline {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ to bottom,
+ transparent 50%,
+ rgba(0, 0, 0, 0.1) 50%
+ );
+ background-size: 100% 4px;
+ pointer-events: none;
+ opacity: 0.3;
+ z-index: 1;
+ }
+
+ .boot-terminal {
+ font-family: "JetBrains Mono", monospace;
+ font-size: 14px;
+ color: var(--fg);
+ line-height: 1.6;
+ position: relative;
+ z-index: 2;
+ }
+
+ .boot-content {
+ white-space: pre-wrap;
+ }
+
+ .boot-line {
+ transition:
+ opacity 0.15s ease-out,
+ transform 0.15s ease-out;
+ }
+
+ .boot-line-hidden {
+ opacity: 0;
+ transform: translateX(-10px);
+ }
+
+ .boot-line-visible {
+ opacity: 1;
+ transform: translateX(0);
+ }
+
+ .boot-cursor {
+ display: inline;
+ animation: blink 0.7s step-end infinite;
+ color: #ffffff;
+ }
+
+ .boot-progress {
+ margin-top: 16px;
+ width: 200px;
+ height: 4px;
+ background: var(--border);
+ border-radius: 2px;
+ overflow: hidden;
+ }
+
+ .boot-progress-bar {
+ height: 100%;
+ width: 0;
+ background: linear-gradient(90deg, var(--cyan), var(--accent));
+ animation: progressFill 1s ease-out forwards;
+ }
+
+ @keyframes progressFill {
+ 0% {
+ width: 0;
+ }
+ 100% {
+ width: 100%;
+ }
+ }
+
+ /* ANSI colors */
+ .ansi-bold-yellow {
+ color: #d7af5f;
+ font-weight: bold;
+ }
+
+ .ansi-bold-cyan {
+ color: #5fafaf;
+ font-weight: bold;
+ }
+
+ .ansi-accent {
+ color: var(--accent);
+ font-weight: bold;
+ }
+
+ .ansi-bold-accent {
+ color: var(--accent);
+ font-weight: bold;
+ }
+
+ .ansi-bold-green {
+ color: #5faf5f;
+ font-weight: bold;
+ }
+
+ .ansi-white {
+ color: #e0e0e0;
+ }
+
+ .ansi-dim {
+ color: #606060;
+ }
+
+ /* Color blocks for neofetch */
+ .ansi-block-black {
+ background: #0d0d0d;
+ }
+ .ansi-block-red {
+ background: #d75f5f;
+ }
+ .ansi-block-green {
+ background: #5faf5f;
+ }
+ .ansi-block-yellow {
+ background: #d7af5f;
+ }
+ .ansi-block-blue {
+ background: #5f87d7;
+ }
+ .ansi-block-magenta {
+ background: #af5faf;
+ }
+ .ansi-block-cyan {
+ background: #5fafaf;
+ }
+ .ansi-block-white {
+ background: #c0c0c0;
+ }
+
+ @keyframes blink {
+ 0%,
+ 100% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 0;
+ }
+ }
+
+ @keyframes bootFadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+ }
+
+ #app.boot-reveal {
+ animation: revealContent 0.5s ease-out;
+ }
+
+ @keyframes revealContent {
+ 0% {
+ opacity: 0;
+ transform: translateY(15px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+</style>
diff --git a/web/src/lib/blogs.ts b/web/src/lib/blogs.ts
@@ -0,0 +1,52 @@
+import matter from "gray-matter";
+import { parseMarkdown } from "./readme/render";
+import type BlogPost from "./types/blog";
+
+const blogModules = import.meta.glob<string>("../../blogs/*.md", {
+ eager: true,
+ query: "?raw",
+ import: "default",
+});
+
+const blogs = Object.values(blogModules)
+ .map((raw) => {
+ const { data, content } = matter(raw);
+
+ const blog: Partial<BlogPost> = {
+ id: data.id as string | undefined,
+ title: data.title as string | undefined,
+ description: data.description as string | undefined,
+ date:
+ data.date instanceof Date
+ ? data.date.toISOString().split("T")[0]
+ : (data.date as string | undefined),
+ modifiedDate: data.modifiedDate
+ ? data.modifiedDate instanceof Date
+ ? data.modifiedDate.toISOString().split("T")[0]
+ : (data.modifiedDate as string)
+ : undefined,
+ url: data.url as string | undefined,
+ content: parseMarkdown(content),
+ image: data.image as string | undefined,
+ tags: data.tags as string[] | undefined,
+ };
+
+ const missingKeys = ["id", "title", "description", "date"].filter(
+ (key) => !blog[key as keyof typeof blog],
+ );
+ if (missingKeys.length > 0) {
+ throw new Error(`Missing keys: ${missingKeys.join(", ")}`);
+ }
+
+ if (blog.url && blog.content) {
+ throw new Error("Blogs cannot have both a URL and content");
+ } else if (!blog.url && !blog.content) {
+ throw new Error("Blogs must have either a URL or content");
+ }
+
+ return blog as BlogPost;
+ })
+ .filter((blog) => blog.id && blog.title)
+ .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
+
+export default blogs satisfies BlogPost[];
diff --git a/web/src/lib/readme/fetch.ts b/web/src/lib/readme/fetch.ts
@@ -0,0 +1,132 @@
+import { parseMarkdown, removeFirstH1 } from "./render";
+
+export async function fetchAllReadmes(): Promise<Record<string, string>> {
+ const readmes: Record<string, string> = {};
+
+ const results = await Promise.allSettled(
+ README_CONFIGS.map(async (config) => {
+ const result = await fetchWithFallback(config.sources);
+ if (result) {
+ const fixed = fixRelativePaths(result.content, result.baseUrl);
+ const html = parseMarkdown(removeFirstH1(fixed));
+ return { name: config.name, html };
+ }
+ return { name: config.name, html: "" };
+ }),
+ );
+
+ for (const result of results) {
+ if (result.status === "fulfilled" && result.value.html) {
+ readmes[result.value.name] = result.value.html;
+ }
+ }
+
+ return readmes;
+}
+
+export async function fetchReadmeForProject(
+ projectId: string,
+): Promise<string | null> {
+ const config = README_CONFIGS.find((c) => c.name === projectId);
+ if (!config) return null;
+
+ const result = await fetchWithFallback(config.sources);
+ if (result) {
+ const fixed = fixRelativePaths(result.content, result.baseUrl);
+ return parseMarkdown(removeFirstH1(fixed));
+ }
+ return null;
+}
+
+async function fetchWithFallback(sources: ReadmeSource[]): Promise<{
+ content: string;
+ baseUrl: string;
+} | null> {
+ for (const source of sources) {
+ try {
+ const response = await fetch(source.url, {
+ headers: { "User-Agent": "prime8dev-portfolio" },
+ });
+ if (response.ok) {
+ return {
+ content: await response.text(),
+ baseUrl: source.baseUrl,
+ };
+ }
+ } catch {
+ // Try next source
+ }
+ }
+ return null;
+}
+
+function fixRelativePaths(markdown: string, baseUrl: string): string {
+ // Fix relative image paths:  -> 
+ let fixed = markdown.replace(
+ /!\[([^\]]*)\]\(\.\/([^)]+)\)/g,
+ ``,
+ );
+
+ // Fix relative link paths (not images): [text](./path) -> [text](baseUrl/path)
+ fixed = fixed.replace(
+ /(?<!!)\[([^\]]+)\]\(\.\/([^)]+)\)/g,
+ `[$1](${baseUrl}/$2)`,
+ );
+
+ return fixed;
+}
+
+interface ReadmeConfig {
+ name: string;
+ sources: ReadmeSource[];
+}
+
+interface ReadmeSource {
+ url: string;
+ baseUrl: string;
+}
+
+const README_CONFIGS: ReadmeConfig[] = [
+ {
+ name: "janitor",
+ sources: [
+ {
+ url: "https://git.prime8.dev/moncheeta/janitor/-/raw/master/README.md",
+ baseUrl: "https://git.prime8.dev/moncheeta/janitor/-/raw/master",
+ },
+ ],
+ },
+ {
+ name: "summarizer",
+ sources: [
+ {
+ url: "https://git.prime8.dev/moncheeta/summarizer/-/raw/master/README.md",
+ baseUrl: "https://git.prime8.dev/moncheeta/summarizer/-/raw/master",
+ },
+ ],
+ },
+ {
+ name: "finger",
+ sources: [
+ {
+ url: "https://git.prime8.dev/moncheeta/finger/-/raw/master/README.md",
+ baseUrl: "https://git.prime8.dev/moncheeta/finger/-/raw/master",
+ },
+ ],
+ },
+ {
+ name: "computer-science-club",
+ sources: [
+ {
+ url: "https://raw.githubusercontent.com/moncheeta/computer-science-club/main/README.md",
+ baseUrl:
+ "https://cdn.jsdelivr.net/gh/moncheeta/computer-science-club@main",
+ },
+ {
+ url: "https://raw.githubusercontent.com/moncheeta/computer-science-club/master/README.md",
+ baseUrl:
+ "https://cdn.jsdelivr.net/gh/moncheeta/computer-science-club@master",
+ },
+ ],
+ },
+];
diff --git a/web/src/lib/readme/render.ts b/web/src/lib/readme/render.ts
@@ -0,0 +1,149 @@
+import { marked } from "marked";
+import type { Tokens, RendererThis } from "marked";
+
+export function parseMarkdown(markdown: string): string {
+ return marked.parse(markdown) as string;
+}
+
+export function removeFirstH1(markdown: string): string {
+ return markdown.replace(/^#\s+.+\n+/, "");
+}
+
+const renderer = {
+ heading(this: RendererThis, token: Tokens.Heading): string {
+ const level = token.depth;
+ const tag = `h${level + 1}`;
+ const text = this.parser.parseInline(token.tokens);
+ return `<${tag} class="readme-h${level}">${text}</${tag}>`;
+ },
+
+ code(token: Tokens.Code): string {
+ const escaped = token.text.replace(/</g, "<").replace(/>/g, ">");
+ return `<pre class="readme-code"><code>${escaped}</code></pre>`;
+ },
+
+ codespan(token: Tokens.Codespan): string {
+ const escaped = token.text.replace(/</g, "<").replace(/>/g, ">");
+ return `<code class="readme-inline-code">${escaped}</code>`;
+ },
+
+ link(this: RendererThis, token: Tokens.Link): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<a href="${token.href}" target="_blank" rel="noopener noreferrer" class="readme-link">${text}</a>`;
+ },
+
+ image(token: Tokens.Image): string {
+ return `<img src="${token.href}" alt="${token.text || ""}" class="readme-img" loading="lazy" />`;
+ },
+
+ list(this: RendererThis, token: Tokens.List): string {
+ function renderList(
+ parser: RendererThis["parser"],
+ token: Tokens.List,
+ ): string {
+ const tag = token.ordered ? "ol" : "ul";
+ const items = token.items
+ .map((item) => {
+ let content = "";
+ for (const tok of item.tokens) {
+ if (tok.type === "paragraph" && "tokens" in tok && tok.tokens) {
+ content += parser.parseInline(tok.tokens as Tokens.Generic[]);
+ } else if (tok.type === "text") {
+ const textToken = tok as Tokens.Text;
+ if (textToken.tokens && textToken.tokens.length > 0) {
+ content += parser.parseInline(textToken.tokens);
+ } else {
+ const inlineTokens = marked.lexer(
+ textToken.raw || textToken.text,
+ { gfm: true },
+ );
+ if (
+ inlineTokens.length > 0 &&
+ inlineTokens[0].type === "paragraph" &&
+ "tokens" in inlineTokens[0]
+ ) {
+ content += parser.parseInline(
+ (inlineTokens[0] as Tokens.Paragraph).tokens,
+ );
+ } else {
+ content += textToken.text || "";
+ }
+ }
+ } else if (tok.type === "list") {
+ content += renderList(parser, tok as Tokens.List);
+ } else {
+ content += parser.parse([tok as Tokens.Generic]);
+ }
+ }
+ return `<li>${content}</li>`;
+ })
+ .join("");
+ return `<${tag} class="readme-list">${items}</${tag}>`;
+ }
+
+ return renderList(this.parser, token);
+ },
+
+ paragraph(this: RendererThis, token: Tokens.Paragraph): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<p class="readme-p">${text}</p>`;
+ },
+
+ table(this: RendererThis, token: Tokens.Table): string {
+ const headerCells = token.header
+ .map((h) => {
+ const text = this.parser.parseInline(h.tokens as Tokens.Generic[]);
+ return `<th>${text}</th>`;
+ })
+ .join("");
+ const bodyRows = token.rows
+ .map((row) => {
+ const cells = row
+ .map((cell) => {
+ const text = this.parser.parseInline(
+ cell.tokens as Tokens.Generic[],
+ );
+ return `<td>${text}</td>`;
+ })
+ .join("");
+ return `<tr>${cells}</tr>`;
+ })
+ .join("");
+ return `<table class="readme-table"><thead><tr>${headerCells}</tr></thead><tbody>${bodyRows}</tbody></table>`;
+ },
+
+ blockquote(this: RendererThis, token: Tokens.Blockquote): string {
+ const text = this.parser.parse(token.tokens);
+ return `<blockquote class="readme-blockquote">${text}</blockquote>`;
+ },
+
+ hr(): string {
+ return "<hr />";
+ },
+
+ strong(this: RendererThis, token: Tokens.Strong): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<strong>${text}</strong>`;
+ },
+
+ em(this: RendererThis, token: Tokens.Em): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<em>${text}</em>`;
+ },
+
+ del(this: RendererThis, token: Tokens.Del): string {
+ const text = this.parser.parseInline(token.tokens);
+ return `<del>${text}</del>`;
+ },
+
+ text(token: Tokens.Text | Tokens.Escape): string {
+ return token.text;
+ },
+};
+
+marked.use({ renderer });
+
+marked.setOptions({
+ gfm: true,
+ breaks: true,
+});
diff --git a/web/src/lib/schemas/blog.ts b/web/src/lib/schemas/blog.ts
@@ -0,0 +1,61 @@
+import type Blog from "../types/blog";
+import personSchema from "./person";
+import { URL } from "../../constants/website";
+
+export function getSchemaForBlog(blog: Blog) {
+ const schema: Record<string, unknown> = {
+ "@context": "https://schema.org",
+ "@type": "BlogPosting",
+ headline: blog.title,
+ description: blog.description,
+ datePublished: blog.date,
+ dateModified: blog.modifiedDate || blog.date,
+ url: `${URL}/blog/${blog.id}`,
+ author: personSchema,
+ publisher: personSchema,
+ mainEntityOfPage: {
+ "@type": "WebPage",
+ "@id": `${URL}/blog/${blog.id}`,
+ },
+ articleSection: "Technology",
+ };
+
+ if (blog.image) {
+ schema.image = blog.image.startsWith("http")
+ ? blog.image
+ : `${URL}${blog.image}`;
+ }
+
+ if (blog.tags && blog.tags.length > 0) {
+ schema.keywords = blog.tags.join(", ");
+ }
+
+ return schema;
+}
+
+export function getBreadcrumbSchema(blog: Blog) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: URL,
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Blog",
+ item: `${URL}/#blog`,
+ },
+ {
+ "@type": "ListItem",
+ position: 3,
+ name: blog.title,
+ item: `${URL}/blog/${blog.id}`,
+ },
+ ],
+ };
+}
diff --git a/web/src/lib/schemas/experience.ts b/web/src/lib/schemas/experience.ts
@@ -0,0 +1,54 @@
+import type Experience from "../types/experience";
+import personSchema from "./person";
+import { URL } from "../../constants/website";
+
+export function getSchemaForExperience(experience: Experience) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "Person",
+ name: personSchema.name,
+ url: personSchema.url,
+ worksFor: {
+ "@type": "Organization",
+ name: experience.company,
+ url: experience.url,
+ },
+ hasOccupation: {
+ "@type": "Occupation",
+ name: experience.role,
+ startDate: experience.startDate,
+ ...(experience.endDate && { endDate: experience.endDate }),
+ occupationLocation: {
+ "@type": "City",
+ name: "Remote",
+ },
+ },
+ };
+}
+
+export function getBreadcrumbSchema(experience: Experience) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: URL,
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Experience",
+ item: `${URL}/#experience`,
+ },
+ {
+ "@type": "ListItem",
+ position: 3,
+ name: experience.company,
+ item: `${URL}/experience/${experience.id}`,
+ },
+ ],
+ };
+}
diff --git a/web/src/lib/schemas/person.ts b/web/src/lib/schemas/person.ts
@@ -0,0 +1,24 @@
+import about from "../../../config/about.json";
+import currentJob from "../utils/job";
+import contact from "../../../config/contact.json";
+import { URL } from "../../constants/website";
+
+export default {
+ "@context": "https://schema.org",
+ "@type": "Person",
+ name: about.name,
+ alternateName: about.handle,
+ email: contact.email,
+ sameAs: [contact.gitlab, contact.linkedin],
+ url: URL,
+ image: `${URL}/me.jpg`,
+ ...(currentJob && {
+ jobTitle: currentJob.role,
+ worksFor: {
+ "@type": "Organization",
+ name: currentJob.company,
+ url: currentJob.url,
+ },
+ }),
+ knowsAbout: [...about.interests],
+};
diff --git a/web/src/lib/schemas/project.ts b/web/src/lib/schemas/project.ts
@@ -0,0 +1,45 @@
+import type Project from "../types/project";
+import personSchema from "./person";
+import { URL } from "../../constants/website";
+
+export function getSchemaForProject(project: Project) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "SoftwareSourceCode",
+ name: project.name,
+ description: project.subtitle,
+ url: `${URL}/projects/${project.id}`,
+ codeRepository: project.url,
+ programmingLanguage: project.tech,
+ author: personSchema,
+ ...(project.dateCreated && { dateCreated: project.dateCreated }),
+ ...(project.dateModified && { dateModified: project.dateModified }),
+ };
+}
+
+export function getBreadcrumbSchema(project: Project) {
+ return {
+ "@context": "https://schema.org",
+ "@type": "BreadcrumbList",
+ itemListElement: [
+ {
+ "@type": "ListItem",
+ position: 1,
+ name: "Home",
+ item: URL,
+ },
+ {
+ "@type": "ListItem",
+ position: 2,
+ name: "Projects",
+ item: `${URL}/#projects`,
+ },
+ {
+ "@type": "ListItem",
+ position: 3,
+ name: project.name,
+ item: `${URL}/projects/${project.id}`,
+ },
+ ],
+ };
+}
diff --git a/web/src/lib/schemas/website.ts b/web/src/lib/schemas/website.ts
@@ -0,0 +1,13 @@
+import about from "../../../config/about.json";
+import { URL } from "../../constants/website";
+import currentJob from "../utils/job";
+import personSchema from "./person";
+
+export default {
+ "@context": "https://schema.org",
+ "@type": "WebSite",
+ name: about.name,
+ url: URL,
+ description: `Portfolio and blog of ${about.name}, a ${about.profession.toLowerCase()}${currentJob?.company ? ` at ${currentJob.company}` : ""}. ${about.bio}.`,
+ author: personSchema,
+};
diff --git a/web/src/lib/types/about.ts b/web/src/lib/types/about.ts
@@ -0,0 +1,11 @@
+export default interface About {
+ name: string;
+ handle: string;
+ bio: string;
+ location: string;
+ school?: string;
+ graduating?: string;
+ languages: string[];
+ interests: string[];
+ tools: string[];
+}
diff --git a/web/src/lib/types/blog.ts b/web/src/lib/types/blog.ts
@@ -0,0 +1,11 @@
+export default interface Blog {
+ id: string;
+ title: string;
+ description: string;
+ date: string;
+ modifiedDate?: string;
+ content?: string;
+ url?: string;
+ image?: string;
+ tags?: string[];
+}
diff --git a/web/src/lib/types/contact.ts b/web/src/lib/types/contact.ts
@@ -0,0 +1,5 @@
+export default interface Contact {
+ email: string;
+ gitlab: string;
+ linkedin: string;
+}
diff --git a/web/src/lib/types/experience.ts b/web/src/lib/types/experience.ts
@@ -0,0 +1,13 @@
+export default interface Experience {
+ id: string;
+ company: string;
+ role: string;
+ startDate: string;
+ endDate?: string;
+ description: string[];
+ tech: string[];
+ url: string;
+ logo: string;
+ logoFilter?: string;
+ images?: string[];
+}
diff --git a/web/src/lib/types/project.ts b/web/src/lib/types/project.ts
@@ -0,0 +1,9 @@
+export default interface Project {
+ id: string;
+ name: string;
+ subtitle: string;
+ tech: string[];
+ url: string;
+ dateCreated?: string;
+ dateModified?: string;
+}
diff --git a/web/src/lib/utils/duration.ts b/web/src/lib/utils/duration.ts
@@ -0,0 +1,11 @@
+export function formatDuration(seconds: number): string {
+ const hours = Math.floor(seconds / 3600);
+ const minutes = Math.floor((seconds % 3600) / 60);
+
+ if (hours > 0) {
+ return `${hours}h ${minutes}m`;
+ } else if (minutes > 0) {
+ return `${minutes}m`;
+ }
+ return "0m";
+}
diff --git a/web/src/lib/utils/job.ts b/web/src/lib/utils/job.ts
@@ -0,0 +1,8 @@
+import rawExperiences from "../../../config/experience.json";
+import type Experience from "../types/experience";
+
+const experiences = rawExperiences as Experience[];
+
+const currentJob = experiences.find((exp) => !exp.endDate) || null;
+
+export default currentJob;
diff --git a/web/src/lib/utils/period.ts b/web/src/lib/utils/period.ts
@@ -0,0 +1,37 @@
+export function formatPeriod(startDate: string, endDate?: string): string {
+ const months = [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec",
+ ];
+ const [startYear, startMonth] = startDate.split("-").map(Number);
+ const startStr = `${months[startMonth - 1]} ${startYear}`;
+
+ if (!endDate) {
+ const totalMonths = calculateMonths(startDate);
+ return `${startStr} – Present (${totalMonths} mos)`;
+ }
+
+ const [endYear, endMonth] = endDate.split("-").map(Number);
+ const endStr = `${months[endMonth - 1]} ${endYear}`;
+ const totalMonths = calculateMonths(startDate, endDate);
+ return `${startStr} – ${endStr} (${totalMonths} mos)`;
+}
+
+export function calculateMonths(startDate: string, endDate?: string): number {
+ const [startYear, startMonth] = startDate.split("-").map(Number);
+ const end = endDate
+ ? endDate.split("-").map(Number)
+ : [new Date().getFullYear(), new Date().getMonth() + 1];
+ const [endYear, endMonth] = end;
+ return (endYear - startYear) * 12 + (endMonth - startMonth) + 1;
+}
diff --git a/web/src/lib/utils/tags.ts b/web/src/lib/utils/tags.ts
@@ -0,0 +1,12 @@
+import { TAG_CLASS_MAP, TECH_ABBREVIATIONS } from "../../constants/tags";
+
+export function getTagClass(tag: string): string {
+ return TAG_CLASS_MAP[tag] || "";
+}
+
+export function getTechMeta(tech: string[]): string {
+ return tech
+ .slice(0, 2)
+ .map((t) => TECH_ABBREVIATIONS[t] || t)
+ .join(", ");
+}
diff --git a/web/src/lib/wakatime.ts b/web/src/lib/wakatime.ts
@@ -0,0 +1,159 @@
+import { DAY_NAMES, MONTH_NAMES } from "../constants/calendar";
+import { formatDuration } from "./utils/duration";
+
+const WAKATIME_API_BASE = "https://wakatime.com/api/v1";
+
+const WAKATIME_API_KEY = import.meta.env.WAKATIME_API_KEY;
+
+export interface WakaTimeData {
+ allTimeStats: AllTimeStats | null;
+ weeklyStats: WeeklyStats | null;
+}
+
+export async function fetchWakaTimeData(): Promise<WakaTimeData | null> {
+ if (!WAKATIME_API_KEY) {
+ return null;
+ }
+
+ try {
+ const [allTimeStats, weeklyStats] = await Promise.all([
+ fetchAllTimeStats(),
+ fetchWeeklyStats(),
+ ]);
+
+ return { allTimeStats, weeklyStats };
+ } catch (error) {
+ console.error("Failed to fetch WakaTime data:", error);
+ return null;
+ }
+}
+
+export interface AllTimeStats {
+ totalText: string;
+ dailyAverageText: string;
+}
+
+export async function fetchAllTimeStats(): Promise<AllTimeStats | null> {
+ try {
+ const [statsResponse, languagesResponse] = [
+ await fetch(`${WAKATIME_API_BASE}/users/current/all_time_since_today`, {
+ headers: {
+ Authorization: `Basic ${Buffer.from(WAKATIME_API_KEY).toString("base64")}`,
+ },
+ }),
+ await fetch(`${WAKATIME_API_BASE}/users/current/stats/last_year`, {
+ headers: {
+ Authorization: `Basic ${Buffer.from(WAKATIME_API_KEY).toString("base64")}`,
+ },
+ }),
+ ];
+ if ([statsResponse, languagesResponse].some((r) => !r.ok)) {
+ return null;
+ }
+
+ const [statsData, langData] = await Promise.all(
+ [statsResponse, languagesResponse].map((r) => r.json()),
+ );
+
+ let dailyAverageText = "1 hr";
+ if (langData.data?.daily_average_including_other_language) {
+ const avgSeconds = langData.data.daily_average_including_other_language;
+ dailyAverageText = formatDuration(avgSeconds);
+ }
+
+ const totalSeconds = statsData.data?.total_seconds || 0;
+ const totalHours = Math.floor(totalSeconds / 3600);
+ const totalText = `${totalHours.toLocaleString()}+ hrs coded`;
+
+ return {
+ totalText,
+ dailyAverageText,
+ };
+ } catch (error) {
+ console.error("Failed to fetch WakaTime stats:", error);
+ return null;
+ }
+}
+
+export interface WeeklyStats {
+ totalText: string;
+ days: DailyEntry[];
+}
+
+export interface DailyEntry {
+ dayText: string; // e.g., "Mon", "Tue"
+ dateText: string; // e.g., "Jan 10"
+ timeText: string; // e.g., "2 hrs 30 mins"
+ barWidthPercent: string; // e.g., "75%"
+}
+
+export async function fetchWeeklyStats(): Promise<WeeklyStats | null> {
+ try {
+ const start = new Date();
+ start.setDate(start.getDate() - 6); // 7 days including today
+ const end = new Date();
+
+ const formatDate = (d: Date) => d.toISOString().split("T")[0];
+
+ const response = await fetch(
+ `${WAKATIME_API_BASE}/users/current/summaries?start=${formatDate(start)}&end=${formatDate(end)}`,
+ {
+ headers: {
+ Authorization: `Basic ${Buffer.from(WAKATIME_API_KEY).toString("base64")}`,
+ },
+ },
+ );
+
+ if (!response.ok) {
+ console.error("WakaTime weekly stats error:", response.status);
+ return null;
+ }
+
+ const { data } = await response.json();
+
+ let totalSeconds = 0;
+ let maxMinutes = 0;
+
+ const minutesPerDay: number[] = [];
+ const days: DailyEntry[] = (data || []).map(
+ (
+ {
+ range,
+ grand_total,
+ }: {
+ range: { date: string };
+ grand_total: { total_seconds?: number };
+ },
+ i: number,
+ ) => {
+ const date = new Date(range.date);
+ const dayText = DAY_NAMES[date.getUTCDay()].slice(0, 3);
+ const dateText = `${MONTH_NAMES[date.getUTCMonth()].slice(0, 3)} ${date.getUTCDate()}`;
+
+ const seconds = grand_total?.total_seconds || 0;
+ totalSeconds += seconds;
+
+ const totalMinutes = Math.floor(seconds / 60);
+ minutesPerDay[i] = totalMinutes;
+ if (totalMinutes > maxMinutes) maxMinutes = totalMinutes;
+
+ const timeText = formatDuration(seconds);
+
+ return { dayText, dateText, timeText, barWidthPercent: "0%" };
+ },
+ );
+
+ const effectiveMax = maxMinutes || 1;
+ for (let i = 0; i < days.length; i++) {
+ days[i].barWidthPercent =
+ `${Math.round((minutesPerDay[i] / effectiveMax) * 100)}%`;
+ }
+
+ const totalText = formatDuration(totalSeconds);
+
+ return { totalText, days };
+ } catch (error) {
+ console.error("Failed to fetch weekly stats:", error);
+ return null;
+ }
+}
diff --git a/web/src/pages/404.astro b/web/src/pages/404.astro
@@ -0,0 +1,78 @@
+---
+import Layout from "../layouts/Layout.astro";
+import about from "../../config/about.json";
+import { URL } from "../constants/website";
+---
+
+<Layout
+ title={`404 - Page Not Found | ${about.name}`}
+ description="The page you're looking for doesn't exist."
+ type="website"
+ url={`${URL}/404`}
+>
+ <main class="error-page">
+ <div class="error-content">
+ <h1>404</h1>
+ <p class="error-message">Page not found</p>
+ <p class="error-description">
+ The page you're looking for doesn't exist or has been moved.
+ </p>
+ <a href="/" class="home-link">← Return home</a>
+ </div>
+ </main>
+</Layout>
+
+<style>
+ .error-page {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 100vh;
+ padding: 24px;
+ }
+
+ .error-content {
+ text-align: center;
+ }
+
+ h1 {
+ font-size: 72px;
+ font-weight: 400;
+ color: var(--accent);
+ margin-bottom: 8px;
+ }
+
+ .error-message {
+ font-size: 24px;
+ color: var(--fg);
+ margin-bottom: 16px;
+ }
+
+ .error-description {
+ color: var(--fg-dim);
+ margin-bottom: 32px;
+ }
+
+ .home-link {
+ display: inline-block;
+ color: var(--light-blue);
+ padding: 8px 16px;
+ border: 1px solid var(--border);
+ transition: border-color 0.2s;
+ }
+
+ .home-link:hover {
+ border-color: var(--light-blue);
+ opacity: 1;
+ }
+
+ @media (max-width: 768px) {
+ h1 {
+ font-size: 48px;
+ }
+
+ .error-message {
+ font-size: 18px;
+ }
+ }
+</style>
diff --git a/web/src/pages/blog/[slug].astro b/web/src/pages/blog/[slug].astro
@@ -0,0 +1,77 @@
+---
+import Layout from "../../layouts/Layout.astro";
+import BlogArticle from "../../components/Article.astro";
+import blogs from "../../lib/blogs";
+import { getSchemaForBlog, getBreadcrumbSchema } from "../../lib/schemas/blog";
+
+const blog = blogs.find((blog) => blog.id === Astro.params.slug);
+if (!blog) {
+ return new Response(null, {
+ status: 404,
+ statusText: "Not Found",
+ });
+}
+
+const keywords = blog.tags?.join(", ");
+---
+
+<Layout
+ title={`${blog.title} | Damian Myrda`}
+ description={blog.description}
+ type="article"
+ url={`https://prime8.dev/blog/${blog.id}`}
+ publishedTime={blog.date}
+ modifiedTime={blog.modifiedDate || blog.date}
+ keywords={keywords}
+ image={blog.image}
+>
+ <main id="content">
+ <div class="blog-page">
+ <BlogArticle blog={blog} />
+ </div>
+ <div id="blog-data" data-blog-id={blog.id}></div>
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getSchemaForBlog(blog))}
+ />
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getBreadcrumbSchema(blog))}
+ />
+ </main>
+</Layout>
+
+<script>
+ document.getElementById("app")?.classList.add("ready");
+</script>
+
+<style>
+ :global(body) {
+ overflow: auto;
+ }
+
+ :global(#app) {
+ height: auto;
+ min-height: 100vh;
+ }
+
+ :global(#content) {
+ overflow: visible;
+ }
+
+ .blog-page {
+ max-width: 720px;
+ margin: 0 auto;
+ padding: 40px 24px;
+ min-height: 100vh;
+ }
+</style>
+
+<script>
+ import { setCurrentBlogId } from "../../scripts/ui/state";
+
+ document.addEventListener("DOMContentLoaded", () => {
+ const blogId = document.getElementById("blog-data")?.dataset.blogId;
+ if (blogId) setCurrentBlogId(blogId);
+ });
+</script>
diff --git a/web/src/pages/experience/[id].astro b/web/src/pages/experience/[id].astro
@@ -0,0 +1,309 @@
+---
+import Layout from "../../layouts/Layout.astro";
+import rawExperience from "../../../config/experience.json";
+import type Experience from "../../lib/types/experience";
+import { URL } from "../../constants/website";
+import { getTagClass } from "../../lib/utils/tags";
+import {
+ getSchemaForExperience,
+ getBreadcrumbSchema,
+} from "../../lib/schemas/experience";
+
+const experiences = rawExperience as Experience[];
+const experience = experiences.find((e) => e.id === Astro.params.id);
+
+if (!experience) {
+ return new Response(null, {
+ status: 404,
+ statusText: "Not Found",
+ });
+}
+
+function formatDate(dateStr: string): string {
+ const [year, month] = dateStr.split("-");
+ const date = new Date(parseInt(year), parseInt(month) - 1);
+ return date.toLocaleDateString("en-US", { month: "short", year: "numeric" });
+}
+
+const dateRange = experience.endDate
+ ? `${formatDate(experience.startDate)} - ${formatDate(experience.endDate)}`
+ : `${formatDate(experience.startDate)} - Present`;
+
+const keywords = [...experience.tech, experience.company, experience.role].join(
+ ", ",
+);
+const description = `${experience.role} at ${experience.company}. ${experience.description[0]}`;
+---
+
+<Layout
+ title={`${experience.company} - ${experience.role} | Damian Myrda`}
+ description={description}
+ type="website"
+ url={`${URL}/experience/${experience.id}`}
+ keywords={keywords}
+ image={experience.logo}
+>
+ <main id="content">
+ <div class="experience-page">
+ <a href="/#experience" class="back-btn">← Back to experience</a>
+
+ <header class="experience-header">
+ <div class="header-top">
+ <div class="company-info">
+ {
+ experience.logo && (
+ <img
+ src={experience.logo}
+ alt={`${experience.company} logo`}
+ class={`company-logo ${experience.logoFilter || ""}`}
+ width="48"
+ height="48"
+ />
+ )
+ }
+ <div>
+ <h1>{experience.company}</h1>
+ <p class="role">{experience.role}</p>
+ </div>
+ </div>
+ <a
+ class="external-link"
+ href={experience.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ Visit website →
+ </a>
+ </div>
+ <time class="date-range" datetime={experience.startDate}
+ >{dateRange}</time
+ >
+ </header>
+
+ <section class="description">
+ {experience.description.map((paragraph) => <p>{paragraph}</p>)}
+ </section>
+
+ <section class="tech-section">
+ <h2>Technologies</h2>
+ <div class="tech-stack">
+ {
+ experience.tech.map((tech) => (
+ <span class={`tag ${getTagClass(tech)}`}>{tech}</span>
+ ))
+ }
+ </div>
+ </section>
+
+ {
+ experience.images && experience.images.length > 0 && (
+ <section class="images-section">
+ <h2>Photos</h2>
+ <div class="image-grid">
+ {experience.images.map((img, i) => (
+ <img
+ src={img}
+ alt={`${experience.company} photo ${i + 1}`}
+ class="experience-image"
+ loading="lazy"
+ />
+ ))}
+ </div>
+ </section>
+ )
+ }
+ </div>
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getSchemaForExperience(experience))}
+ />
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getBreadcrumbSchema(experience))}
+ />
+ </main>
+</Layout>
+
+<script>
+ document.getElementById("app")?.classList.add("ready");
+</script>
+
+<style>
+ :global(body) {
+ overflow: auto;
+ }
+
+ :global(#app) {
+ height: auto;
+ min-height: 100vh;
+ }
+
+ :global(#content) {
+ overflow: visible;
+ }
+
+ .experience-page {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 40px 24px;
+ min-height: 100vh;
+ }
+
+ .back-btn {
+ display: inline-block;
+ background: transparent;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ padding: 8px 16px;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 12px;
+ margin-bottom: 24px;
+ transition: all 0.15s;
+ text-decoration: none;
+ }
+
+ .back-btn:hover {
+ background: var(--bg-alt);
+ color: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .experience-header {
+ margin-bottom: 32px;
+ padding-bottom: 24px;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .header-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 12px;
+ }
+
+ .company-info {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ }
+
+ .company-logo {
+ width: 48px;
+ height: 48px;
+ object-fit: contain;
+ }
+
+ .company-logo.logo-invert {
+ filter: invert(1);
+ }
+
+ .experience-header h1 {
+ font-size: 28px;
+ font-weight: 500;
+ color: var(--accent);
+ margin: 0;
+ }
+
+ .role {
+ color: var(--fg);
+ font-size: 16px;
+ margin: 4px 0 0 0;
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 14px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ .date-range {
+ color: var(--fg-dim);
+ font-size: 14px;
+ }
+
+ .description {
+ margin-bottom: 32px;
+ }
+
+ .description p {
+ color: var(--fg);
+ font-size: 14px;
+ line-height: 1.7;
+ margin-bottom: 12px;
+ }
+
+ .description p:last-child {
+ margin-bottom: 0;
+ }
+
+ .tech-section {
+ margin-bottom: 32px;
+ }
+
+ .tech-section h2,
+ .images-section h2 {
+ font-size: 16px;
+ color: var(--accent);
+ margin-bottom: 12px;
+ font-weight: 500;
+ }
+
+ .tech-stack {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ }
+
+ .images-section {
+ margin-bottom: 32px;
+ }
+
+ .image-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 16px;
+ }
+
+ .experience-image {
+ width: 100%;
+ height: auto;
+ border-radius: 4px;
+ border: 1px solid var(--border);
+ cursor: pointer;
+ transition: transform 0.15s;
+ }
+
+ .experience-image:hover {
+ transform: scale(1.02);
+ }
+
+ @media (max-width: 768px) {
+ .experience-page {
+ padding: 24px 16px;
+ }
+
+ .header-top {
+ flex-direction: column;
+ gap: 16px;
+ }
+
+ .company-info {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 12px;
+ }
+
+ .experience-header h1 {
+ font-size: 22px;
+ }
+
+ .image-grid {
+ grid-template-columns: 1fr;
+ }
+ }
+</style>
diff --git a/web/src/pages/index.astro b/web/src/pages/index.astro
@@ -0,0 +1,63 @@
+---
+import Layout from "../layouts/Layout.astro";
+import { fetchWakaTimeData } from "../lib/wakatime";
+import { fetchAllReadmes } from "../lib/readme/fetch";
+
+import about from "../../config/about.json";
+import currentJob from "../lib/utils/job";
+import personSchema from "../lib/schemas/person";
+import websiteSchema from "../lib/schemas/website";
+import { URL } from "../constants/website";
+
+import Header from "../components/Header.astro";
+import AboutPage from "../components/pages/About.astro";
+import ExperiencePage from "../components/pages/Experience.astro";
+import ProjectsPage from "../components/pages/Projects.astro";
+import BlogPage from "../components/pages/Blog.astro";
+import Footer from "../components/Footer.astro";
+
+const [wakaTimeData, readmes] = await Promise.all([
+ fetchWakaTimeData(),
+ fetchAllReadmes(),
+]);
+---
+
+<Layout
+ title={`${about.name} | ${about.profession_short}`}
+ description={`${about.name} - ${about.profession}${currentJob?.company ? ` at ${currentJob.company}` : ""}`}
+ type="website"
+ url={URL}
+ keywords={[
+ about.name,
+ about.profession,
+ currentJob?.company,
+ about.languages,
+ about.interests,
+ about.school,
+ ]
+ .flat()
+ .filter(Boolean)
+ .join(", ")}
+>
+ <Header />
+
+ <main id="content">
+ <AboutPage wakaTimeData={wakaTimeData} />
+ <ExperiencePage />
+ <ProjectsPage readmes={readmes} />
+ <BlogPage isStandalone={false} />
+ </main>
+
+ <Footer wakaTimeData={wakaTimeData} />
+
+ <script type="application/ld+json" set:html={JSON.stringify(personSchema)} />
+ <script type="application/ld+json" set:html={JSON.stringify(websiteSchema)} />
+</Layout>
+
+<script>
+ import { initUI } from "../scripts/ui/index";
+
+ document.addEventListener("DOMContentLoaded", () => {
+ initUI();
+ });
+</script>
diff --git a/web/src/pages/projects/[id].astro b/web/src/pages/projects/[id].astro
@@ -0,0 +1,275 @@
+---
+import Layout from "../../layouts/Layout.astro";
+import rawProjects from "../../../config/projects.json";
+import type Project from "../../lib/types/project";
+import { URL } from "../../constants/website";
+import { getTagClass } from "../../lib/utils/tags";
+import { fetchReadmeForProject } from "../../lib/readme/fetch";
+import {
+ getSchemaForProject,
+ getBreadcrumbSchema,
+} from "../../lib/schemas/project";
+
+const projects = rawProjects as Project[];
+const project = projects.find((p) => p.id === Astro.params.id);
+
+if (!project) {
+ return new Response(null, {
+ status: 404,
+ statusText: "Not Found",
+ });
+}
+
+const readme = await fetchReadmeForProject(project.id);
+const keywords = project.tech.join(", ");
+---
+
+<Layout
+ title={`${project.name} | Damian Myrda`}
+ description={project.subtitle}
+ type="website"
+ url={`${URL}/projects/${project.id}`}
+ keywords={keywords}
+>
+ <main id="content">
+ <div class="project-page">
+ <a href="/#projects" class="back-btn">← Back to projects</a>
+
+ <header class="project-header">
+ <div class="header-top">
+ <h1>{project.name}</h1>
+ <a
+ class="external-link"
+ href={project.url}
+ target="_blank"
+ rel="noopener noreferrer"
+ >
+ {project.url.includes("github.com") ? "GitHub" : "GitLab"} →
+ </a>
+ </div>
+ <p class="subtitle">{project.subtitle}</p>
+ <div class="tech-stack">
+ {
+ project.tech.map((tech) => (
+ <span class={`tag ${getTagClass(tech)}`}>{tech}</span>
+ ))
+ }
+ </div>
+ </header>
+
+ <div class="readme-content">
+ {
+ readme ? (
+ <Fragment set:html={readme} />
+ ) : (
+ <p class="color-dim">README not available</p>
+ )
+ }
+ </div>
+ </div>
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getSchemaForProject(project))}
+ />
+ <script
+ type="application/ld+json"
+ set:html={JSON.stringify(getBreadcrumbSchema(project))}
+ />
+ </main>
+</Layout>
+
+<script>
+ document.getElementById("app")?.classList.add("ready");
+</script>
+
+<style>
+ :global(body) {
+ overflow: auto;
+ }
+
+ :global(#app) {
+ height: auto;
+ min-height: 100vh;
+ }
+
+ :global(#content) {
+ overflow: visible;
+ }
+
+ .project-page {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 40px 24px;
+ min-height: 100vh;
+ }
+
+ .back-btn {
+ display: inline-block;
+ background: transparent;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ padding: 8px 16px;
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 12px;
+ margin-bottom: 24px;
+ transition: all 0.15s;
+ text-decoration: none;
+ }
+
+ .back-btn:hover {
+ background: var(--bg-alt);
+ color: var(--accent);
+ border-color: var(--accent);
+ }
+
+ .project-header {
+ margin-bottom: 32px;
+ padding-bottom: 24px;
+ border-bottom: 1px solid var(--border);
+ }
+
+ .header-top {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 8px;
+ }
+
+ .project-header h1 {
+ font-size: 28px;
+ font-weight: 500;
+ color: var(--accent);
+ margin: 0;
+ }
+
+ .external-link {
+ color: var(--light-blue);
+ text-decoration: none;
+ font-size: 14px;
+ }
+
+ .external-link:hover {
+ opacity: 0.8;
+ }
+
+ .subtitle {
+ color: var(--fg-dim);
+ font-size: 14px;
+ margin-bottom: 16px;
+ }
+
+ .tech-stack {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ }
+
+ .readme-content {
+ font-size: 14px;
+ line-height: 1.7;
+ color: var(--fg);
+ }
+
+ .readme-content :global(p) {
+ margin-bottom: 16px;
+ }
+
+ .readme-content :global(h2),
+ .readme-content :global(.readme-h1) {
+ font-size: 20px;
+ color: var(--accent);
+ margin: 32px 0 12px;
+ font-weight: 600;
+ }
+
+ .readme-content :global(h2:first-child),
+ .readme-content :global(.readme-h1:first-child) {
+ margin-top: 0;
+ }
+
+ .readme-content :global(h3),
+ .readme-content :global(.readme-h2) {
+ font-size: 17px;
+ color: var(--accent);
+ margin: 24px 0 10px;
+ font-weight: 500;
+ }
+
+ .readme-content :global(pre) {
+ display: block;
+ background: var(--bg-alt);
+ border: 1px solid var(--border);
+ padding: 16px;
+ margin: 16px 0;
+ overflow-x: auto;
+ font-size: 13px;
+ line-height: 1.5;
+ }
+
+ .readme-content :global(pre code) {
+ background: none;
+ padding: 0;
+ font-size: inherit;
+ }
+
+ .readme-content :global(code) {
+ background: var(--bg-alt);
+ padding: 2px 6px;
+ font-size: 13px;
+ border-radius: 2px;
+ }
+
+ .readme-content :global(a) {
+ color: var(--light-blue);
+ text-decoration: none;
+ }
+
+ .readme-content :global(a:hover) {
+ opacity: 0.8;
+ }
+
+ .readme-content :global(ul),
+ .readme-content :global(ol) {
+ margin: 12px 0;
+ padding-left: 24px;
+ }
+
+ .readme-content :global(li) {
+ margin-bottom: 8px;
+ }
+
+ .readme-content :global(blockquote) {
+ border-left: 3px solid var(--accent);
+ margin: 16px 0;
+ padding: 12px 20px;
+ color: var(--fg-dim);
+ background: var(--bg-alt);
+ }
+
+ .readme-content :global(img) {
+ max-width: 100%;
+ height: auto;
+ margin: 16px 0;
+ }
+
+ @media (max-width: 768px) {
+ .project-page {
+ padding: 24px 16px;
+ }
+
+ .header-top {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 12px;
+ }
+
+ .project-header h1 {
+ font-size: 22px;
+ }
+
+ .readme-content {
+ font-size: 13px;
+ }
+ }
+</style>
diff --git a/web/src/pages/sitemap.xml.ts b/web/src/pages/sitemap.xml.ts
@@ -0,0 +1,70 @@
+import type { APIRoute } from "astro";
+import blogs from "../lib/blogs";
+import rawProjects from "../../config/projects.json";
+import rawExperience from "../../config/experience.json";
+import type Project from "../lib/types/project";
+import type Experience from "../lib/types/experience";
+
+const projects = rawProjects as Project[];
+const experiences = rawExperience as Experience[];
+const siteUrl = "https://prime8.dev";
+
+export const GET: APIRoute = () => {
+ const now = new Date().toISOString().split("T")[0];
+
+ // Static pages
+ const staticPages = [
+ { url: "/", changefreq: "weekly", priority: "1.0", lastmod: now },
+ ];
+
+ // Project pages
+ const projectPages = projects.map((project) => ({
+ url: `/projects/${project.id}`,
+ changefreq: "monthly",
+ priority: "0.7",
+ lastmod: project.dateModified || project.dateCreated || now,
+ }));
+
+ // Experience pages
+ const experiencePages = experiences.map((experience) => ({
+ url: `/experience/${experience.id}`,
+ changefreq: "monthly",
+ priority: "0.7",
+ lastmod: experience.endDate || experience.startDate || now,
+ }));
+
+ // Blog posts
+ const blogPages = blogs.map((blog) => ({
+ url: `/blog/${blog.id}`,
+ changefreq: "monthly",
+ priority: "0.8",
+ lastmod: blog.date,
+ }));
+
+ const allPages = [
+ ...staticPages,
+ ...projectPages,
+ ...experiencePages,
+ ...blogPages,
+ ];
+
+ const sitemap = `<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+${allPages
+ .map(
+ (page) => ` <url>
+ <loc>${siteUrl}${page.url}</loc>
+ <lastmod>${page.lastmod || now}</lastmod>
+ <changefreq>${page.changefreq}</changefreq>
+ <priority>${page.priority}</priority>
+ </url>`,
+ )
+ .join("\n")}
+</urlset>`;
+
+ return new Response(sitemap, {
+ headers: {
+ "Content-Type": "application/xml",
+ },
+ });
+};
diff --git a/web/src/scripts/ui/blog.ts b/web/src/scripts/ui/blog.ts
@@ -0,0 +1,58 @@
+import { selectedIndex, setCurrentBlogId } from "./state";
+import { updateUrl } from "./url";
+
+export function setupBlogNavigation(): void {
+ document.querySelectorAll("#blog .blog-list-item").forEach((item) => {
+ item.addEventListener("click", () => {
+ const blogId = item.getAttribute("data-id");
+ if (blogId) {
+ const index = parseInt(item.getAttribute("data-index") || "0");
+ selectedIndex.blog = index;
+
+ document.querySelectorAll("#blog .blog-list-item").forEach((li, i) => {
+ li.classList.toggle("selected", i === index);
+ });
+
+ openBlogPost(blogId);
+ }
+ });
+ });
+
+ const listItems = document.querySelectorAll("#blog .blog-list-item");
+ if (listItems.length > 0) {
+ listItems[0].classList.add("selected");
+ }
+}
+
+export function openBlogPost(blogId: string): void {
+ setCurrentBlogId(blogId);
+
+ const listView = document.getElementById("blog-list-view");
+ const postView = document.getElementById("blog-post-view");
+
+ if (listView && postView) {
+ listView.classList.add("hidden");
+ postView.classList.remove("hidden");
+
+ document.querySelectorAll(".blog-post").forEach((post) => {
+ post.classList.toggle(
+ "hidden",
+ post.getAttribute("data-blog-id") !== blogId,
+ );
+ });
+ }
+
+ updateUrl();
+}
+
+export function closeBlogPost(): void {
+ setCurrentBlogId(null);
+
+ const listView = document.getElementById("blog-list-view");
+ const postView = document.getElementById("blog-post-view");
+
+ if (listView && postView) {
+ listView.classList.remove("hidden");
+ postView.classList.add("hidden");
+ }
+}
diff --git a/web/src/scripts/ui/boot.ts b/web/src/scripts/ui/boot.ts
@@ -0,0 +1,177 @@
+interface SystemInfo {
+ platform: string;
+ browser: string;
+ screen: string;
+ locale: string;
+ uptime: string;
+ timezone: string;
+}
+
+function getSystemInfo(): SystemInfo {
+ const ua = navigator.userAgent;
+
+ let platform = "Unknown";
+ if (ua.includes("Mac")) platform = "Darwin";
+ else if (ua.includes("Win")) platform = "Windows";
+ else if (ua.includes("Linux")) platform = "Linux";
+ else if (ua.includes("Android")) platform = "Android";
+ else if (ua.includes("iPhone") || ua.includes("iPad")) platform = "iOS";
+
+ let browser = "Unknown";
+ if (ua.includes("Firefox")) browser = "Firefox";
+ else if (ua.includes("Edg")) browser = "Edge";
+ else if (ua.includes("Chrome")) browser = "Chrome";
+ else if (ua.includes("Safari")) browser = "Safari";
+
+ const screen = `${window.screen.width}x${window.screen.height}`;
+ const locale = navigator.language || "en-US";
+
+ const now = new Date();
+ const hours = now.getHours().toString().padStart(2, "0");
+ const minutes = now.getMinutes().toString().padStart(2, "0");
+ const seconds = now.getSeconds().toString().padStart(2, "0");
+ const uptime = `${hours}:${minutes}:${seconds}`;
+
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
+
+ return { platform, browser, screen, locale, uptime, timezone };
+}
+
+function generateNeofetch(sys: SystemInfo): string[] {
+ const logo = [
+ " .--. ",
+ " |o_o | ",
+ " |:_/ | ",
+ " // \\ \\ ",
+ " (| | ) ",
+ " /'\\_ _/`\\ ",
+ " \\___)=(___/ ",
+ ];
+
+ const info = [
+ `<span class="ansi-bold-accent">prime8</span>@<span class="ansi-bold-accent">dev</span>`,
+ '<span class="ansi-dim">──────────────</span>',
+ `<span class="ansi-bold-accent">OS</span>: <span class="ansi-white">${sys.platform}</span>`,
+ `<span class="ansi-bold-accent">Browser</span>: <span class="ansi-white">${sys.browser}</span>`,
+ `<span class="ansi-bold-accent">Resolution</span>: <span class="ansi-white">${sys.screen}</span>`,
+ `<span class="ansi-bold-accent">Time</span>: <span class="ansi-white">${sys.uptime}</span>`,
+ `<span class="ansi-bold-accent">Timezone</span>: <span class="ansi-white">${sys.timezone}</span>`,
+ `<span class="ansi-bold-accent">Locale</span>: <span class="ansi-white">${sys.locale}</span>`,
+ ];
+
+ const lines: string[] = [];
+ const maxLen = Math.max(logo.length, info.length);
+
+ for (let i = 0; i < maxLen; i++) {
+ const left = logo[i] || " ";
+ const right = info[i] || "";
+ lines.push(
+ `<span class="ansi-bold-white">${left.replace(/ /g, " ")}</span> ${right}`,
+ );
+ }
+
+ return lines;
+}
+
+function generateBootMessages(): string[] {
+ const sys = getSystemInfo();
+ const neofetchLines = generateNeofetch(sys);
+
+ return [...neofetchLines];
+}
+
+const CURSOR_CHAR = "█";
+
+function createBootOverlay(): HTMLElement {
+ const overlay = document.createElement("div");
+ overlay.id = "boot-overlay";
+ overlay.innerHTML = `
+ <div class="boot-terminal">
+ <div class="boot-content"></div>
+ <div class="boot-cursor">${CURSOR_CHAR}</div>
+ </div>
+ `;
+ document.body.appendChild(overlay);
+ return overlay;
+}
+
+function sleep(ms: number): Promise<void> {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+async function runBootSequence(overlay: HTMLElement): Promise<void> {
+ const content = overlay.querySelector(".boot-content") as HTMLElement;
+ const cursor = overlay.querySelector(".boot-cursor") as HTMLElement;
+ const messages = generateBootMessages();
+
+ await sleep(200);
+
+ for (let i = 0; i < messages.length; i++) {
+ const line = messages[i];
+ const lineEl = document.createElement("div");
+ lineEl.className = "boot-line boot-line-hidden";
+ lineEl.innerHTML = line || " ";
+ content.appendChild(lineEl);
+
+ await sleep(50);
+ lineEl.classList.remove("boot-line-hidden");
+ lineEl.classList.add("boot-line-visible");
+ }
+
+ await sleep(400);
+
+ const startMsg = document.createElement("div");
+ startMsg.className = "boot-line boot-line-hidden";
+ startMsg.innerHTML =
+ '<br><span class="ansi-bold-green">Starting prime8dev...</span>';
+ content.appendChild(startMsg);
+ await sleep(60);
+ startMsg.classList.remove("boot-line-hidden");
+ startMsg.classList.add("boot-line-visible");
+
+ await sleep(500);
+
+ cursor.style.display = "none";
+
+ const progressBar = document.createElement("div");
+ progressBar.className = "boot-line boot-line-visible";
+ content.appendChild(progressBar);
+
+ const progressWidth = 30;
+ for (let i = 0; i <= progressWidth; i++) {
+ const filled = "=".repeat(i);
+ const arrow = i < progressWidth ? ">" : "=";
+ const empty = " ".repeat(progressWidth - i);
+ progressBar.innerHTML = `<span class="ansi-bold-green">[${filled}${arrow}${empty}]</span> ${Math.round((i / progressWidth) * 100)}%`;
+ await sleep(25);
+ }
+
+ await sleep(250);
+
+ overlay.classList.add("fade-out");
+ await sleep(400);
+
+ overlay.remove();
+}
+
+export async function playBootAnimation(): Promise<void> {
+ const BOOT_KEY = "prime8dev-boot-shown";
+ const app = document.getElementById("app");
+
+ if (sessionStorage.getItem(BOOT_KEY)) {
+ if (app) {
+ app.classList.add("ready");
+ }
+ return;
+ }
+
+ const overlay = createBootOverlay();
+
+ await runBootSequence(overlay);
+
+ sessionStorage.setItem(BOOT_KEY, "1");
+
+ if (app) {
+ app.classList.add("ready", "boot-reveal");
+ }
+}
diff --git a/web/src/scripts/ui/clicks.ts b/web/src/scripts/ui/clicks.ts
@@ -0,0 +1,39 @@
+import { selectedIndex } from "./state";
+import { updateUrl } from "./url";
+import { updateExperienceDetail, updateDetailView } from "./detail";
+
+export function setupTimelineClicks(): void {
+ document.querySelectorAll(".timeline-segment").forEach((segment) => {
+ segment.addEventListener("click", () => {
+ const index = parseInt(segment.getAttribute("data-index") || "0");
+ selectedIndex.experience = index;
+
+ document.querySelectorAll(".timeline-segment").forEach((s) => {
+ s.classList.toggle(
+ "selected",
+ parseInt(s.getAttribute("data-index") || "0") === index,
+ );
+ });
+
+ updateExperienceDetail();
+ updateUrl();
+ });
+ });
+}
+
+export function setupListClicks(): void {
+ document.querySelectorAll("#projects .list-item").forEach((item) => {
+ item.addEventListener("click", () => {
+ const index = parseInt(item.getAttribute("data-index") || "0");
+
+ selectedIndex.projects = index;
+
+ document.querySelectorAll("#projects .list-item").forEach((li, i) => {
+ li.classList.toggle("selected", i === index);
+ });
+
+ updateDetailView("projects");
+ updateUrl();
+ });
+ });
+}
diff --git a/web/src/scripts/ui/detail.ts b/web/src/scripts/ui/detail.ts
@@ -0,0 +1,27 @@
+import { selectedIndex } from "./state";
+
+export function updateExperienceDetail(): void {
+ const index = selectedIndex.experience;
+ const detailContents = document.querySelectorAll("#experience .exp-card");
+
+ detailContents.forEach((content) => {
+ content.classList.toggle(
+ "hidden",
+ parseInt(content.getAttribute("data-for") || "0") !== index,
+ );
+ });
+}
+
+export function updateDetailView(pageId: string): void {
+ const index = selectedIndex[pageId];
+ const detailContents = document.querySelectorAll(
+ `#${pageId} .detail-content`,
+ );
+
+ detailContents.forEach((content) => {
+ content.classList.toggle(
+ "hidden",
+ parseInt(content.getAttribute("data-for") || "0") !== index,
+ );
+ });
+}
diff --git a/web/src/scripts/ui/index.ts b/web/src/scripts/ui/index.ts
@@ -0,0 +1,28 @@
+import { applyInitialState } from "./state";
+import { loadFromUrl } from "./url";
+import { setupTabs } from "./tabs";
+import { setupKeyboard } from "./keyboard";
+import { setupTimelineClicks, setupListClicks } from "./clicks";
+import { setupBlogNavigation } from "./blog";
+import { updateStatusTime } from "./status";
+import { playBootAnimation } from "./boot";
+
+export async function initUI(): Promise<void> {
+ await playBootAnimation();
+
+ loadFromUrl();
+ setupTabs();
+ setupKeyboard();
+ setupTimelineClicks();
+ setupListClicks();
+ setupBlogNavigation();
+ applyInitialState();
+
+ updateStatusTime();
+ setInterval(updateStatusTime, 1000);
+
+ window.addEventListener("popstate", () => {
+ loadFromUrl();
+ applyInitialState();
+ });
+}
diff --git a/web/src/scripts/ui/keyboard.ts b/web/src/scripts/ui/keyboard.ts
@@ -0,0 +1,82 @@
+import { currentTab, currentBlogId, selectedIndex } from "./state";
+import { getItemId, updateUrl } from "./url";
+import { switchTab, cycleTab } from "./tabs";
+import { navigateList, navigateTimeline } from "./navigation";
+import { openBlogPost, closeBlogPost } from "./blog";
+
+export function setupKeyboard(): void {
+ document.addEventListener("keydown", (e) => {
+ if (
+ e.target instanceof HTMLInputElement ||
+ e.target instanceof HTMLTextAreaElement
+ )
+ return;
+
+ switch (e.key) {
+ case "1":
+ switchTab("about");
+ break;
+ case "2":
+ switchTab("experience");
+ break;
+ case "3":
+ switchTab("projects");
+ break;
+ case "4":
+ switchTab("blog");
+ break;
+ case "ArrowDown":
+ e.preventDefault();
+ navigateList(1);
+ break;
+ case "ArrowUp":
+ e.preventDefault();
+ navigateList(-1);
+ break;
+ case "ArrowLeft":
+ if (
+ (
+ window as Window & { isLightboxOpen?: () => boolean }
+ ).isLightboxOpen?.()
+ )
+ return;
+ e.preventDefault();
+ if (currentTab === "experience") {
+ navigateTimeline(-1);
+ } else {
+ cycleTab(-1);
+ }
+ break;
+ case "ArrowRight":
+ if (
+ (
+ window as Window & { isLightboxOpen?: () => boolean }
+ ).isLightboxOpen?.()
+ )
+ return;
+ e.preventDefault();
+ if (currentTab === "experience") {
+ navigateTimeline(1);
+ } else {
+ cycleTab(1);
+ }
+ break;
+ case "Tab":
+ e.preventDefault();
+ cycleTab(e.shiftKey ? -1 : 1);
+ break;
+ case "Enter":
+ if (currentTab === "blog" && !currentBlogId) {
+ const blogId = getItemId("blog", selectedIndex.blog);
+ openBlogPost(blogId);
+ }
+ break;
+ case "Escape":
+ if (currentTab === "blog" && currentBlogId) {
+ closeBlogPost();
+ updateUrl();
+ }
+ break;
+ }
+ });
+}
diff --git a/web/src/scripts/ui/navigation.ts b/web/src/scripts/ui/navigation.ts
@@ -0,0 +1,86 @@
+import { currentTab, selectedIndex, currentBlogId } from "./state";
+import { updateUrl } from "./url";
+import { updateExperienceDetail, updateDetailView } from "./detail";
+import { cycleTab } from "./tabs";
+
+export function navigateList(direction: number): void {
+ if (currentTab === "about") return;
+ if (currentTab === "experience") {
+ navigateTimeline(direction);
+ return;
+ }
+ if (currentTab === "blog") {
+ if (!currentBlogId) {
+ navigateBlogList(direction);
+ }
+ return;
+ }
+
+ const listItems = document.querySelectorAll(`#${currentTab} .list-item`);
+ const maxIndex = listItems.length - 1;
+
+ selectedIndex[currentTab] = Math.max(
+ 0,
+ Math.min(maxIndex, selectedIndex[currentTab] + direction),
+ );
+
+ listItems.forEach((item, i) => {
+ item.classList.toggle("selected", i === selectedIndex[currentTab]);
+ });
+
+ updateDetailView(currentTab);
+ updateUrl();
+
+ listItems[selectedIndex[currentTab]]?.scrollIntoView({ block: "nearest" });
+}
+
+export function navigateTimeline(direction: number): void {
+ const segments = document.querySelectorAll("#experience .timeline-segment");
+
+ const sortedSegments = Array.from(segments).sort((a, b) => {
+ const aLeft = parseFloat((a as HTMLElement).style.left) || 0;
+ const bLeft = parseFloat((b as HTMLElement).style.left) || 0;
+ return aLeft - bLeft;
+ });
+
+ const sortedIndices = sortedSegments.map((s) =>
+ parseInt(s.getAttribute("data-index") || "0"),
+ );
+ const currentPos = sortedIndices.indexOf(selectedIndex.experience);
+ const newPos = currentPos + direction;
+
+ if (newPos < 0) {
+ cycleTab(-1);
+ return;
+ }
+ if (newPos >= sortedIndices.length) {
+ cycleTab(1);
+ return;
+ }
+
+ selectedIndex.experience = sortedIndices[newPos];
+
+ segments.forEach((segment) => {
+ const idx = parseInt(segment.getAttribute("data-index") || "0");
+ segment.classList.toggle("selected", idx === selectedIndex.experience);
+ });
+
+ updateExperienceDetail();
+ updateUrl();
+}
+
+export function navigateBlogList(direction: number): void {
+ const listItems = document.querySelectorAll("#blog .blog-list-item");
+ const maxIndex = listItems.length - 1;
+
+ selectedIndex.blog = Math.max(
+ 0,
+ Math.min(maxIndex, selectedIndex.blog + direction),
+ );
+
+ listItems.forEach((item, i) => {
+ item.classList.toggle("selected", i === selectedIndex.blog);
+ });
+
+ listItems[selectedIndex.blog]?.scrollIntoView({ block: "nearest" });
+}
diff --git a/web/src/scripts/ui/state.ts b/web/src/scripts/ui/state.ts
@@ -0,0 +1,60 @@
+import { openBlogPost } from "./blog";
+import { updateDetailView, updateExperienceDetail } from "./detail";
+
+export let currentTab = "about";
+export const selectedIndex: Record<string, number> = {
+ experience: 0,
+ projects: 0,
+ blog: 0,
+};
+export let currentBlogId: string | null = null;
+
+export function applyInitialState(): void {
+ const tabs = document.querySelectorAll(".tab");
+ const pages = document.querySelectorAll(".page");
+
+ tabs.forEach((tab) => {
+ const isActive = tab.getAttribute("data-tab") === currentTab;
+ tab.classList.toggle("active", isActive);
+ if (isActive) {
+ tab.setAttribute("aria-current", "page");
+ } else {
+ tab.removeAttribute("aria-current");
+ }
+ });
+ pages.forEach((page) => {
+ page.classList.toggle("active", page.id === currentTab);
+ });
+
+ const timelineSegments = document.querySelectorAll(
+ "#experience .timeline-segment",
+ );
+ timelineSegments.forEach((segment) => {
+ const idx = parseInt(segment.getAttribute("data-index") || "0");
+ segment.classList.toggle("selected", idx === selectedIndex.experience);
+ });
+ updateExperienceDetail();
+
+ const projectItems = document.querySelectorAll("#projects .list-item");
+ projectItems.forEach((item, i) => {
+ item.classList.toggle("selected", i === selectedIndex.projects);
+ });
+ updateDetailView("projects");
+
+ const blogItems = document.querySelectorAll("#blog .blog-list-item");
+ blogItems.forEach((item, i) => {
+ item.classList.toggle("selected", i === selectedIndex.blog);
+ });
+
+ if (currentTab === "blog" && currentBlogId) {
+ openBlogPost(currentBlogId);
+ }
+}
+
+export function setCurrentTab(tab: string): void {
+ currentTab = tab;
+}
+
+export function setCurrentBlogId(id: string | null): void {
+ currentBlogId = id;
+}
diff --git a/web/src/scripts/ui/status.ts b/web/src/scripts/ui/status.ts
@@ -0,0 +1,17 @@
+export function updateStatusTime(): void {
+ const el = document.getElementById("status-time");
+ if (!el) return;
+
+ const now = new Date();
+ const time = now.toLocaleTimeString("en-US", {
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ hour12: false,
+ });
+ const date = now.toLocaleDateString("en-US", {
+ month: "short",
+ day: "numeric",
+ });
+ el.textContent = `${date} ${time}`;
+}
diff --git a/web/src/scripts/ui/tabs.ts b/web/src/scripts/ui/tabs.ts
@@ -0,0 +1,48 @@
+import { currentTab, setCurrentTab } from "./state";
+import { updateUrl } from "./url";
+import { closeBlogPost } from "./blog";
+
+export function setupTabs(): void {
+ const tabs = document.querySelectorAll(".tab");
+ tabs.forEach((tab) => {
+ tab.addEventListener("click", () => {
+ const tabName = tab.getAttribute("data-tab");
+ if (tabName) switchTab(tabName);
+ });
+ });
+}
+
+export function switchTab(tabName: string): void {
+ setCurrentTab(tabName);
+
+ if (tabName === "blog") {
+ closeBlogPost();
+ }
+
+ const tabs = document.querySelectorAll(".tab");
+ const pages = document.querySelectorAll(".page");
+
+ tabs.forEach((tab) => {
+ const isActive = tab.getAttribute("data-tab") === tabName;
+ tab.classList.toggle("active", isActive);
+ if (isActive) {
+ tab.setAttribute("aria-current", "page");
+ } else {
+ tab.removeAttribute("aria-current");
+ }
+ });
+
+ pages.forEach((page) => {
+ page.classList.toggle("active", page.id === tabName);
+ });
+
+ updateUrl();
+}
+
+export function cycleTab(direction: number): void {
+ const tabOrder = ["about", "experience", "projects", "blog"];
+ const currentIndex = tabOrder.indexOf(currentTab);
+ const newIndex =
+ (currentIndex + direction + tabOrder.length) % tabOrder.length;
+ switchTab(tabOrder[newIndex]);
+}
diff --git a/web/src/scripts/ui/url.ts b/web/src/scripts/ui/url.ts
@@ -0,0 +1,94 @@
+import {
+ currentTab,
+ selectedIndex,
+ currentBlogId,
+ setCurrentTab,
+ setCurrentBlogId,
+} from "./state";
+
+export function getItemId(tab: string, index: number): string {
+ if (tab === "experience") {
+ const item = document.querySelector(
+ `#experience .timeline-segment[data-index="${index}"]`,
+ );
+ return item?.getAttribute("data-id") || String(index);
+ } else if (tab === "projects") {
+ const item = document.querySelector(
+ `#projects .list-item[data-index="${index}"]`,
+ );
+ return item?.getAttribute("data-id") || String(index);
+ } else if (tab === "blog") {
+ const item = document.querySelector(
+ `#blog .blog-list-item[data-index="${index}"]`,
+ );
+ return item?.getAttribute("data-id") || String(index);
+ }
+ return String(index);
+}
+
+export function getIndexFromId(tab: string, id: string): number {
+ if (tab === "experience") {
+ const items = document.querySelectorAll(`#experience .timeline-segment`);
+ for (let i = 0; i < items.length; i++) {
+ if (items[i].getAttribute("data-id") === id) {
+ return parseInt(items[i].getAttribute("data-index") || "0");
+ }
+ }
+ } else if (tab === "projects") {
+ const items = document.querySelectorAll(`#projects .list-item`);
+ for (let i = 0; i < items.length; i++) {
+ if (items[i].getAttribute("data-id") === id) {
+ return i;
+ }
+ }
+ } else if (tab === "blog") {
+ const items = document.querySelectorAll(`#blog .blog-list-item`);
+ for (let i = 0; i < items.length; i++) {
+ if (items[i].getAttribute("data-id") === id) {
+ return parseInt(items[i].getAttribute("data-index") || "0");
+ }
+ }
+ }
+ return 0;
+}
+
+export function updateUrl(): void {
+ let newHash: string;
+
+ if (currentTab === "about") {
+ newHash = "#about";
+ } else if (currentTab === "blog") {
+ if (currentBlogId) {
+ newHash = `#blog/${currentBlogId}`;
+ } else {
+ newHash = "#blog";
+ }
+ } else {
+ newHash = `#${currentTab}/${getItemId(currentTab, selectedIndex[currentTab])}`;
+ }
+
+ if (window.location.hash !== newHash) {
+ history.pushState(null, "", newHash);
+ }
+}
+
+export function loadFromUrl(): void {
+ const hash = window.location.hash.slice(1);
+ if (!hash) return;
+
+ const parts = hash.split("/");
+ const tab = parts[0];
+ const id = parts[1];
+
+ if (["about", "experience", "projects", "blog"].includes(tab)) {
+ setCurrentTab(tab);
+ if (tab === "blog" && id) {
+ setCurrentBlogId(id);
+ selectedIndex.blog = getIndexFromId("blog", id);
+ } else if (tab === "blog") {
+ setCurrentBlogId(null);
+ } else if (tab !== "about" && id) {
+ selectedIndex[tab] = getIndexFromId(tab, id);
+ }
+ }
+}
diff --git a/web/start.sh b/web/start.sh
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-
-zola serve -p 8000
diff --git a/web/static/css/bootstrap-responsive.css b/web/static/css/bootstrap-responsive.css
@@ -1,937 +0,0 @@
-/*!
- * Bootstrap Responsive v2.3.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-.clearfix {
- *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.hide-text {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 20px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-@-ms-viewport {
- width: device-width;
-}
-
-.hidden {
- display: none;
- visibility: hidden;
-}
-
-.visible-phone {
- display: none !important;
-}
-
-.visible-tablet {
- display: none !important;
-}
-
-.hidden-desktop {
- display: none !important;
-}
-
-.visible-desktop {
- display: inherit !important;
-}
-
-@media (min-width: 768px) and (max-width: 979px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important ;
- }
- .visible-tablet {
- display: inherit !important;
- }
- .hidden-tablet {
- display: none !important;
- }
-}
-
-@media (max-width: 767px) {
- .hidden-desktop {
- display: inherit !important;
- }
- .visible-desktop {
- display: none !important;
- }
- .visible-phone {
- display: inherit !important;
- }
- .hidden-phone {
- display: none !important;
- }
-}
-
-.visible-print {
- display: none !important;
-}
-
-@media print {
- .visible-print {
- display: inherit !important;
- }
- .hidden-print {
- display: none !important;
- }
-}
-
-@media (min-width: 1200px) {
- .row {
- margin-left: -24px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- min-height: 1px;
- margin-left: 16px;
- }
- .container,
- .span12 {
- width: 1128px;
- }
- .span11 {
- width: 1032px;
- }
- .span10 {
- width: 936px;
- }
- .span9 {
- width: 840px;
- }
- .span8 {
- width: 744px;
- }
- .span7 {
- width: 648px;
- }
- .span6 {
- width: 552px;
- }
- .span5 {
- width: 456px;
- }
- .span4 {
- width: 360px;
- }
- .span3 {
- width: 264px;
- }
- .span2 {
- width: 168px;
- }
- .span1 {
- width: 72px;
- }
- .offset12 {
- margin-left: 1176px;
- }
- .offset11 {
- margin-left: 1080px;
- }
- .offset10 {
- margin-left: 984px;
- }
- .offset9 {
- margin-left: 888px;
- }
- .offset8 {
- margin-left: 792px;
- }
- .offset7 {
- margin-left: 696px;
- }
- .offset6 {
- margin-left: 600px;
- }
- .offset5 {
- margin-left: 504px;
- }
- .offset4 {
- margin-left: 408px;
- }
- .offset3 {
- margin-left: 312px;
- }
- .offset2 {
- margin-left: 216px;
- }
- .offset1 {
- margin-left: 120px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 20px;
- margin-left: 2.127659574468085%;
- *margin-left: 2.07469347277317%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .controls-row [class*="span"] + [class*="span"] {
- margin-left: 2.127659574468085%;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94703389830508%;
- }
- .row-fluid .span11 {
- width: 91.48936170212765%;
- *width: 91.43639560043273%;
- }
- .row-fluid .span10 {
- width: 82.97872340425532%;
- *width: 82.9257573025604%;
- }
- .row-fluid .span9 {
- width: 74.46808510638297%;
- *width: 74.41511900468805%;
- }
- .row-fluid .span8 {
- width: 65.95744680851064%;
- *width: 65.90448070681572%;
- }
- .row-fluid .span7 {
- width: 57.44680851063829%;
- *width: 57.39384240894338%;
- }
- .row-fluid .span6 {
- width: 48.93617021276595%;
- *width: 48.88320411107104%;
- }
- .row-fluid .span5 {
- width: 40.42553191489362%;
- *width: 40.372565813198705%;
- }
- .row-fluid .span4 {
- width: 31.914893617021278%;
- *width: 31.86192751532636%;
- }
- .row-fluid .span3 {
- width: 23.404255319148934%;
- *width: 23.351289217454017%;
- }
- .row-fluid .span2 {
- width: 14.893617021276595%;
- *width: 14.84065091958168%;
- }
- .row-fluid .span1 {
- width: 6.382978723404255%;
- *width: 6.33001262170934%;
- }
- .row-fluid .offset12 {
- margin-left: 104.25531914893617%;
- *margin-left: 104.14938694554633%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.12765957446808%;
- *margin-left: 102.02172737107824%;
- }
- .row-fluid .offset11 {
- margin-left: 95.74468085106382%;
- *margin-left: 95.63874864767398%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 93.61702127659574%;
- *margin-left: 93.5110890732059%;
- }
- .row-fluid .offset10 {
- margin-left: 87.23404255319149%;
- *margin-left: 87.12811034980164%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.1063829787234%;
- *margin-left: 85.00045077533356%;
- }
- .row-fluid .offset9 {
- margin-left: 78.72340425531914%;
- *margin-left: 78.6174720519293%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 76.59574468085106%;
- *margin-left: 76.48981247746121%;
- }
- .row-fluid .offset8 {
- margin-left: 70.2127659574468%;
- *margin-left: 70.10683375405696%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.08510638297872%;
- *margin-left: 67.97917417958888%;
- }
- .row-fluid .offset7 {
- margin-left: 61.70212765957446%;
- *margin-left: 61.59619545618464%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.574468085106375%;
- *margin-left: 59.46853588171655%;
- }
- .row-fluid .offset6 {
- margin-left: 53.191489361702125%;
- *margin-left: 53.08555715831229%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.063829787234035%;
- *margin-left: 50.95789758384421%;
- }
- .row-fluid .offset5 {
- margin-left: 44.68085106382979%;
- *margin-left: 44.57491886043996%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.5531914893617%;
- *margin-left: 42.447259285971874%;
- }
- .row-fluid .offset4 {
- margin-left: 36.170212765957444%;
- *margin-left: 36.06428056256762%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.04255319148936%;
- *margin-left: 33.936620988099534%;
- }
- .row-fluid .offset3 {
- margin-left: 27.659574468085104%;
- *margin-left: 27.55364226469527%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.53191489361702%;
- *margin-left: 25.425982690227183%;
- }
- .row-fluid .offset2 {
- margin-left: 19.148936170212764%;
- *margin-left: 19.043003966822933%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.02127659574468%;
- *margin-left: 16.91534439235485%;
- }
- .row-fluid .offset1 {
- margin-left: 10.638297872340425%;
- *margin-left: 10.532365668950595%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.51063829787234%;
- *margin-left: 8.40470609448251%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 24px;
- }
- input.span12,
- textarea.span12,
- .uneditable-input.span12 {
- width: 1114px;
- }
- input.span11,
- textarea.span11,
- .uneditable-input.span11 {
- width: 1018px;
- }
- input.span10,
- textarea.span10,
- .uneditable-input.span10 {
- width: 922px;
- }
- input.span9,
- textarea.span9,
- .uneditable-input.span9 {
- width: 826px;
- }
- input.span8,
- textarea.span8,
- .uneditable-input.span8 {
- width: 730px;
- }
- input.span7,
- textarea.span7,
- .uneditable-input.span7 {
- width: 634px;
- }
- input.span6,
- textarea.span6,
- .uneditable-input.span6 {
- width: 538px;
- }
- input.span5,
- textarea.span5,
- .uneditable-input.span5 {
- width: 442px;
- }
- input.span4,
- textarea.span4,
- .uneditable-input.span4 {
- width: 346px;
- }
- input.span3,
- textarea.span3,
- .uneditable-input.span3 {
- width: 250px;
- }
- input.span2,
- textarea.span2,
- .uneditable-input.span2 {
- width: 154px;
- }
- input.span1,
- textarea.span1,
- .uneditable-input.span1 {
- width: 58px;
- }
- .thumbnails {
- margin-left: -24px;
- }
- .thumbnails > li {
- margin-left: 24px;
- }
- .row-fluid .thumbnails {
- margin-left: 0;
- }
-}
-
-@media (min-width: 768px) and (max-width: 979px) {
- .row {
- margin-left: -16px;
- *zoom: 1;
- }
- .row:before,
- .row:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row:after {
- clear: both;
- }
- [class*="span"] {
- float: left;
- min-height: 1px;
- margin-left: 16px;
- }
- .container,
- .span12 {
- width: 656px;
- }
- .span11 {
- width: 600px;
- }
- .span10 {
- width: 544px;
- }
- .span9 {
- width: 488px;
- }
- .span8 {
- width: 432px;
- }
- .span7 {
- width: 376px;
- }
- .span6 {
- width: 320px;
- }
- .span5 {
- width: 264px;
- }
- .span4 {
- width: 208px;
- }
- .span3 {
- width: 152px;
- }
- .span2 {
- width: 96px;
- }
- .span1 {
- width: 40px;
- }
- .offset12 {
- margin-left: 688px;
- }
- .offset11 {
- margin-left: 632px;
- }
- .offset10 {
- margin-left: 576px;
- }
- .offset9 {
- margin-left: 520px;
- }
- .offset8 {
- margin-left: 464px;
- }
- .offset7 {
- margin-left: 408px;
- }
- .offset6 {
- margin-left: 352px;
- }
- .offset5 {
- margin-left: 296px;
- }
- .offset4 {
- margin-left: 240px;
- }
- .offset3 {
- margin-left: 184px;
- }
- .offset2 {
- margin-left: 128px;
- }
- .offset1 {
- margin-left: 72px;
- }
- .row-fluid {
- width: 100%;
- *zoom: 1;
- }
- .row-fluid:before,
- .row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
- }
- .row-fluid:after {
- clear: both;
- }
- .row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 20px;
- margin-left: 2.4390243902439024%;
- *margin-left: 2.386058288548987%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .row-fluid [class*="span"]:first-child {
- margin-left: 0;
- }
- .row-fluid .controls-row [class*="span"] + [class*="span"] {
- margin-left: 2.4390243902439024%;
- }
- .row-fluid .span12 {
- width: 100%;
- *width: 99.94703389830508%;
- }
- .row-fluid .span11 {
- width: 91.46341463414635%;
- *width: 91.41044853245143%;
- }
- .row-fluid .span10 {
- width: 82.92682926829268%;
- *width: 82.87386316659776%;
- }
- .row-fluid .span9 {
- width: 74.39024390243902%;
- *width: 74.3372778007441%;
- }
- .row-fluid .span8 {
- width: 65.85365853658537%;
- *width: 65.80069243489045%;
- }
- .row-fluid .span7 {
- width: 57.31707317073171%;
- *width: 57.2641070690368%;
- }
- .row-fluid .span6 {
- width: 48.78048780487805%;
- *width: 48.727521703183136%;
- }
- .row-fluid .span5 {
- width: 40.24390243902439%;
- *width: 40.190936337329475%;
- }
- .row-fluid .span4 {
- width: 31.70731707317073%;
- *width: 31.654350971475814%;
- }
- .row-fluid .span3 {
- width: 23.170731707317074%;
- *width: 23.117765605622157%;
- }
- .row-fluid .span2 {
- width: 14.634146341463415%;
- *width: 14.5811802397685%;
- }
- .row-fluid .span1 {
- width: 6.097560975609756%;
- *width: 6.044594873914841%;
- }
- .row-fluid .offset12 {
- margin-left: 104.8780487804878%;
- *margin-left: 104.77211657709796%;
- }
- .row-fluid .offset12:first-child {
- margin-left: 102.4390243902439%;
- *margin-left: 102.33309218685406%;
- }
- .row-fluid .offset11 {
- margin-left: 96.34146341463415%;
- *margin-left: 96.23553121124431%;
- }
- .row-fluid .offset11:first-child {
- margin-left: 93.90243902439025%;
- *margin-left: 93.7965068210004%;
- }
- .row-fluid .offset10 {
- margin-left: 87.80487804878048%;
- *margin-left: 87.69894584539064%;
- }
- .row-fluid .offset10:first-child {
- margin-left: 85.36585365853658%;
- *margin-left: 85.25992145514674%;
- }
- .row-fluid .offset9 {
- margin-left: 79.26829268292683%;
- *margin-left: 79.16236047953699%;
- }
- .row-fluid .offset9:first-child {
- margin-left: 76.82926829268293%;
- *margin-left: 76.72333608929308%;
- }
- .row-fluid .offset8 {
- margin-left: 70.73170731707317%;
- *margin-left: 70.62577511368333%;
- }
- .row-fluid .offset8:first-child {
- margin-left: 68.29268292682927%;
- *margin-left: 68.18675072343943%;
- }
- .row-fluid .offset7 {
- margin-left: 62.19512195121951%;
- *margin-left: 62.089189747829685%;
- }
- .row-fluid .offset7:first-child {
- margin-left: 59.75609756097561%;
- *margin-left: 59.650165357585784%;
- }
- .row-fluid .offset6 {
- margin-left: 53.65853658536585%;
- *margin-left: 53.552604381976025%;
- }
- .row-fluid .offset6:first-child {
- margin-left: 51.21951219512195%;
- *margin-left: 51.113579991732124%;
- }
- .row-fluid .offset5 {
- margin-left: 45.12195121951219%;
- *margin-left: 45.016019016122364%;
- }
- .row-fluid .offset5:first-child {
- margin-left: 42.68292682926829%;
- *margin-left: 42.57699462587846%;
- }
- .row-fluid .offset4 {
- margin-left: 36.58536585365854%;
- *margin-left: 36.4794336502687%;
- }
- .row-fluid .offset4:first-child {
- margin-left: 34.146341463414636%;
- *margin-left: 34.0404092600248%;
- }
- .row-fluid .offset3 {
- margin-left: 28.04878048780488%;
- *margin-left: 27.942848284415046%;
- }
- .row-fluid .offset3:first-child {
- margin-left: 25.609756097560975%;
- *margin-left: 25.50382389417114%;
- }
- .row-fluid .offset2 {
- margin-left: 19.51219512195122%;
- *margin-left: 19.40626291856139%;
- }
- .row-fluid .offset2:first-child {
- margin-left: 17.073170731707318%;
- *margin-left: 16.967238528317484%;
- }
- .row-fluid .offset1 {
- margin-left: 10.975609756097562%;
- *margin-left: 10.86967755270773%;
- }
- .row-fluid .offset1:first-child {
- margin-left: 8.536585365853659%;
- *margin-left: 8.430653162463829%;
- }
- input,
- textarea,
- .uneditable-input {
- margin-left: 0;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 16px;
- }
- input.span12,
- textarea.span12,
- .uneditable-input.span12 {
- width: 642px;
- }
- input.span11,
- textarea.span11,
- .uneditable-input.span11 {
- width: 586px;
- }
- input.span10,
- textarea.span10,
- .uneditable-input.span10 {
- width: 530px;
- }
- input.span9,
- textarea.span9,
- .uneditable-input.span9 {
- width: 474px;
- }
- input.span8,
- textarea.span8,
- .uneditable-input.span8 {
- width: 418px;
- }
- input.span7,
- textarea.span7,
- .uneditable-input.span7 {
- width: 362px;
- }
- input.span6,
- textarea.span6,
- .uneditable-input.span6 {
- width: 306px;
- }
- input.span5,
- textarea.span5,
- .uneditable-input.span5 {
- width: 250px;
- }
- input.span4,
- textarea.span4,
- .uneditable-input.span4 {
- width: 194px;
- }
- input.span3,
- textarea.span3,
- .uneditable-input.span3 {
- width: 138px;
- }
- input.span2,
- textarea.span2,
- .uneditable-input.span2 {
- width: 82px;
- }
- input.span1,
- textarea.span1,
- .uneditable-input.span1 {
- width: 26px;
- }
-}
-
-@media (max-width: 767px) {
- body {
- padding-right: 18px;
- padding-left: 18px;
- }
- .container-fluid {
- padding: 0;
- }
- .dl-horizontal dt {
- float: none;
- width: auto;
- clear: none;
- text-align: left;
- }
- .dl-horizontal dd {
- margin-left: 0;
- }
- .container {
- width: auto;
- }
- .row-fluid {
- width: 100%;
- }
- .row,
- .thumbnails {
- margin-left: 0;
- }
- .thumbnails > li {
- float: none;
- margin-left: 0;
- }
- [class*="span"],
- .uneditable-input[class*="span"],
- .row-fluid [class*="span"] {
- display: block;
- float: none;
- width: 100%;
- margin-left: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .span12,
- .row-fluid .span12 {
- width: 100%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .row-fluid [class*="offset"]:first-child {
- margin-left: 0;
- }
- .input-large,
- .input-xlarge,
- .input-xxlarge,
- input[class*="span"],
- select[class*="span"],
- textarea[class*="span"],
- .uneditable-input {
- display: block;
- width: 100%;
- min-height: 20px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- .input-prepend input,
- .input-append input,
- .input-prepend input[class*="span"],
- .input-append input[class*="span"] {
- display: inline-block;
- width: auto;
- }
- .controls-row [class*="span"] + [class*="span"] {
- margin-left: 0;
- }
- .modal {
- position: fixed;
- top: 20px;
- right: 20px;
- left: 20px;
- width: auto;
- margin: 0;
- }
- .modal.fade {
- top: -100px;
- }
- .modal.fade.in {
- top: 18px;
- }
-}
-
-@media (max-width: 480px) {
- .page-header h1 small {
- display: block;
- line-height: 20px;
- }
- input[type="checkbox"],
- input[type="radio"] {
- border: 1px solid #ccc;
- }
- .form-horizontal .control-label {
- float: none;
- width: auto;
- padding-top: 0;
- text-align: left;
- }
- .form-horizontal .controls {
- margin-left: 0;
- }
- .form-horizontal .control-list {
- padding-top: 0;
- }
- .form-horizontal .form-actions {
- padding-right: 10px;
- padding-left: 10px;
- }
- .media .pull-left,
- .media .pull-right {
- display: block;
- float: none;
- margin-bottom: 20px;
- }
- .media-object {
- margin-right: 0;
- margin-left: 0;
- }
- .modal {
- top: 9px;
- right: 4px;
- left: 4px;
- }
- .modal-header .close {
- padding: 10px;
- margin: -10px;
- }
- .carousel-caption {
- position: static;
- }
-}
-
-@media (max-width: 979px) {
- body {
- padding-top: 0;
- }
-}
diff --git a/web/static/css/bootstrap.css b/web/static/css/bootstrap.css
@@ -1,6204 +0,0 @@
-/*!
- * Bootstrap v2.3.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-.clearfix {
- *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.hide-text {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 20px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
- display: block;
-}
-
-audio,
-canvas,
-video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-
-audio:not([controls]) {
- display: none;
-}
-
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-
-a:focus {
- outline: thin solid #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-a:hover,
-a:active {
- outline: 0;
-}
-
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-
-sup {
- top: -0.5em;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-img {
- width: auto\9;
- height: auto;
- max-width: 100%;
- vertical-align: middle;
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-
-#map_canvas img,
-.google-maps img {
- max-width: none;
-}
-
-button,
-input,
-select,
-textarea {
- margin: 0;
- font-size: 100%;
- vertical-align: middle;
-}
-
-button,
-input {
- *overflow: visible;
- line-height: normal;
-}
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-
-button,
-html input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- cursor: pointer;
- -webkit-appearance: button;
-}
-
-label,
-select,
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"],
-input[type="radio"],
-input[type="checkbox"] {
- cursor: pointer;
-}
-
-input[type="search"] {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
- -webkit-appearance: none;
-}
-
-textarea {
- overflow: auto;
- vertical-align: top;
-}
-
-@media print {
- * {
- color: #000 !important;
- text-shadow: none !important;
- background: transparent !important;
- box-shadow: none !important;
- }
- a,
- a:visited {
- text-decoration: none;
- }
- a[href]:after {
- content: " (" attr(href) ")";
- }
- abbr[title]:after {
- content: " (" attr(title) ")";
- }
- .ir a:after,
- a[href^="javascript:"]:after,
- a[href^="#"]:after {
- content: "";
- }
- pre,
- blockquote {
- border: 1px solid #999;
- page-break-inside: avoid;
- }
- thead {
- display: table-header-group;
- }
- tr,
- img {
- page-break-inside: avoid;
- }
- img {
- max-width: 100% !important;
- }
- @page {
- margin: 0.5cm;
- }
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
- }
- h2,
- h3 {
- page-break-after: avoid;
- }
-}
-
-@font-face {
- font-family: "DOS";
- font-style: normal;
- font-weight: normal;
- src: url("fonts/Fixedsys500c.eot");
- src:
- local("☺"),
- url("fonts/Fixedsys500c.woff") format("woff"),
- url("fonts/Fixedsys500c.ttf") format("truetype"),
- url("fonts/Fixedsys500c.svg") format("svg");
-}
-
-body {
- margin: 0;
- font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 18px;
- line-height: 20px;
- color: #bbbbbb;
- background-color: #000084;
-}
-
-a {
- color: #fefe54;
- text-decoration: none;
-}
-
-a:hover,
-a:focus {
- color: #fefe54;
- background: #aa5500;
-}
-
-.img-rounded {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.img-polaroid {
- padding: 9px 4px 9px 4px;
- background-color: #ffffff;
- border: 2px solid #000000;
-}
-
-.row {
- margin-left: -16px;
- *zoom: 1;
-}
-
-.row:before,
-.row:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.row:after {
- clear: both;
-}
-
-[class*="span"] {
- float: left;
- min-height: 1px;
- margin-left: 16px;
-}
-
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 944px;
-}
-
-.span12 {
- width: 944px;
-}
-
-.span11 {
- width: 864px;
-}
-
-.span10 {
- width: 784px;
-}
-
-.span9 {
- width: 704px;
-}
-
-.span8 {
- width: 624px;
-}
-
-.span7 {
- width: 544px;
-}
-
-.span6 {
- width: 464px;
-}
-
-.span5 {
- width: 384px;
-}
-
-.span4 {
- width: 304px;
-}
-
-.span3 {
- width: 224px;
-}
-
-.span2 {
- width: 144px;
-}
-
-.span1 {
- width: 64px;
-}
-
-.offset12 {
- margin-left: 976px;
-}
-
-.offset11 {
- margin-left: 896px;
-}
-
-.offset10 {
- margin-left: 816px;
-}
-
-.offset9 {
- margin-left: 736px;
-}
-
-.offset8 {
- margin-left: 656px;
-}
-
-.offset7 {
- margin-left: 576px;
-}
-
-.offset6 {
- margin-left: 496px;
-}
-
-.offset5 {
- margin-left: 416px;
-}
-
-.offset4 {
- margin-left: 336px;
-}
-
-.offset3 {
- margin-left: 256px;
-}
-
-.offset2 {
- margin-left: 176px;
-}
-
-.offset1 {
- margin-left: 96px;
-}
-
-.row-fluid {
- width: 100%;
- *zoom: 1;
-}
-
-.row-fluid:before,
-.row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.row-fluid:after {
- clear: both;
-}
-
-.row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 20px;
- margin-left: 1.694915254237288%;
- *margin-left: 1.6419491525423728%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.row-fluid [class*="span"]:first-child {
- margin-left: 0;
-}
-
-.row-fluid .controls-row [class*="span"] + [class*="span"] {
- margin-left: 1.694915254237288%;
-}
-
-.row-fluid .span12 {
- width: 100%;
- *width: 99.94703389830508%;
-}
-
-.row-fluid .span11 {
- width: 91.52542372881356%;
- *width: 91.47245762711864%;
-}
-
-.row-fluid .span10 {
- width: 83.0508474576271%;
- *width: 82.99788135593218%;
-}
-
-.row-fluid .span9 {
- width: 74.57627118644066%;
- *width: 74.52330508474574%;
-}
-
-.row-fluid .span8 {
- width: 66.10169491525423%;
- *width: 66.04872881355931%;
-}
-
-.row-fluid .span7 {
- width: 57.6271186440678%;
- *width: 57.574152542372886%;
-}
-
-.row-fluid .span6 {
- width: 49.152542372881356%;
- *width: 49.09957627118644%;
-}
-
-.row-fluid .span5 {
- width: 40.677966101694906%;
- *width: 40.62499999999999%;
-}
-
-.row-fluid .span4 {
- width: 32.20338983050847%;
- *width: 32.15042372881356%;
-}
-
-.row-fluid .span3 {
- width: 23.728813559322035%;
- *width: 23.675847457627118%;
-}
-
-.row-fluid .span2 {
- width: 15.254237288135592%;
- *width: 15.201271186440676%;
-}
-
-.row-fluid .span1 {
- width: 6.779661016949152%;
- *width: 6.726694915254237%;
-}
-
-.row-fluid .offset12 {
- margin-left: 103.38983050847457%;
- *margin-left: 103.28389830508473%;
-}
-
-.row-fluid .offset12:first-child {
- margin-left: 101.69491525423729%;
- *margin-left: 101.58898305084745%;
-}
-
-.row-fluid .offset11 {
- margin-left: 94.91525423728814%;
- *margin-left: 94.8093220338983%;
-}
-
-.row-fluid .offset11:first-child {
- margin-left: 93.22033898305085%;
- *margin-left: 93.11440677966101%;
-}
-
-.row-fluid .offset10 {
- margin-left: 86.44067796610167%;
- *margin-left: 86.33474576271183%;
-}
-
-.row-fluid .offset10:first-child {
- margin-left: 84.74576271186439%;
- *margin-left: 84.63983050847455%;
-}
-
-.row-fluid .offset9 {
- margin-left: 77.96610169491524%;
- *margin-left: 77.8601694915254%;
-}
-
-.row-fluid .offset9:first-child {
- margin-left: 76.27118644067795%;
- *margin-left: 76.16525423728811%;
-}
-
-.row-fluid .offset8 {
- margin-left: 69.4915254237288%;
- *margin-left: 69.38559322033896%;
-}
-
-.row-fluid .offset8:first-child {
- margin-left: 67.79661016949152%;
- *margin-left: 67.69067796610167%;
-}
-
-.row-fluid .offset7 {
- margin-left: 61.016949152542374%;
- *margin-left: 60.91101694915255%;
-}
-
-.row-fluid .offset7:first-child {
- margin-left: 59.32203389830509%;
- *margin-left: 59.21610169491526%;
-}
-
-.row-fluid .offset6 {
- margin-left: 52.54237288135593%;
- *margin-left: 52.436440677966104%;
-}
-
-.row-fluid .offset6:first-child {
- margin-left: 50.847457627118644%;
- *margin-left: 50.74152542372882%;
-}
-
-.row-fluid .offset5 {
- margin-left: 44.06779661016948%;
- *margin-left: 43.961864406779654%;
-}
-
-.row-fluid .offset5:first-child {
- margin-left: 42.37288135593219%;
- *margin-left: 42.26694915254237%;
-}
-
-.row-fluid .offset4 {
- margin-left: 35.593220338983045%;
- *margin-left: 35.48728813559322%;
-}
-
-.row-fluid .offset4:first-child {
- margin-left: 33.89830508474576%;
- *margin-left: 33.79237288135593%;
-}
-
-.row-fluid .offset3 {
- margin-left: 27.11864406779661%;
- *margin-left: 27.01271186440678%;
-}
-
-.row-fluid .offset3:first-child {
- margin-left: 25.423728813559322%;
- *margin-left: 25.317796610169488%;
-}
-
-.row-fluid .offset2 {
- margin-left: 18.644067796610166%;
- *margin-left: 18.538135593220336%;
-}
-
-.row-fluid .offset2:first-child {
- margin-left: 16.94915254237288%;
- *margin-left: 16.84322033898305%;
-}
-
-.row-fluid .offset1 {
- margin-left: 10.169491525423728%;
- *margin-left: 10.063559322033898%;
-}
-
-.row-fluid .offset1:first-child {
- margin-left: 8.47457627118644%;
- *margin-left: 8.36864406779661%;
-}
-
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
- display: none;
-}
-
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
- float: right;
-}
-
-.container {
- margin-left: 20px;
- *zoom: 1;
-}
-
-.container:before,
-.container:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.container:after {
- clear: both;
-}
-
-.container-fluid {
- padding-right: 16px;
- padding-left: 16px;
- *zoom: 1;
-}
-
-.container-fluid:before,
-.container-fluid:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.container-fluid:after {
- clear: both;
-}
-
-img {
- -webkit-filter: contrast(800%);
- -moz-filter: contrast(1000%);
- -ms-filter: contrast(800%);
- -o-filter: contrast(800%);
- filter: contrast(1000%);
-}
-
-p {
- margin: 0 0 20px;
-}
-
-.lead {
- padding: 9px 14px 9px 14px;
- margin: 9px 4px 9px 4px;
- font-size: 18px;
- color: #ffffff;
- border: 2px solid #bbbbbb;
-}
-
-small {
- font-size: 100%;
-}
-
-strong {
- font-weight: normal;
- color: #ffffff;
-}
-
-em {
- font-weight: normal;
- color: #ffffff;
-}
-
-cite {
- font-style: normal;
-}
-
-i,
-cite,
-em,
-var,
-address,
-dfn {
- font-style: normal;
-}
-
-i:before,
-cite:before,
-em:before,
-var:before,
-address:before,
-dfn:before,
-i:after,
-cite:after,
-em:after,
-var:after,
-address:after,
-dfn:after {
- content: "/";
-}
-
-.muted {
- display: none;
- color: #bbbbbb;
-}
-
-.text-warning {
- color: #ffffff;
-}
-
-a.text-warning:hover,
-a.text-warning:focus {
- color: #ffffff;
-}
-
-.text-error {
- color: #ffffff;
-}
-
-a.text-error:hover,
-a.text-error:focus {
- color: #ffffff;
-}
-
-.text-info {
- color: #000000;
-}
-
-a.text-info:hover,
-a.text-info:focus {
- color: #000000;
-}
-
-.text-success {
- color: #00aa00;
-}
-
-a.text-success:hover,
-a.text-success:focus {
- color: #00aa00;
-}
-
-.text-left {
- text-align: left;
-}
-
-.text-right {
- text-align: right;
-}
-
-.text-center {
- text-align: center;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin: 0;
- font-family: inherit;
- font-weight: inherit;
- line-height: 20px;
- color: #ffffff;
- text-rendering: optimizelegibility;
-}
-
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
- font-weight: normal;
- line-height: 1;
- color: #bbbbbb;
-}
-
-h1,
-h2,
-h3 {
- line-height: 20px;
-}
-
-h3:before {
- content: ">>> ";
-}
-
-h3:after {
- content: " <<<";
-}
-
-h1 {
- font-size: 18px;
- text-transform: uppercase;
-}
-
-h2 {
- font-size: 18px;
- text-align: center;
- white-space: nowrap;
-}
-
-h3 {
- font-size: 18px;
-}
-
-h4 {
- font-size: 18px;
- color: #fe54fe;
-}
-
-h5 {
- font-size: 18px;
-}
-
-h6 {
- font-size: 18px;
-}
-
-h1 small {
- font-size: 18px;
-}
-
-h2 small {
- font-size: 18px;
-}
-
-h3 small {
- font-size: 18px;
-}
-
-h4 small {
- font-size: 18px;
-}
-
-.page-header {
- padding: 20px 20px;
- margin: 20px 0 20px;
- background: #00aaaa;
-}
-
-.page-header h1 {
- color: #000000;
-}
-
-ul,
-ol {
- padding: 0;
- margin: 0 0 20px 18px;
-}
-
-ul {
- list-style: square;
-}
-
-ol {
- margin-left: 21px;
- list-style: decimal;
-}
-
-ol > li {
- padding-left: 0;
-}
-
-ul ul,
-ul ol,
-ol ol,
-ol ul {
- margin-bottom: 0;
- list-style: square;
-}
-
-li {
- padding-left: 4px;
- margin-left: 0;
- line-height: 20px;
-}
-
-ol > li {
- margin-left: 12px;
-}
-
-ul.unstyled,
-ol.unstyled {
- margin-left: 0;
- list-style: none;
-}
-
-ul.unstyled > li,
-ol.unstyled > li {
- padding-left: 0;
-}
-
-ul.inline,
-ol.inline {
- margin-left: 0;
- list-style: none;
-}
-
-ul.inline > li,
-ol.inline > li {
- display: inline-block;
- *display: inline;
- padding-right: 9.5px;
- padding-left: 10.7px;
- *zoom: 1;
-}
-
-dl {
- margin-bottom: 20px;
-}
-
-dt,
-dd {
- line-height: 20px;
-}
-
-dt {
- font-weight: normal;
-}
-
-dd {
- margin-left: 21px;
-}
-
-.dl-horizontal {
- *zoom: 1;
-}
-
-.dl-horizontal:before,
-.dl-horizontal:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.dl-horizontal:after {
- clear: both;
-}
-
-.dl-horizontal dt {
- float: left;
- width: 162px;
- overflow: hidden;
- clear: left;
- text-align: right;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.dl-horizontal dd {
- margin-left: 182px;
-}
-
-hr {
- margin: 6px 0 7px;
- border: 0;
- border-top: 0px solid #bbbbbb;
- border-bottom: 2px solid #ffffff;
-}
-
-abbr[title],
-abbr[data-original-title] {
- cursor: help;
- border: 0;
-}
-
-abbr.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-
-blockquote {
- padding: 0 0 0 15px;
- margin: 0 0 20px;
- border-left: 5px solid #bbbbbb;
-}
-
-blockquote p {
- margin-bottom: 0;
- font-size: 18px;
- line-height: 20px;
-}
-
-blockquote small {
- display: block;
- line-height: 20px;
- color: #bbbbbb;
-}
-
-blockquote small:before {
- content: "\2014 \00A0";
-}
-
-blockquote.pull-right {
- float: right;
- padding-right: 1em;
- padding-left: 0;
- border-right: 5px solid #bbbbbb;
- border-left: 0;
-}
-
-blockquote.pull-right p,
-blockquote.pull-right small {
- text-align: right;
-}
-
-blockquote.pull-right small:before {
- content: "";
-}
-
-blockquote.pull-right small:after {
- content: "\00A0 \2014";
-}
-
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
- content: "";
-}
-
-address {
- display: block;
- margin-bottom: 20px;
- font-style: normal;
- line-height: 20px;
-}
-
-code,
-pre {
- padding: 0;
- font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 18px;
- color: #555555;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-code {
- padding: 0;
- color: #ffffff;
- white-space: nowrap;
- background-color: #000000;
- border: 0;
-}
-
-pre {
- display: block;
- padding: 0;
- margin: 0 0 10px;
- font-size: 18px;
- font-weight: normal;
- line-height: 20px;
- word-break: break-all;
- word-wrap: break-word;
- white-space: pre;
- white-space: pre-wrap;
- background-color: #000000;
- border: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-pre.prettyprint {
- margin-bottom: 20px;
-}
-
-pre code {
- padding: 0;
- color: inherit;
- white-space: pre;
- white-space: pre-wrap;
- background-color: transparent;
- border: 0;
-}
-
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-
-form {
- margin: 0 0 20px;
-}
-
-fieldset {
- padding: 0;
- margin: 0;
- border: 0;
-}
-
-legend {
- display: block;
- width: 100%;
- padding: 0;
- margin-bottom: 20px;
- font-size: 18px;
- line-height: 40px;
- color: #ffffff;
- border: 0;
-}
-
-legend small {
- font-size: 20px;
- color: #bbbbbb;
-}
-
-legend:before {
- content: "## ";
-}
-
-legend:after {
- content: " ##";
-}
-
-label,
-input,
-button,
-select,
-textarea {
- font-size: 18px;
- font-weight: normal;
- line-height: 20px;
-}
-
-input,
-button,
-select,
-textarea {
- font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
-}
-
-label {
- display: block;
- margin-bottom: 5px;
-}
-
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- display: inline-block;
- height: 20px;
- padding: 0 0;
- margin: 10px 5px;
- font-size: 18px;
- line-height: 20px;
- color: #000000;
- vertical-align: middle;
- background: #bbbbbb;
- border: 2px solid #000000;
-}
-
-input[type="text"]:before {
- content: "[";
-}
-
-input[type="text"]:after {
- content: "]";
-}
-
-input,
-textarea,
-.uneditable-input {
- width: 206px;
-}
-
-textarea {
- height: auto;
-}
-
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- background-color: #bbbbbb;
- border: 0;
-}
-
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
- outline: 0;
-}
-
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- margin-top: 1px \9;
- *margin-top: 0;
- line-height: normal;
-}
-
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
- width: auto;
-}
-
-select,
-input[type="file"] {
- height: 20px;
- /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
- *margin-top: 4px;
- /* For IE7, add top margin to align select with labels */
-
- line-height: 20px;
-}
-
-select {
- width: 220px;
- background-color: #ffffff;
- border: 1px solid #cccccc;
-}
-
-select[multiple],
-select[size] {
- height: auto;
-}
-
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- outline: thin solid #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-.uneditable-input,
-.uneditable-textarea {
- color: #bbbbbb;
- cursor: not-allowed;
- background-color: #fcfcfc;
- border-color: #cccccc;
-}
-
-.uneditable-input {
- overflow: hidden;
- white-space: nowrap;
-}
-
-.uneditable-textarea {
- width: auto;
- height: auto;
-}
-
-input:-moz-placeholder,
-textarea:-moz-placeholder {
- color: #bbbbbb;
-}
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
- color: #bbbbbb;
-}
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
- color: #bbbbbb;
-}
-
-.radio,
-.checkbox {
- min-height: 20px;
- padding-left: 20px;
-}
-
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
- float: left;
- margin-left: -20px;
-}
-
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
- padding-top: 5px;
-}
-
-.radio.inline,
-.checkbox.inline {
- display: inline-block;
- padding-top: 5px;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
- margin-left: 10px;
-}
-
-.input-mini {
- width: 60px;
-}
-
-.input-small {
- width: 90px;
-}
-
-.input-medium {
- width: 150px;
-}
-
-.input-large {
- width: 210px;
-}
-
-.input-xlarge {
- width: 270px;
-}
-
-.input-xxlarge {
- width: 530px;
-}
-
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
- float: none;
- margin-left: 0;
-}
-
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
- display: inline-block;
-}
-
-input,
-textarea,
-.uneditable-input {
- margin-left: 0;
-}
-
-.controls-row [class*="span"] + [class*="span"] {
- margin-left: 16px;
-}
-
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
- width: 930px;
-}
-
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
- width: 850px;
-}
-
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
- width: 770px;
-}
-
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
- width: 690px;
-}
-
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
- width: 610px;
-}
-
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
- width: 530px;
-}
-
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
- width: 450px;
-}
-
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
- width: 370px;
-}
-
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
- width: 290px;
-}
-
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
- width: 210px;
-}
-
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
- width: 130px;
-}
-
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
- width: 50px;
-}
-
-.controls-row {
- *zoom: 1;
-}
-
-.controls-row:before,
-.controls-row:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.controls-row:after {
- clear: both;
-}
-
-.controls-row [class*="span"],
-.row-fluid .controls-row [class*="span"] {
- float: left;
-}
-
-.controls-row .checkbox[class*="span"],
-.controls-row .radio[class*="span"] {
- padding-top: 5px;
-}
-
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
- cursor: not-allowed;
- background-color: #bbbbbb;
-}
-
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
- background-color: transparent;
-}
-
-.control-group.warning .control-label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
- color: #ffffff;
-}
-
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- color: #ffffff;
-}
-
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- border-color: #ffffff;
-}
-
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
- border-color: #ffffff;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
- color: #ffffff;
- background-color: #00aaaa;
- border-color: #ffffff;
-}
-
-.control-group.error .control-label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
- color: #ffffff;
-}
-
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- color: #ffffff;
-}
-
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- border-color: #ffffff;
-}
-
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
- border-color: #ffffff;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
- color: #ffffff;
- background-color: #aa0000;
- border-color: #ffffff;
-}
-
-.control-group.success .control-label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
- color: #00aa00;
-}
-
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- color: #00aa00;
-}
-
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- border-color: #00aa00;
-}
-
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
- border-color: #00aa00;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
- color: #00aa00;
- background-color: #000000;
- border-color: #00aa00;
-}
-
-.control-group.info .control-label,
-.control-group.info .help-block,
-.control-group.info .help-inline {
- color: #000000;
-}
-
-.control-group.info .checkbox,
-.control-group.info .radio,
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
- color: #000000;
-}
-
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
- border-color: #000000;
-}
-
-.control-group.info input:focus,
-.control-group.info select:focus,
-.control-group.info textarea:focus {
- border-color: #000000;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.control-group.info .input-prepend .add-on,
-.control-group.info .input-append .add-on {
- color: #000000;
- background-color: #000000;
- border-color: #000000;
-}
-
-input:focus:invalid,
-textarea:focus:invalid,
-select:focus:invalid {
- color: #b94a48;
- border-color: #ee5f5b;
-}
-
-input:focus:invalid:focus,
-textarea:focus:invalid:focus,
-select:focus:invalid:focus {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-
-.form-actions {
- padding: 19px 20px 20px;
- margin-top: 20px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border-top: 1px solid #e5e5e5;
- *zoom: 1;
-}
-
-.form-actions:before,
-.form-actions:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.form-actions:after {
- clear: both;
-}
-
-.help-block,
-.help-inline {
- color: #e1e1e1;
-}
-
-.help-block {
- display: block;
- margin-bottom: 10px;
-}
-
-.help-inline {
- display: inline-block;
- *display: inline;
- padding-left: 5px;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.input-append,
-.input-prepend {
- display: inline-block;
- margin-bottom: 10px;
- font-size: 0;
- white-space: nowrap;
- vertical-align: middle;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input,
-.input-append .dropdown-menu,
-.input-prepend .dropdown-menu,
-.input-append .popover,
-.input-prepend .popover {
- font-size: 18px;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
- position: relative;
- margin-bottom: 0;
- *margin-left: 0;
- vertical-align: top;
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
- z-index: 2;
-}
-
-.input-append .add-on,
-.input-prepend .add-on {
- display: inline-block;
- width: auto;
- height: 20px;
- min-width: 16px;
- padding: 4px 5px;
- font-size: 18px;
- font-weight: normal;
- line-height: 20px;
- text-align: center;
- text-shadow: 0;
- background-color: #bbbbbb;
- border: 0;
-}
-
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn,
-.input-append .btn-group > .dropdown-toggle,
-.input-prepend .btn-group > .dropdown-toggle {
- vertical-align: top;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.input-prepend .add-on,
-.input-prepend .btn {
- margin-right: -1px;
-}
-
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.input-append input + .btn-group .btn:last-child,
-.input-append select + .btn-group .btn:last-child,
-.input-append .uneditable-input + .btn-group .btn:last-child {
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-append .add-on,
-.input-append .btn,
-.input-append .btn-group {
- margin-left: -1px;
-}
-
-.input-append .add-on:last-child,
-.input-append .btn:last-child,
-.input-append .btn-group:last-child > .dropdown-toggle {
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.input-prepend.input-append input + .btn-group .btn,
-.input-prepend.input-append select + .btn-group .btn,
-.input-prepend.input-append .uneditable-input + .btn-group .btn {
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
- margin-right: -1px;
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
- margin-left: -1px;
- -webkit-border-radius: 0 0 0px 0;
- -moz-border-radius: 0 0 0px 0;
- border-radius: 0 0 0px 0;
-}
-
-.input-prepend.input-append .btn-group:first-child {
- margin-left: 0;
-}
-
-input.search-query {
- padding-right: 14px;
- padding-right: 4px \9;
- padding-left: 14px;
- padding-left: 4px \9;
- /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
- margin-bottom: 0;
-}
-
-/* Allow for input prepend/append in search forms */
-
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
- display: inline-block;
- *display: inline;
- margin-bottom: 0;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
- display: none;
-}
-
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
- display: inline-block;
-}
-
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
- margin-bottom: 0;
-}
-
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
- padding-left: 0;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
- float: left;
- margin-right: 3px;
- margin-left: 0;
-}
-
-.control-group {
- margin-bottom: 10px;
-}
-
-legend + .control-group {
- margin-top: 20px;
- -webkit-margin-top-collapse: separate;
-}
-
-.form-horizontal .control-group {
- margin-bottom: 20px;
- *zoom: 1;
-}
-
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.form-horizontal .control-group:after {
- clear: both;
-}
-
-.form-horizontal .control-label {
- float: left;
- width: 162px;
- padding-top: 5px;
- text-align: right;
-}
-
-.form-horizontal .controls {
- *display: inline-block;
- *padding-left: 20px;
- margin-left: 182px;
- *margin-left: 0;
-}
-
-.form-horizontal .controls:first-child {
- *padding-left: 182px;
-}
-
-.form-horizontal .help-block {
- margin-bottom: 0;
-}
-
-.form-horizontal input + .help-block,
-.form-horizontal select + .help-block,
-.form-horizontal textarea + .help-block,
-.form-horizontal .uneditable-input + .help-block,
-.form-horizontal .input-prepend + .help-block,
-.form-horizontal .input-append + .help-block {
- margin-top: 10px;
-}
-
-.form-horizontal .form-actions {
- padding-left: 182px;
-}
-
-table {
- max-width: 100%;
- background-color: transparent;
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-.table {
- width: 100%;
- margin-bottom: 20px;
-}
-
-.table th,
-.table td {
- padding: 8px;
- line-height: 20px;
- text-align: left;
- vertical-align: top;
- border-top: 2px solid #dddddd;
-}
-
-.table th {
- font-weight: normal;
-}
-
-.table thead th {
- vertical-align: bottom;
-}
-
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
- border-top: 0;
-}
-
-.table tbody + tbody {
- border-top: 2px solid #dddddd;
-}
-
-.table .table {
- background-color: #000084;
-}
-
-.table-condensed th,
-.table-condensed td {
- padding: 4px 5px;
-}
-
-.table-bordered {
- margin-left: 4px;
- border: 2px solid #dddddd;
- border-collapse: separate;
- *border-collapse: collapse;
- border-left: 0;
-}
-
-.table-bordered th,
-.table-bordered td {
- padding: inherit 5.2px;
- border-left: 2px solid #dddddd;
-}
-
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
- border-top: 0;
-}
-
-.table-bordered thead:first-child tr:first-child > th:first-child,
-.table-bordered tbody:first-child tr:first-child > td:first-child,
-.table-bordered tbody:first-child tr:first-child > th:first-child {
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.table-bordered thead:first-child tr:first-child > th:last-child,
-.table-bordered tbody:first-child tr:first-child > td:last-child,
-.table-bordered tbody:first-child tr:first-child > th:last-child {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -moz-border-radius-topright: 0;
-}
-
-.table-bordered thead:last-child tr:last-child > th:first-child,
-.table-bordered tbody:last-child tr:last-child > td:first-child,
-.table-bordered tbody:last-child tr:last-child > th:first-child,
-.table-bordered tfoot:last-child tr:last-child > td:first-child,
-.table-bordered tfoot:last-child tr:last-child > th:first-child {
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
-}
-
-.table-bordered thead:last-child tr:last-child > th:last-child,
-.table-bordered tbody:last-child tr:last-child > td:last-child,
-.table-bordered tbody:last-child tr:last-child > th:last-child,
-.table-bordered tfoot:last-child tr:last-child > td:last-child,
-.table-bordered tfoot:last-child tr:last-child > th:last-child {
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
-}
-
-.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -moz-border-radius-topright: 0;
-}
-
-.table-striped tbody > tr:nth-child(odd) > td,
-.table-striped tbody > tr:nth-child(odd) > th {
- background-color: transparent;
-}
-
-.table-hover tbody tr:hover > td,
-.table-hover tbody tr:hover > th {
- background-color: #f5f5f5;
-}
-
-table td[class*="span"],
-table th[class*="span"],
-.row-fluid table td[class*="span"],
-.row-fluid table th[class*="span"] {
- display: table-cell;
- float: none;
- margin-left: 0;
-}
-
-.table td.span1,
-.table th.span1 {
- float: none;
- width: 48px;
- margin-left: 0;
-}
-
-.table td.span2,
-.table th.span2 {
- float: none;
- width: 128px;
- margin-left: 0;
-}
-
-.table td.span3,
-.table th.span3 {
- float: none;
- width: 208px;
- margin-left: 0;
-}
-
-.table td.span4,
-.table th.span4 {
- float: none;
- width: 288px;
- margin-left: 0;
-}
-
-.table td.span5,
-.table th.span5 {
- float: none;
- width: 368px;
- margin-left: 0;
-}
-
-.table td.span6,
-.table th.span6 {
- float: none;
- width: 448px;
- margin-left: 0;
-}
-
-.table td.span7,
-.table th.span7 {
- float: none;
- width: 528px;
- margin-left: 0;
-}
-
-.table td.span8,
-.table th.span8 {
- float: none;
- width: 608px;
- margin-left: 0;
-}
-
-.table td.span9,
-.table th.span9 {
- float: none;
- width: 688px;
- margin-left: 0;
-}
-
-.table td.span10,
-.table th.span10 {
- float: none;
- width: 768px;
- margin-left: 0;
-}
-
-.table td.span11,
-.table th.span11 {
- float: none;
- width: 848px;
- margin-left: 0;
-}
-
-.table td.span12,
-.table th.span12 {
- float: none;
- width: 928px;
- margin-left: 0;
-}
-
-.table tbody tr.success > td {
- background-color: #000000;
-}
-
-.table tbody tr.error > td {
- background-color: #aa0000;
-}
-
-.table tbody tr.warning > td {
- background-color: #00aaaa;
-}
-
-.table tbody tr.info > td {
- background-color: #000000;
-}
-
-.table-hover tbody tr.success:hover > td {
- background-color: #000000;
-}
-
-.table-hover tbody tr.error:hover > td {
- background-color: #910000;
-}
-
-.table-hover tbody tr.warning:hover > td {
- background-color: #009091;
-}
-
-.table-hover tbody tr.info:hover > td {
- background-color: #000000;
-}
-
-[class^="icon-"],
-[class*=" icon-"] {
- display: none;
- width: 14px;
- height: 14px;
- margin-top: 1px;
- *margin-right: 0.3em;
- line-height: 20px;
- vertical-align: text-top;
- background-image: url("../img/glyphicons-halflings.png");
- background-position: 14px 14px;
- background-repeat: no-repeat;
-}
-
-/* White icons with optional class, or on hover/focus/active states of certain elements */
-
-.icon-white,
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:focus > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > li > a:focus > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"],
-.dropdown-submenu:hover > a > [class^="icon-"],
-.dropdown-submenu:focus > a > [class^="icon-"],
-.dropdown-submenu:hover > a > [class*=" icon-"],
-.dropdown-submenu:focus > a > [class*=" icon-"] {
- background-image: url("../img/glyphicons-halflings-white.png");
-}
-
-.icon-glass {
- background-position: 0 0;
-}
-
-.icon-music {
- background-position: -24px 0;
-}
-
-.icon-search {
- background-position: -48px 0;
-}
-
-.icon-envelope {
- background-position: -72px 0;
-}
-
-.icon-heart {
- background-position: -96px 0;
-}
-
-.icon-star {
- background-position: -120px 0;
-}
-
-.icon-star-empty {
- background-position: -144px 0;
-}
-
-.icon-user {
- background-position: -168px 0;
-}
-
-.icon-film {
- background-position: -192px 0;
-}
-
-.icon-th-large {
- background-position: -216px 0;
-}
-
-.icon-th {
- background-position: -240px 0;
-}
-
-.icon-th-list {
- background-position: -264px 0;
-}
-
-.icon-ok {
- background-position: -288px 0;
-}
-
-.icon-remove {
- background-position: -312px 0;
-}
-
-.icon-zoom-in {
- background-position: -336px 0;
-}
-
-.icon-zoom-out {
- background-position: -360px 0;
-}
-
-.icon-off {
- background-position: -384px 0;
-}
-
-.icon-signal {
- background-position: -408px 0;
-}
-
-.icon-cog {
- background-position: -432px 0;
-}
-
-.icon-trash {
- background-position: -456px 0;
-}
-
-.icon-home {
- background-position: 0 -24px;
-}
-
-.icon-file {
- background-position: -24px -24px;
-}
-
-.icon-time {
- background-position: -48px -24px;
-}
-
-.icon-road {
- background-position: -72px -24px;
-}
-
-.icon-download-alt {
- background-position: -96px -24px;
-}
-
-.icon-download {
- background-position: -120px -24px;
-}
-
-.icon-upload {
- background-position: -144px -24px;
-}
-
-.icon-inbox {
- background-position: -168px -24px;
-}
-
-.icon-play-circle {
- background-position: -192px -24px;
-}
-
-.icon-repeat {
- background-position: -216px -24px;
-}
-
-.icon-refresh {
- background-position: -240px -24px;
-}
-
-.icon-list-alt {
- background-position: -264px -24px;
-}
-
-.icon-lock {
- background-position: -287px -24px;
-}
-
-.icon-flag {
- background-position: -312px -24px;
-}
-
-.icon-headphones {
- background-position: -336px -24px;
-}
-
-.icon-volume-off {
- background-position: -360px -24px;
-}
-
-.icon-volume-down {
- background-position: -384px -24px;
-}
-
-.icon-volume-up {
- background-position: -408px -24px;
-}
-
-.icon-qrcode {
- background-position: -432px -24px;
-}
-
-.icon-barcode {
- background-position: -456px -24px;
-}
-
-.icon-tag {
- background-position: 0 -48px;
-}
-
-.icon-tags {
- background-position: -25px -48px;
-}
-
-.icon-book {
- background-position: -48px -48px;
-}
-
-.icon-bookmark {
- background-position: -72px -48px;
-}
-
-.icon-print {
- background-position: -96px -48px;
-}
-
-.icon-camera {
- background-position: -120px -48px;
-}
-
-.icon-font {
- background-position: -144px -48px;
-}
-
-.icon-bold {
- background-position: -167px -48px;
-}
-
-.icon-italic {
- background-position: -192px -48px;
-}
-
-.icon-text-height {
- background-position: -216px -48px;
-}
-
-.icon-text-width {
- background-position: -240px -48px;
-}
-
-.icon-align-left {
- background-position: -264px -48px;
-}
-
-.icon-align-center {
- background-position: -288px -48px;
-}
-
-.icon-align-right {
- background-position: -312px -48px;
-}
-
-.icon-align-justify {
- background-position: -336px -48px;
-}
-
-.icon-list {
- background-position: -360px -48px;
-}
-
-.icon-indent-left {
- background-position: -384px -48px;
-}
-
-.icon-indent-right {
- background-position: -408px -48px;
-}
-
-.icon-facetime-video {
- background-position: -432px -48px;
-}
-
-.icon-picture {
- background-position: -456px -48px;
-}
-
-.icon-pencil {
- background-position: 0 -72px;
-}
-
-.icon-map-marker {
- background-position: -24px -72px;
-}
-
-.icon-adjust {
- background-position: -48px -72px;
-}
-
-.icon-tint {
- background-position: -72px -72px;
-}
-
-.icon-edit {
- background-position: -96px -72px;
-}
-
-.icon-share {
- background-position: -120px -72px;
-}
-
-.icon-check {
- background-position: -144px -72px;
-}
-
-.icon-move {
- background-position: -168px -72px;
-}
-
-.icon-step-backward {
- background-position: -192px -72px;
-}
-
-.icon-fast-backward {
- background-position: -216px -72px;
-}
-
-.icon-backward {
- background-position: -240px -72px;
-}
-
-.icon-play {
- background-position: -264px -72px;
-}
-
-.icon-pause {
- background-position: -288px -72px;
-}
-
-.icon-stop {
- background-position: -312px -72px;
-}
-
-.icon-forward {
- background-position: -336px -72px;
-}
-
-.icon-fast-forward {
- background-position: -360px -72px;
-}
-
-.icon-step-forward {
- background-position: -384px -72px;
-}
-
-.icon-eject {
- background-position: -408px -72px;
-}
-
-.icon-chevron-left {
- background-position: -432px -72px;
-}
-
-.icon-chevron-right {
- background-position: -456px -72px;
-}
-
-.icon-plus-sign {
- background-position: 0 -96px;
-}
-
-.icon-minus-sign {
- background-position: -24px -96px;
-}
-
-.icon-remove-sign {
- background-position: -48px -96px;
-}
-
-.icon-ok-sign {
- background-position: -72px -96px;
-}
-
-.icon-question-sign {
- background-position: -96px -96px;
-}
-
-.icon-info-sign {
- background-position: -120px -96px;
-}
-
-.icon-screenshot {
- background-position: -144px -96px;
-}
-
-.icon-remove-circle {
- background-position: -168px -96px;
-}
-
-.icon-ok-circle {
- background-position: -192px -96px;
-}
-
-.icon-ban-circle {
- background-position: -216px -96px;
-}
-
-.icon-arrow-left {
- background-position: -240px -96px;
-}
-
-.icon-arrow-right {
- background-position: -264px -96px;
-}
-
-.icon-arrow-up {
- background-position: -289px -96px;
-}
-
-.icon-arrow-down {
- background-position: -312px -96px;
-}
-
-.icon-share-alt {
- background-position: -336px -96px;
-}
-
-.icon-resize-full {
- background-position: -360px -96px;
-}
-
-.icon-resize-small {
- background-position: -384px -96px;
-}
-
-.icon-plus {
- background-position: -408px -96px;
-}
-
-.icon-minus {
- background-position: -433px -96px;
-}
-
-.icon-asterisk {
- background-position: -456px -96px;
-}
-
-.icon-exclamation-sign {
- background-position: 0 -120px;
-}
-
-.icon-gift {
- background-position: -24px -120px;
-}
-
-.icon-leaf {
- background-position: -48px -120px;
-}
-
-.icon-fire {
- background-position: -72px -120px;
-}
-
-.icon-eye-open {
- background-position: -96px -120px;
-}
-
-.icon-eye-close {
- background-position: -120px -120px;
-}
-
-.icon-warning-sign {
- background-position: -144px -120px;
-}
-
-.icon-plane {
- background-position: -168px -120px;
-}
-
-.icon-calendar {
- background-position: -192px -120px;
-}
-
-.icon-random {
- width: 16px;
- background-position: -216px -120px;
-}
-
-.icon-comment {
- background-position: -240px -120px;
-}
-
-.icon-magnet {
- background-position: -264px -120px;
-}
-
-.icon-chevron-up {
- background-position: -288px -120px;
-}
-
-.icon-chevron-down {
- background-position: -313px -119px;
-}
-
-.icon-retweet {
- background-position: -336px -120px;
-}
-
-.icon-shopping-cart {
- background-position: -360px -120px;
-}
-
-.icon-folder-close {
- width: 16px;
- background-position: -384px -120px;
-}
-
-.icon-folder-open {
- width: 16px;
- background-position: -408px -120px;
-}
-
-.icon-resize-vertical {
- background-position: -432px -119px;
-}
-
-.icon-resize-horizontal {
- background-position: -456px -118px;
-}
-
-.icon-hdd {
- background-position: 0 -144px;
-}
-
-.icon-bullhorn {
- background-position: -24px -144px;
-}
-
-.icon-bell {
- background-position: -48px -144px;
-}
-
-.icon-certificate {
- background-position: -72px -144px;
-}
-
-.icon-thumbs-up {
- background-position: -96px -144px;
-}
-
-.icon-thumbs-down {
- background-position: -120px -144px;
-}
-
-.icon-hand-right {
- background-position: -144px -144px;
-}
-
-.icon-hand-left {
- background-position: -168px -144px;
-}
-
-.icon-hand-up {
- background-position: -192px -144px;
-}
-
-.icon-hand-down {
- background-position: -216px -144px;
-}
-
-.icon-circle-arrow-right {
- background-position: -240px -144px;
-}
-
-.icon-circle-arrow-left {
- background-position: -264px -144px;
-}
-
-.icon-circle-arrow-up {
- background-position: -288px -144px;
-}
-
-.icon-circle-arrow-down {
- background-position: -312px -144px;
-}
-
-.icon-globe {
- background-position: -336px -144px;
-}
-
-.icon-wrench {
- background-position: -360px -144px;
-}
-
-.icon-tasks {
- background-position: -384px -144px;
-}
-
-.icon-filter {
- background-position: -408px -144px;
-}
-
-.icon-briefcase {
- background-position: -432px -144px;
-}
-
-.icon-fullscreen {
- background-position: -456px -144px;
-}
-
-.dropup,
-.dropdown {
- position: relative;
-}
-
-.dropdown-toggle {
- *margin-bottom: -3px;
-}
-
-.dropdown-toggle:active,
-.open .dropdown-toggle {
- outline: 0;
-}
-
-.caret {
- display: inline-block;
- width: 0;
- height: 0;
- vertical-align: top;
- /*
- border-top: 4px solid @black;
- border-right: 4px solid transparent;
- border-left: 4px solid transparent;
- */
-}
-
-.caret:before {
- content: "▼";
-}
-
-.dropdown .caret {
- margin-top: 8px;
- margin-left: 2px;
-}
-
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 160px;
- padding: 9px 4px 9px 4px;
- margin: -15.5px 4px 8px 4px;
- list-style: none;
- background-color: #bbbbbb;
- border: 1px solid #000000;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- -webkit-box-shadow: 0px 0px 0 5px #bbbbbb;
- -moz-box-shadow: 0px 0px 0 5px #bbbbbb;
- box-shadow: 0px 0px 0 5px #bbbbbb;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-
-.dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-
-.dropdown-menu .divider {
- *width: 100%;
- height: 1px;
- height: 0;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #000000;
-}
-
-.dropdown-menu > li > a {
- display: block;
- padding: 0 10px;
- clear: both;
- font-weight: normal;
- line-height: 20px;
- color: #000000;
- white-space: nowrap;
-}
-
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus,
-.dropdown-submenu:hover > a,
-.dropdown-submenu:focus > a {
- color: #bbbbbb;
- text-decoration: none;
-}
-
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
- color: #bbbbbb;
- text-decoration: none;
- background-color: #fefe4a;
- background-image: -moz-linear-gradient(top, #fefe54, #fefe3b);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#fefe54),
- to(#fefe3b)
- );
- background-image: -webkit-linear-gradient(top, #fefe54, #fefe3b);
- background-image: -o-linear-gradient(top, #fefe54, #fefe3b);
- background-image: linear-gradient(to bottom, #fefe54, #fefe3b);
- background-repeat: repeat-x;
- outline: 0;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffefe54', endColorstr='#fffefe3b', GradientType=0);
-}
-
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- color: #bbbbbb;
-}
-
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- text-decoration: none;
- cursor: default;
- background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.open {
- *z-index: 1000;
-}
-
-.open > .dropdown-menu {
- display: block;
-}
-
-.pull-right > .dropdown-menu {
- right: 0;
- left: auto;
-}
-
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
- border-top: 0;
- border-bottom: 1px solid #000000;
- content: "";
-}
-
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 1px;
-}
-
-.dropdown-submenu {
- position: relative;
-}
-
-.dropdown-submenu > .dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.dropdown-submenu:hover > .dropdown-menu {
- display: block;
-}
-
-.dropup .dropdown-submenu > .dropdown-menu {
- top: auto;
- bottom: 0;
- margin-top: 0;
- margin-bottom: -2px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.dropdown-submenu > a:after {
- display: block;
- float: right;
- width: 0;
- height: 0;
- margin-top: 5px;
- margin-right: -10px;
- border-color: transparent;
- border-left-color: #cccccc;
- border-style: solid;
- border-width: 1px;
- content: " ";
-}
-
-.dropdown-submenu:hover > a:after {
- border-left-color: #bbbbbb;
-}
-
-.dropdown-submenu.pull-left {
- float: none;
-}
-
-.dropdown-submenu.pull-left > .dropdown-menu {
- left: -100%;
- margin-left: 10px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.dropdown .dropdown-menu .nav-header {
- padding-right: 16px;
- padding-left: 16px;
-}
-
-.typeahead {
- z-index: 1051;
- margin-top: 2px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, 0);
-}
-
-.well-large {
- padding: 24px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.well-small {
- padding: 9px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.fade {
- opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -moz-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
-}
-
-.fade.in {
- opacity: 1;
-}
-
-.collapse {
- position: relative;
- height: 0;
- overflow: hidden;
- -webkit-transition: height 0.35s ease;
- -moz-transition: height 0.35s ease;
- -o-transition: height 0.35s ease;
- transition: height 0.35s ease;
-}
-
-.collapse.in {
- height: auto;
-}
-
-.close {
- float: right;
- font-size: 18px;
- font-weight: normal;
- line-height: 20px;
- color: #000000;
- opacity: 0.2;
- filter: alpha(opacity=20);
-}
-
-.close:hover,
-.close:focus {
- color: #000000;
- text-decoration: none;
- cursor: pointer;
-}
-
-button.close {
- padding: 0;
- cursor: pointer;
- background: transparent;
- border: 0;
- -webkit-appearance: none;
-}
-
-.btn:hover:before,
-.btn:hover:after {
- color: #ffffff;
-}
-
-.btn:before {
- content: "< ";
-}
-
-.btn:after {
- content: " >";
-}
-
-.btn {
- display: inline-block;
- *display: inline;
- padding: 0 10px;
- margin-bottom: 20px;
- *margin-left: 0.3em;
- font-size: 18px;
- line-height: 20px;
- color: #000000;
- text-align: center;
- vertical-align: middle;
- cursor: default;
- background: #bbbbbb;
- border: 0;
- border-width: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- *zoom: 1;
- -webkit-box-shadow: 10px 10px 0 #000000;
- -moz-box-shadow: 10px 10px 0 #000000;
- box-shadow: 10px 10px 0 #000000;
-}
-
-.btn:first-child {
- *margin-left: 0;
-}
-
-.btn:hover,
-.btn:focus {
- color: #ffffff;
- text-decoration: none;
- background: #555555;
- outline: 0;
-}
-
-.btn:focus {
- outline: thin solid #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-.btn.active,
-.btn:active {
- margin: 10px 0 10px 10px;
- outline: 0;
- -webkit-box-shadow: 0 0 0;
- -moz-box-shadow: 0 0 0;
- box-shadow: 0 0 0;
-}
-
-.btn.disabled,
-.btn[disabled] {
- cursor: default;
- background-image: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-
-.btn-large {
- padding: 10px 10px;
- font-size: 18px;
- color: #000000;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-large [class^="icon-"],
-.btn-large [class*=" icon-"] {
- margin-top: 4px;
-}
-
-.btn-small {
- padding: 0;
- font-size: 18px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-small [class^="icon-"],
-.btn-small [class*=" icon-"] {
- margin-top: 0;
-}
-
-.btn-mini [class^="icon-"],
-.btn-mini [class*=" icon-"] {
- margin-top: -1px;
-}
-
-.btn-mini {
- padding: 0;
- font-size: 18px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-block {
- display: block;
- width: 100%;
- padding-right: 0;
- padding-left: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.btn-block + .btn-block {
- margin-top: 5px;
-}
-
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
- width: 100%;
-}
-
-.btn-primary {
- color: #000000;
- background: #bbbbbb;
-}
-
-.btn-warning {
- *background-color: #f47a00;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-warning:hover,
-.btn-warning:focus,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
- color: #ffffff;
-}
-
-.btn-danger {
- *background-color: #ee5f5b;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-danger:hover,
-.btn-danger:focus,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
- color: #ffffff;
-}
-
-.btn-success {
- *background-color: #62c462;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-success:hover,
-.btn-success:focus,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
- color: #ffffff;
-}
-
-.btn-info {
- *background-color: #5bc0de;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-info:hover,
-.btn-info:focus,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
- color: #ffffff;
-}
-
-.btn-inverse {
- *background-color: #555555;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.btn-inverse:hover,
-.btn-inverse:focus,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
- color: #ffffff;
-}
-
-button.btn,
-input[type="submit"].btn {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
- *padding-top: 0;
- *padding-bottom: 0;
-}
-
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
- *padding-top: 0;
- *padding-bottom: 0;
-}
-
-.btn-link,
-.btn-link:active,
-.btn-link[disabled] {
- background-color: transparent;
- background-image: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-
-.btn-link {
- color: #fefe54;
- cursor: pointer;
- border-color: transparent;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-link:hover,
-.btn-link:focus {
- color: #fefe54;
- text-decoration: none;
- background-color: #00aa00;
-}
-
-.btn-link[disabled]:hover,
-.btn-link[disabled]:focus {
- color: #555555;
- text-decoration: none;
-}
-
-.btn-group {
- position: relative;
- display: inline-block;
- *display: inline;
- *margin-left: 0.3em;
- font-size: 0;
- white-space: nowrap;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.btn-group:first-child {
- *margin-left: 0;
-}
-
-.btn-group + .btn-group {
- margin-left: 0;
-}
-
-.btn-toolbar {
- margin-top: 20px;
- margin-bottom: 20px;
- font-size: 0;
-}
-
-.btn-toolbar > .btn + .btn,
-.btn-toolbar > .btn-group + .btn,
-.btn-toolbar > .btn + .btn-group {
- margin-left: 5px;
-}
-
-.btn-group > .btn {
- position: relative;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-group > .btn + .btn {
- margin-left: -1px;
-}
-
-.btn-group > .btn,
-.btn-group > .dropdown-menu,
-.btn-group > .popover {
- font-size: 18px;
-}
-
-.btn-group > .btn-mini {
- font-size: 18px;
-}
-
-.btn-group > .btn-small {
- font-size: 18px;
-}
-
-.btn-group > .btn-large {
- font-size: 18px;
-}
-
-.btn-group > .btn:first-child {
- margin-left: 0;
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.btn-group > .btn.large:first-child {
- margin-left: 0;
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
- outline: 0;
-}
-
-.btn-group > .btn + .dropdown-toggle {
- *padding-top: 14px;
- padding-right: 8px;
- *padding-bottom: 14px;
- padding-left: 8px;
-}
-
-.btn-group > .btn-mini + .dropdown-toggle {
- *padding-top: 2px;
- padding-right: 5px;
- *padding-bottom: 2px;
- padding-left: 5px;
-}
-
-.btn-group > .btn-small + .dropdown-toggle {
- *padding-top: 5px;
- *padding-bottom: 4px;
-}
-
-.btn-group > .btn-large + .dropdown-toggle {
- *padding-top: 7px;
- padding-right: 12px;
- *padding-bottom: 7px;
- padding-left: 12px;
-}
-
-.btn-group.open .dropdown-toggle {
- background-image: none;
-}
-
-.btn-group.open .btn.dropdown-toggle {
- background-color: #aa5500;
-}
-
-.btn-group.open .btn-primary.dropdown-toggle {
- background-color: #fefe54;
-}
-
-.btn-group.open .btn-warning.dropdown-toggle {
- background-color: #a85400;
-}
-
-.btn-group.open .btn-danger.dropdown-toggle {
- background-color: #bd362f;
-}
-
-.btn-group.open .btn-success.dropdown-toggle {
- background-color: #51a351;
-}
-
-.btn-group.open .btn-info.dropdown-toggle {
- background-color: #2f96b4;
-}
-
-.btn-group.open .btn-inverse.dropdown-toggle {
- background-color: #555555;
-}
-
-.btn .caret {
- margin-top: 0;
- margin-left: 0;
-}
-
-.btn-large .caret {
- margin-top: 0;
-}
-
-.btn-large .caret {
- border-top-width: 5px;
- border-right-width: 5px;
- border-left-width: 5px;
-}
-
-.btn-mini .caret,
-.btn-small .caret {
- margin-top: 0;
-}
-
-.dropup .btn-large .caret {
- border-bottom-width: 5px;
-}
-
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.btn-group-vertical {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-
-.btn-group-vertical > .btn {
- display: block;
- float: none;
- max-width: 100%;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-group-vertical > .btn + .btn {
- margin-top: -1px;
- margin-left: 0;
-}
-
-.btn-group-vertical > .btn:first-child {
- -webkit-border-radius: 0 0px 0 0;
- -moz-border-radius: 0 0px 0 0;
- border-radius: 0 0px 0 0;
-}
-
-.btn-group-vertical > .btn:last-child {
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.btn-group-vertical > .btn-large:first-child {
- -webkit-border-radius: 0 0px 0 0;
- -moz-border-radius: 0 0px 0 0;
- border-radius: 0 0px 0 0;
-}
-
-.btn-group-vertical > .btn-large:last-child {
- -webkit-border-radius: 0 0 0 0px;
- -moz-border-radius: 0 0 0 0px;
- border-radius: 0 0 0 0px;
-}
-
-.alert {
- padding: 8px 35px 8px 14px;
- margin-bottom: 20px;
- text-shadow: 0;
- background-color: #00aaaa;
- border: 1px solid #00aaaa;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.alert,
-.alert h4 {
- color: #ffffff;
-}
-
-.alert h4 {
- margin: 0;
-}
-
-.alert .close {
- position: relative;
- top: -2px;
- right: -21px;
- line-height: 20px;
-}
-
-.alert-success {
- color: #00aa00;
- background-color: #000000;
- border-color: #000000;
-}
-
-.alert-success h4 {
- color: #00aa00;
-}
-
-.alert-danger,
-.alert-error {
- color: #ffffff;
- background-color: #aa0000;
- border-color: #aa0000;
-}
-
-.alert-danger h4,
-.alert-error h4 {
- color: #ffffff;
-}
-
-.alert-info {
- color: #000000;
- background-color: #000000;
- border-color: #000000;
-}
-
-.alert-info h4 {
- color: #000000;
-}
-
-.alert-block {
- padding-top: 14px;
- padding-bottom: 14px;
-}
-
-.alert-block > p,
-.alert-block > ul {
- margin-bottom: 0;
-}
-
-.alert-block p + p {
- margin-top: 5px;
-}
-
-.nav {
- margin-bottom: 20px;
- margin-left: 0;
- list-style: none;
- background: #bbbbbb;
-}
-
-.nav > li > a {
- display: block;
-}
-
-.nav > li > a::first-letter {
- color: #aa0000;
-}
-
-.nav > li > a:hover,
-.nav > li > a:focus {
- color: #bbbbbb;
- text-decoration: none;
- background-color: #000000;
-}
-
-.nav > li > a > img {
- max-width: none;
-}
-
-.nav > .pull-right {
- float: right;
-}
-
-.nav-header {
- display: block;
- font-weight: normal;
- line-height: 20px;
- color: #000000;
- text-transform: uppercase;
-}
-
-.nav li + .nav-header {
- line-height: 20px;
-}
-
-.nav-list {
- display: block;
- padding: 10px 15px;
- margin: 10px 5px;
- margin-left: -5px;
- border: 2px solid #000000;
- -webkit-box-shadow:
- 0 0 0 5px,
- 11px 13px 0 4px black;
- -moz-box-shadow:
- 0 0 0 5px,
- 11px 13px 0 4px black;
- box-shadow:
- 0 0 0 5px,
- 11px 13px 0 4px black;
-}
-
-.nav-list > li > a,
-.nav-list .nav-header {
- margin-right: -10px;
- margin-left: -10px;
-}
-
-.nav-list > li > a {
- padding: 0 8px;
- color: #000000;
-}
-
-.nav-list > .active > a,
-.nav-list > .active > a:hover,
-.nav-list > .active > a:focus {
- color: #ffffff;
- background-color: #00aaaa;
-}
-
-.nav-list [class^="icon-"],
-.nav-list [class*=" icon-"] {
- margin-right: 0;
-}
-
-.nav-list .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #000000;
- border-bottom: 1px solid #000000;
-}
-
-.nav-tabs,
-.nav-pills {
- *zoom: 1;
-}
-
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.nav-tabs:after,
-.nav-pills:after {
- clear: both;
-}
-
-.nav-tabs > li,
-.nav-pills > li {
- float: left;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
- padding-right: 8px;
- padding-left: 8px;
- margin-right: 0;
- line-height: 20px;
- color: #000000;
-}
-
-.nav-tabs {
- border-bottom: 0.5em solid #bbbbbb;
-}
-
-.nav-tabs > li {
- margin-bottom: -1px;
-}
-
-.nav-tabs > li > a {
- line-height: 20px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-tabs > li > a:hover,
-.nav-tabs > li > a:focus {
- background: #000000;
-}
-
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover,
-.nav-tabs > .active > a:focus {
- color: #bbbbbb;
- cursor: default;
- background-color: #000084;
- border: 0;
- border-bottom-color: transparent;
-}
-
-.nav-pills > li > a {
- padding-top: 0;
- padding-bottom: 0;
- margin-top: 0;
- margin-bottom: 0;
- line-height: 20px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover,
-.nav-pills > .active > a:focus {
- color: #bbbbbb;
- background-color: #fefe54;
-}
-
-.nav-stacked > li {
- float: none;
-}
-
-.nav-stacked > li > a {
- margin-right: 0;
-}
-
-.nav-tabs.nav-stacked {
- border-bottom: 0;
-}
-
-.nav-tabs.nav-stacked > li > a {
- border: 1px solid #ddd;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-tabs.nav-stacked > li:first-child > a {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.nav-tabs.nav-stacked > li:last-child > a {
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -moz-border-radius-bottomright: 0;
- -moz-border-radius-bottomleft: 0;
-}
-
-.nav-tabs.nav-stacked > li > a:hover,
-.nav-tabs.nav-stacked > li > a:focus {
- z-index: 2;
- border-color: #ddd;
-}
-
-.nav-pills.nav-stacked > li > a {
- margin-bottom: 3px;
-}
-
-.nav-pills.nav-stacked > li:last-child > a {
- margin-bottom: 1px;
-}
-
-.nav-tabs .dropdown-menu {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-pills .dropdown-menu {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav .dropdown-toggle .caret {
- margin-top: 6px;
- border-top-color: #fefe54;
- border-bottom-color: #fefe54;
-}
-
-.nav .dropdown-toggle:hover .caret,
-.nav .dropdown-toggle:focus .caret {
- border-top-color: #fefe54;
- border-bottom-color: #fefe54;
-}
-
-/* move down carets for tabs */
-
-.nav .active .dropdown-toggle .caret {
- border-top-color: #fff;
- border-bottom-color: #fff;
-}
-
-.nav-tabs .active .dropdown-toggle .caret {
- border-top-color: #bbbbbb;
- border-bottom-color: #bbbbbb;
-}
-
-.nav > .dropdown.active > a:hover,
-.nav > .dropdown.active > a:focus {
- cursor: pointer;
-}
-
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover,
-.nav > li.dropdown.open.active > a:focus {
- color: #ffffff;
- background-color: #bbbbbb;
- border-color: #bbbbbb;
-}
-
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret,
-.nav li.dropdown.open a:focus .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
- opacity: 1;
- filter: alpha(opacity=100);
-}
-
-.tabs-stacked .open > a:hover,
-.tabs-stacked .open > a:focus {
- border-color: #bbbbbb;
-}
-
-.tabbable {
- *zoom: 1;
-}
-
-.tabbable:before,
-.tabbable:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.tabbable:after {
- clear: both;
-}
-
-.tab-content {
- overflow: auto;
-}
-
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
- border-bottom: 0;
-}
-
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
- display: none;
-}
-
-.tab-content > .active,
-.pill-content > .active {
- display: block;
-}
-
-.tabs-below > .nav-tabs {
- border-top: 1px solid #ddd;
-}
-
-.tabs-below > .nav-tabs > li {
- margin-top: -1px;
- margin-bottom: 0;
-}
-
-.tabs-below > .nav-tabs > li > a {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.tabs-below > .nav-tabs > li > a:hover,
-.tabs-below > .nav-tabs > li > a:focus {
- border-top-color: #ddd;
- border-bottom-color: transparent;
-}
-
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover,
-.tabs-below > .nav-tabs > .active > a:focus {
- border-color: transparent #ddd #ddd #ddd;
-}
-
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
- float: none;
-}
-
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
- min-width: 74px;
- margin-right: 0;
- margin-bottom: 0;
-}
-
-.tabs-left > .nav-tabs {
- float: left;
- margin-right: 18px;
- border-right: 1px solid #ddd;
-}
-
-.tabs-left > .nav-tabs > li > a {
- margin-right: -1px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.tabs-left > .nav-tabs > li > a:hover,
-.tabs-left > .nav-tabs > li > a:focus {
- border-color: #bbbbbb #dddddd #bbbbbb #bbbbbb;
-}
-
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover,
-.tabs-left > .nav-tabs .active > a:focus {
- border-color: #ddd transparent #ddd #ddd;
- *border-right-color: #ffffff;
-}
-
-.tabs-right > .nav-tabs {
- float: right;
- margin-left: 19px;
- border-left: 1px solid #ddd;
-}
-
-.tabs-right > .nav-tabs > li > a {
- margin-left: -1px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.tabs-right > .nav-tabs > li > a:hover,
-.tabs-right > .nav-tabs > li > a:focus {
- border-color: #bbbbbb #bbbbbb #bbbbbb #dddddd;
-}
-
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover,
-.tabs-right > .nav-tabs .active > a:focus {
- border-color: #ddd #ddd #ddd transparent;
- *border-left-color: #ffffff;
-}
-
-.nav > .disabled > a {
- color: #bbbbbb;
-}
-
-.nav > .disabled > a:hover,
-.nav > .disabled > a:focus {
- text-decoration: none;
- cursor: default;
- background-color: transparent;
-}
-
-.navbar {
- *position: relative;
- *z-index: 2;
- margin-bottom: 20px;
- overflow: visible;
-}
-
-.navbar-inner {
- min-height: 20px;
- padding-right: 12.4px;
- padding-left: 12.4px;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- *zoom: 1;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.navbar-inner:before,
-.navbar-inner:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.navbar-inner:after {
- clear: both;
-}
-
-.navbar .container {
- width: auto;
-}
-
-.nav-collapse.collapse {
- height: auto;
- overflow: visible;
-}
-
-.navbar .brand {
- display: block;
- float: left;
- padding: 0 10px;
- margin-left: -10px;
- font-size: 18px;
- color: #000084;
- text-shadow: 0;
-}
-
-.navbar .brand:hover,
-.navbar .brand:focus {
- text-decoration: none;
-}
-
-.navbar-text {
- margin-bottom: 0;
- line-height: 20px;
- color: #000000;
-}
-
-.navbar-link {
- color: #000000;
-}
-
-.navbar-link:hover,
-.navbar-link:focus {
- color: #555555;
-}
-
-.navbar .divider-vertical {
- height: 20px;
- margin: 0 12.4px;
- border-right: 1px solid #ffffff;
- border-left: 1px solid #bbbbbb;
-}
-
-.navbar .btn,
-.navbar .btn-group {
- margin-top: -5px;
-}
-
-.navbar .btn-group .btn,
-.navbar .input-prepend .btn,
-.navbar .input-append .btn,
-.navbar .input-prepend .btn-group,
-.navbar .input-append .btn-group {
- margin-top: 0;
-}
-
-.navbar-form {
- margin-bottom: 0;
- *zoom: 1;
-}
-
-.navbar-form:before,
-.navbar-form:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.navbar-form:after {
- clear: both;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
- margin-top: -5px;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
- display: inline-block;
- margin-bottom: 0;
- -webkit-box-shadow: 0 0;
- -moz-box-shadow: 0 0;
- box-shadow: 0 0;
-}
-
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
- margin-top: 3px;
-}
-
-.navbar-form .input-append,
-.navbar-form .input-prepend {
- margin-top: 5px;
- white-space: nowrap;
-}
-
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
- margin-top: 0;
-}
-
-.navbar-search {
- position: relative;
- float: left;
- margin-top: -5px;
- margin-bottom: 0;
-}
-
-.navbar-search .search-query {
- padding: 4px 12.4px;
- margin-bottom: 0;
- font-family: DOS, Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 18px;
- font-weight: normal;
- line-height: 1;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-static-top {
- position: static;
- margin-bottom: 0;
-}
-
-.navbar-static-top .navbar-inner {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: 1030;
- margin-bottom: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- border-width: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
- border-width: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
- padding-right: 0;
- padding-left: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 944px;
-}
-
-.navbar-fixed-top {
- top: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.navbar-fixed-bottom {
- bottom: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.navbar .nav {
- position: relative;
- left: 0;
- display: block;
- float: left;
- margin: 0 20px 0 0;
-}
-
-.navbar .nav.pull-right {
- float: right;
- margin-right: 0;
-}
-
-.navbar .nav > li {
- float: left;
- padding-left: 0;
-}
-
-.navbar .nav > li > a {
- float: none;
- padding: 0 10px;
- color: #000000;
- text-decoration: none;
- text-shadow: 0;
-}
-
-.navbar .nav .dropdown-toggle .caret {
- margin-top: 0;
-}
-
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
- color: #555555;
- text-decoration: none;
- background-color: transparent;
-}
-
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
- color: #bbbbbb;
- text-decoration: none;
- background-color: #bbbbbb;
-}
-
-.navbar .btn-navbar {
- display: none;
- float: right;
- padding: 0 12.4px;
- margin-right: 12.4px;
- margin-left: 12.4px;
- *background-color: #aeaeae;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:focus,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
- color: #ffffff;
-}
-
-.navbar .btn-navbar .icon-bar {
- display: block;
- width: 18px;
- height: 2px;
- background-color: #f5f5f5;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-navbar .icon-bar + .icon-bar {
- margin-top: 3px;
-}
-
-.navbar .nav > li > .dropdown-menu:before {
- position: absolute;
- top: -7px;
- left: 9px;
- display: inline-block;
- border-right: 7px solid transparent;
- border-bottom: 7px solid #ccc;
- border-left: 7px solid transparent;
- border-bottom-color: rgba(0, 0, 0, 0.2);
- content: "";
-}
-
-.navbar .nav > li > .dropdown-menu:after {
- position: absolute;
- top: -6px;
- left: 10px;
- display: inline-block;
- border-right: 6px solid transparent;
- border-bottom: 6px solid #ffffff;
- border-left: 6px solid transparent;
- content: "";
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
- top: auto;
- bottom: -7px;
- border-top: 7px solid #ccc;
- border-bottom: 0;
- border-top-color: rgba(0, 0, 0, 0.2);
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
- top: auto;
- bottom: -6px;
- border-top: 6px solid #ffffff;
- border-bottom: 0;
-}
-
-.navbar .nav li.dropdown > a:hover .caret,
-.navbar .nav li.dropdown > a:focus .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
- color: #bbbbbb;
- background-color: #bbbbbb;
-}
-
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #000000;
- border-bottom-color: #000000;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #bbbbbb;
- border-bottom-color: #bbbbbb;
-}
-
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
- right: 12px;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
- right: 13px;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
- right: 100%;
- left: auto;
- margin-right: -1px;
- margin-left: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-inverse .navbar-inner {
- background: #bbbbbb;
-}
-
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
- color: #000000;
- text-shadow: 0;
- background: #bbbbbb;
-}
-
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover,
-.navbar-inverse .brand:focus,
-.navbar-inverse .nav > li > a:focus {
- color: #bbbbbb;
- background: #000000;
-}
-
-.navbar-inverse .brand {
- color: #000084;
-}
-
-.navbar-inverse .navbar-text {
- color: #000000;
-}
-
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
- color: #bbbbbb;
- background: #000000;
-}
-
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
- color: #bbbbbb;
- text-decoration: none;
- background: #000000;
-}
-
-.navbar-inverse .navbar-link {
- color: #000000;
-}
-
-.navbar-inverse .navbar-link:hover,
-.navbar-inverse .navbar-link:focus {
- color: #ffffff;
-}
-
-.navbar-inverse .divider-vertical {
- border-right-color: #000000;
- border-left-color: #000000;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
- color: #ffffff;
- background-color: #000000;
-}
-
-.navbar-inverse .nav li.dropdown > a:hover .caret,
-.navbar-inverse .nav li.dropdown > a:focus .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #000000;
- border-bottom-color: #000000;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .navbar-search .search-query {
- color: #ffffff;
- background-color: #404040;
- border-color: #000000;
- -webkit-transition: none;
- -moz-transition: none;
- -o-transition: none;
- transition: none;
-}
-
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
- padding: 0 20px;
- color: #555555;
- text-shadow: 0;
- background-color: #ffffff;
- border: 0;
- outline: 0;
-}
-
-.navbar-inverse .btn-navbar {
- *background-color: #000000;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:focus,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
- color: #ffffff;
-}
-
-.breadcrumb:before {
- content: ">>";
-}
-
-.breadcrumb {
- padding: 0 20px;
- margin: 0 0 20px;
- list-style: none;
- background-color: #000000;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.breadcrumb > li {
- display: inline-block;
- *display: inline;
- text-shadow: 0;
- *zoom: 1;
-}
-
-.breadcrumb > li > .divider {
- padding: 0 10px;
- color: #bbbbbb;
-}
-
-.breadcrumb > .active {
- color: #bbbbbb;
-}
-
-.pagination {
- margin: 20px 0;
-}
-
-.pagination ul {
- display: inline-block;
- *display: inline;
- margin-bottom: 0;
- margin-left: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- *zoom: 1;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.pagination ul > li {
- display: inline;
-}
-
-.pagination ul > li > a,
-.pagination ul > li > span {
- float: left;
- padding: 20px 10px;
- line-height: 20px;
- text-decoration: none;
- background-color: #00aa00;
- border: 0;
- border-left-width: 0;
-}
-
-.pagination ul > li > a:hover,
-.pagination ul > li > a:focus,
-.pagination ul > .active > a,
-.pagination ul > .active > span {
- background-color: #f5f5f5;
-}
-
-.pagination ul > .active > a,
-.pagination ul > .active > span {
- color: #bbbbbb;
- cursor: default;
-}
-
-.pagination ul > .disabled > span,
-.pagination ul > .disabled > a,
-.pagination ul > .disabled > a:hover,
-.pagination ul > .disabled > a:focus {
- color: #bbbbbb;
- cursor: default;
- background-color: transparent;
-}
-
-.pagination ul > li:first-child > a,
-.pagination ul > li:first-child > span {
- border-left-width: 1px;
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.pagination ul > li:last-child > a,
-.pagination ul > li:last-child > span {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.pagination-centered {
- text-align: center;
-}
-
-.pagination-right {
- text-align: right;
-}
-
-.pagination-large ul > li > a,
-.pagination-large ul > li > span {
- padding: 18px;
- font-size: 18px;
-}
-
-.pagination-large ul > li:first-child > a,
-.pagination-large ul > li:first-child > span {
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.pagination-large ul > li:last-child > a,
-.pagination-large ul > li:last-child > span {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.pagination-mini ul > li:first-child > a,
-.pagination-small ul > li:first-child > a,
-.pagination-mini ul > li:first-child > span,
-.pagination-small ul > li:first-child > span {
- -webkit-border-bottom-left-radius: 0;
- border-bottom-left-radius: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-bottomleft: 0;
- -moz-border-radius-topleft: 0;
-}
-
-.pagination-mini ul > li:last-child > a,
-.pagination-small ul > li:last-child > a,
-.pagination-mini ul > li:last-child > span,
-.pagination-small ul > li:last-child > span {
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
- -webkit-border-bottom-right-radius: 0;
- border-bottom-right-radius: 0;
- -moz-border-radius-topright: 0;
- -moz-border-radius-bottomright: 0;
-}
-
-.pagination-small ul > li > a,
-.pagination-small ul > li > span {
- padding: 0;
- font-size: 18px;
-}
-
-.pagination-mini ul > li > a,
-.pagination-mini ul > li > span {
- padding: 0;
- font-size: 18px;
-}
-
-.pager {
- margin: 20px 0;
- text-align: center;
- list-style: none;
- *zoom: 1;
-}
-
-.pager:before,
-.pager:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.pager:after {
- clear: both;
-}
-
-.pager li {
- display: inline;
-}
-
-.pager li > a,
-.pager li > span {
- display: inline-block;
- padding: 0 20px;
- background-color: #555555;
-}
-
-.pager li > a:hover,
-.pager li > a:focus {
- text-decoration: none;
-}
-
-.pager .next > a,
-.pager .next > span {
- float: right;
-}
-
-.pager .previous > a,
-.pager .previous > span {
- float: left;
-}
-
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
- color: #bbbbbb;
- cursor: default;
- background-color: #555555;
-}
-
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: #000000;
-}
-
-.modal-backdrop.fade {
- opacity: 0;
-}
-
-.modal-backdrop,
-.modal-backdrop.fade.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-
-.modal {
- position: fixed;
- top: 10%;
- left: 50%;
- z-index: 1050;
- width: 560px;
- margin-left: -280px;
- background-color: #ffffff;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, 0.3);
- *border: 1px solid #999;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- outline: none;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-
-.modal.fade {
- top: -25%;
-}
-
-.modal.fade.in {
- top: 10%;
-}
-
-.modal-header {
- padding: 9px 15px;
- border-bottom: 1px solid #eee;
-}
-
-.modal-header .close {
- margin-top: 2px;
-}
-
-.modal-header h3 {
- margin: 0;
- line-height: 30px;
-}
-
-.modal-body {
- position: relative;
- max-height: 400px;
- padding: 15px;
- overflow-y: auto;
-}
-
-.modal-form {
- margin-bottom: 0;
-}
-
-.modal-footer {
- padding: 14px 15px 15px;
- margin-bottom: 0;
- text-align: right;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
- *zoom: 1;
-}
-
-.modal-footer:before,
-.modal-footer:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.modal-footer:after {
- clear: both;
-}
-
-.modal-footer .btn + .btn {
- margin-bottom: 0;
- margin-left: 5px;
-}
-
-.modal-footer .btn-group .btn + .btn {
- margin-left: -1px;
-}
-
-.modal-footer .btn-block + .btn-block {
- margin-left: 0;
-}
-
-.tooltip {
- position: absolute;
- z-index: 1030;
- display: block;
- font-size: 18px;
- line-height: 1;
- opacity: 0;
- filter: alpha(opacity=0);
- visibility: visible;
-}
-
-.tooltip.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-
-.tooltip.top {
- padding: 9px 0 9px;
- margin-top: -3px;
-}
-
-.tooltip.right {
- padding: 0 4px 0 4px;
- margin-left: 3px;
-}
-
-.tooltip.bottom {
- padding: 9px 0 9px;
- margin-top: 3px;
-}
-
-.tooltip.left {
- padding: 0 4px 0 4px;
- margin-left: -3px;
-}
-
-.tooltip-inner {
- max-width: 310px;
- padding: 9px 4px 9px 4px;
- color: #ffffff;
- text-align: center;
- text-decoration: none;
- background-color: #000000;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.tooltip.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-top-color: #000000;
- border-width: 5px 5px 0;
-}
-
-.tooltip.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-right-color: #000000;
- border-width: 5px 5px 5px 0;
-}
-
-.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-left-color: #000000;
- border-width: 5px 0 5px 5px;
-}
-
-.tooltip.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-bottom-color: #000000;
- border-width: 0 5px 5px;
-}
-
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1010;
- display: none;
- max-width: 496px;
- padding: 1px;
- text-align: left;
- white-space: normal;
- background-color: #ffffff;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-
-.popover.top {
- margin-top: -10px;
-}
-
-.popover.right {
- margin-left: 10px;
-}
-
-.popover.bottom {
- margin-top: 10px;
-}
-
-.popover.left {
- margin-left: -10px;
-}
-
-.popover-title {
- padding: 8px 14px;
- margin: 0;
- font-size: 14px;
- font-weight: normal;
- line-height: 18px;
- background-color: #ffffff;
- border-bottom: 1px solid #f2f2f2;
-}
-
-.popover-title:empty {
- display: none;
-}
-
-.popover-content {
- padding: 9px 14px;
-}
-
-.popover .arrow,
-.popover .arrow:after {
- position: absolute;
- display: block;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.popover .arrow {
- border-width: 11px;
-}
-
-.popover .arrow:after {
- border-width: 10px;
- content: "";
-}
-
-.popover.top .arrow {
- bottom: -11px;
- left: 50%;
- margin-left: -11px;
- border-top-color: #999;
- border-top-color: rgba(0, 0, 0, 0.25);
- border-bottom-width: 0;
-}
-
-.popover.top .arrow:after {
- bottom: 1px;
- margin-left: -10px;
- border-top-color: #ffffff;
- border-bottom-width: 0;
-}
-
-.popover.right .arrow {
- top: 50%;
- left: -11px;
- margin-top: -11px;
- border-right-color: #999;
- border-right-color: rgba(0, 0, 0, 0.25);
- border-left-width: 0;
-}
-
-.popover.right .arrow:after {
- bottom: -10px;
- left: 1px;
- border-right-color: #ffffff;
- border-left-width: 0;
-}
-
-.popover.bottom .arrow {
- top: -11px;
- left: 50%;
- margin-left: -11px;
- border-bottom-color: #999;
- border-bottom-color: rgba(0, 0, 0, 0.25);
- border-top-width: 0;
-}
-
-.popover.bottom .arrow:after {
- top: 1px;
- margin-left: -10px;
- border-bottom-color: #ffffff;
- border-top-width: 0;
-}
-
-.popover.left .arrow {
- top: 50%;
- right: -11px;
- margin-top: -11px;
- border-left-color: #999;
- border-left-color: rgba(0, 0, 0, 0.25);
- border-right-width: 0;
-}
-
-.popover.left .arrow:after {
- right: 1px;
- bottom: -10px;
- border-left-color: #ffffff;
- border-right-width: 0;
-}
-
-.thumbnails {
- margin-left: -16px;
- list-style: none;
- *zoom: 1;
-}
-
-.thumbnails:before,
-.thumbnails:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.thumbnails:after {
- clear: both;
-}
-
-.row-fluid .thumbnails {
- margin-left: 0;
-}
-
-.thumbnails > li {
- float: left;
- margin-bottom: 20px;
- margin-left: 16px;
-}
-
-.thumbnail {
- display: block;
- padding: 3px 6px;
- margin: 4px 3px;
- line-height: 20px;
- border: 1px solid #ddd;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-a.thumbnail:hover,
-a.thumbnail:focus {
- border-color: #fefe54;
- -webkit-box-shadow: 0;
- -moz-box-shadow: 0;
- box-shadow: 0;
-}
-
-.thumbnail > img {
- display: block;
- max-width: 100%;
- margin-right: auto;
- margin-left: auto;
-}
-
-.thumbnail .caption {
- padding: 9px;
- color: #bbbbbb;
-}
-
-.media,
-.media-body {
- overflow: hidden;
- *overflow: visible;
- zoom: 1;
-}
-
-.media,
-.media .media {
- margin-top: 15px;
-}
-
-.media:first-child {
- margin-top: 0;
-}
-
-.media-object {
- display: block;
-}
-
-.media-heading {
- margin: 0 0 5px;
-}
-
-.media > .pull-left {
- margin-right: 10px;
-}
-
-.media > .pull-right {
- margin-left: 10px;
-}
-
-.media-list {
- margin-left: 0;
- list-style: none;
-}
-
-.label,
-.badge {
- display: inline-block;
- padding: 0 12.4px;
- font-size: 18px;
- line-height: 20px;
- color: #ffffff;
- white-space: nowrap;
- vertical-align: baseline;
- background-color: #555555;
-}
-
-.badge {
- padding-right: 12.4px;
- padding-left: 12.4px;
-}
-
-.label:empty,
-.badge:empty {
- display: none;
-}
-
-a.label:hover,
-a.label:focus,
-a.badge:hover,
-a.badge:focus {
- color: #ffffff;
- text-decoration: none;
- cursor: pointer;
-}
-
-.label-important,
-.badge-important {
- background-color: #aa0000;
-}
-
-.label-important[href],
-.badge-important[href] {
- background-color: #aa0000;
-}
-
-.label-warning,
-.badge-warning {
- background-color: #a85400;
-}
-
-.label-warning[href],
-.badge-warning[href] {
- background-color: #a85400;
-}
-
-.label-success,
-.badge-success {
- background-color: #00aa00;
-}
-
-.label-success[href],
-.badge-success[href] {
- background-color: #00aa00;
-}
-
-.label-info,
-.badge-info {
- background-color: #000000;
-}
-
-.label-info[href],
-.badge-info[href] {
- background-color: #000000;
-}
-
-.label-inverse,
-.badge-inverse {
- background-color: #555555;
-}
-
-.label-inverse[href],
-.badge-inverse[href] {
- background-color: #555555;
-}
-
-.btn .label,
-.btn .badge {
- position: relative;
- top: -1px;
-}
-
-.btn-mini .label,
-.btn-mini .badge {
- top: 0;
-}
-
-@-webkit-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@-moz-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@-ms-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@-o-keyframes progress-bar-stripes {
- from {
- background-position: 0 0;
- }
- to {
- background-position: 40px 0;
- }
-}
-
-@keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-.progress {
- height: 20px;
- margin-bottom: 20px;
- overflow: hidden;
- background-color: #f7f7f7;
- background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#f5f5f5),
- to(#f9f9f9)
- );
- background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
- background-repeat: repeat-x;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
-}
-
-.progress .bar {
- float: left;
- width: 0;
- height: 100%;
- font-size: 12px;
- color: #ffffff;
- text-align: center;
- text-shadow: 0;
- background-color: #0e90d2;
- background-image: -moz-linear-gradient(top, #149bdf, #0480be);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#149bdf),
- to(#0480be)
- );
- background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
- background-image: -o-linear-gradient(top, #149bdf, #0480be);
- background-image: linear-gradient(to bottom, #149bdf, #0480be);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-transition: width 0.6s ease;
- -moz-transition: width 0.6s ease;
- -o-transition: width 0.6s ease;
- transition: width 0.6s ease;
-}
-
-.progress-striped .bar {
- background-color: #149bdf;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- -webkit-background-size: 40px 40px;
- -moz-background-size: 40px 40px;
- -o-background-size: 40px 40px;
- background-size: 40px 40px;
-}
-
-.progress.active .bar {
- -webkit-animation: progress-bar-stripes 2s linear infinite;
- -moz-animation: progress-bar-stripes 2s linear infinite;
- -ms-animation: progress-bar-stripes 2s linear infinite;
- -o-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
-}
-
-.progress-danger .bar,
-.progress .bar-danger {
- background-color: #dd514c;
- background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#ee5f5b),
- to(#c43c35)
- );
- background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
- background-color: #ee5f5b;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
-}
-
-.progress-success .bar,
-.progress .bar-success {
- background-color: #5eb95e;
- background-image: -moz-linear-gradient(top, #62c462, #57a957);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#62c462),
- to(#57a957)
- );
- background-image: -webkit-linear-gradient(top, #62c462, #57a957);
- background-image: -o-linear-gradient(top, #62c462, #57a957);
- background-image: linear-gradient(to bottom, #62c462, #57a957);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
- background-color: #62c462;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
-}
-
-.progress-info .bar,
-.progress .bar-info {
- background-color: #4bb1cf;
- background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#5bc0de),
- to(#339bb9)
- );
- background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
- background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
- background-color: #5bc0de;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
-}
-
-.progress-warning .bar,
-.progress .bar-warning {
- background-color: #d66b00;
- background-image: -moz-linear-gradient(top, #f47a00, #a85400);
- background-image: -webkit-gradient(
- linear,
- 0 0,
- 0 100%,
- from(#f47a00),
- to(#a85400)
- );
- background-image: -webkit-linear-gradient(top, #f47a00, #a85400);
- background-image: -o-linear-gradient(top, #f47a00, #a85400);
- background-image: linear-gradient(to bottom, #f47a00, #a85400);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff47a00', endColorstr='#ffa85400', GradientType=0);
-}
-
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
- background-color: #f47a00;
- background-image: -webkit-gradient(
- linear,
- 0 100%,
- 100% 0,
- color-stop(0.25, rgba(255, 255, 255, 0.15)),
- color-stop(0.25, transparent),
- color-stop(0.5, transparent),
- color-stop(0.5, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, rgba(255, 255, 255, 0.15)),
- color-stop(0.75, transparent),
- to(transparent)
- );
- background-image: -webkit-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -moz-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: -o-linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
-}
-
-.accordion {
- margin-bottom: 20px;
-}
-
-.accordion-group {
- margin-bottom: 2px;
- border: 1px solid #e5e5e5;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.accordion-heading {
- border-bottom: 0;
-}
-
-.accordion-heading .accordion-toggle {
- display: block;
- padding: 8px 15px;
-}
-
-.accordion-toggle {
- cursor: pointer;
-}
-
-.accordion-inner {
- padding: 9px 15px;
- border-top: 1px solid #e5e5e5;
-}
-
-.carousel {
- position: relative;
- margin-bottom: 20px;
- line-height: 1;
-}
-
-.carousel-inner {
- position: relative;
- width: 100%;
- overflow: hidden;
-}
-
-.carousel-inner > .item {
- position: relative;
- display: none;
-}
-
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
- display: block;
- line-height: 1;
-}
-
-.carousel-inner > .active,
-.carousel-inner > .next,
-.carousel-inner > .prev {
- display: block;
-}
-
-.carousel-inner > .active {
- left: 0;
-}
-
-.carousel-inner > .next,
-.carousel-inner > .prev {
- position: absolute;
- top: 0;
- width: 100%;
-}
-
-.carousel-inner > .next {
- left: 100%;
-}
-
-.carousel-inner > .prev {
- left: -100%;
-}
-
-.carousel-inner > .next.left,
-.carousel-inner > .prev.right {
- left: 0;
-}
-
-.carousel-inner > .active.left {
- left: -100%;
-}
-
-.carousel-inner > .active.right {
- left: 100%;
-}
-
-.carousel-control {
- position: absolute;
- top: 40%;
- left: 15px;
- width: 40px;
- height: 40px;
- margin-top: -20px;
- font-size: 60px;
- font-weight: 100;
- line-height: 30px;
- color: #ffffff;
- text-align: center;
- background: #555555;
- border: 3px solid #ffffff;
- opacity: 0.5;
- filter: alpha(opacity=50);
-}
-
-.carousel-control.right {
- right: 15px;
- left: auto;
-}
-
-.carousel-control:hover,
-.carousel-control:focus {
- color: #ffffff;
- text-decoration: none;
- opacity: 0.9;
- filter: alpha(opacity=90);
-}
-
-.carousel-indicators {
- position: absolute;
- top: 15px;
- right: 15px;
- z-index: 5;
- margin: 0;
- list-style: none;
-}
-
-.carousel-indicators li {
- display: block;
- float: left;
- width: 10px;
- height: 10px;
- margin-left: 5px;
- text-indent: -999px;
- background-color: #ccc;
- background-color: rgba(255, 255, 255, 0.25);
-}
-
-.carousel-indicators .active {
- background-color: #fff;
-}
-
-.carousel-caption {
- position: absolute;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 15px;
- background: #555555;
- background: rgba(0, 0, 0, 0.75);
-}
-
-.carousel-caption h4,
-.carousel-caption p {
- line-height: 20px;
- color: #ffffff;
-}
-
-.carousel-caption h4 {
- margin: 0 0 5px;
-}
-
-.carousel-caption p {
- margin-bottom: 0;
-}
-
-.hero-unit {
- padding: 16px 20.8px;
- margin-bottom: 20px;
- font-size: 18px;
- line-height: 20px;
- color: #ffffff;
- background-color: #00aaaa;
- border: 4px double #ffffff;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
- box-shadow: 0 0 0 4px #00aaaa;
-}
-
-.hero-unit h1 {
- margin-bottom: 20px;
- font-size: 18px;
- line-height: 1;
- color: #ffffff;
- text-align: center;
- text-decoration: blink;
-}
-
-.hero-unit li {
- line-height: 20px;
-}
-
-.pull-right {
- float: right;
-}
-
-.pull-left {
- float: left;
-}
-
-.hide {
- display: none;
-}
-
-.show {
- display: block;
-}
-
-.invisible {
- visibility: hidden;
-}
-
-#wrap386 {
- position: fixed;
- right: 0;
- bottom: 0;
- z-index: 9999999;
- width: 100%;
- height: 100%;
- background: #000084;
-}
-
-#bar386 {
- float: right;
- width: 100%;
- height: 20px;
- margin-top: -20px;
- font-weight: bold;
- color: #ffffff;
- background: #000084;
-}
-
-#cursor386 {
- position: fixed;
- right: 0;
- bottom: 0;
- z-index: 9999999;
- font-weight: bold;
- color: #ffffff;
-}
diff --git a/web/static/css/fonts/Fixedsys500c.eot b/web/static/css/fonts/Fixedsys500c.eot
Binary files differ.
diff --git a/web/static/css/fonts/Fixedsys500c.otf b/web/static/css/fonts/Fixedsys500c.otf
Binary files differ.
diff --git a/web/static/css/fonts/Fixedsys500c.svg b/web/static/css/fonts/Fixedsys500c.svg
@@ -1,646 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
-<metadata>
-Created by FontForge 20190801 at Sun Aug 5 10:20:04 2001
- By chris
-GPL, see http://www.gnu.org/licenses/gpl.txt
-</metadata>
-<defs>
-<font id="FixedsysTTF" horiz-adv-x="550" >
- <font-face
- font-family="FixedsysTTF"
- font-weight="600"
- font-stretch="normal"
- units-per-em="1000"
- panose-1="2 0 0 9 0 0 0 0 0 0"
- ascent="800"
- descent="-200"
- x-height="465"
- cap-height="610"
- bbox="-1 -288 550 813"
- underline-thickness="50"
- underline-position="-125"
- unicode-range="U+0001-20AC"
- />
-<missing-glyph
- />
- <glyph glyph-name=".notdef"
- />
- <glyph glyph-name=".null"
- />
- <glyph glyph-name="nonmarkingreturn"
- />
- <glyph glyph-name="space" unicode=" "
- />
- <glyph glyph-name="space" unicode=" "
- />
- <glyph glyph-name=".0015"
-d="M10 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5
-h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470z" />
- <glyph glyph-name="exclam" unicode="!"
-d="M226 130v-130h120v130h-120zM221 335v-125h130v125h65v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-205h65z" />
- <glyph glyph-name="quotedbl" unicode="""
-d="M54 602v-200h130v200h-130v0zM324 602v-200h130v200h-130v0z" />
- <glyph glyph-name="numbersign" unicode="#"
-d="M119 135v-135h123v130h90v-130h127v135h69v70h-68v200h68v70h-69v135h-127v-130h-85v130h-128v-135h-69v-70h64v-200h-64v-70h69v0zM247 400h80v-190h-80v190v0z" />
- <glyph glyph-name="dollar" unicode="$"
-d="M187 1v-134h128v136h70v69l69 2v138h-68v69h-71v61h-69l-1 70h-59v141h129v-70h140v70h-69l-1 69h-70v139h-129v-139h-70v-71h-69v-138h70v-69h69v-61h60v-70l68 1v-142h-128v69h-141v-67h69q0 -19 0.5 -35.5t0.5 -35.5q3 -1 13 -1h22h22q11 0 15 -1z" />
- <glyph glyph-name="percent" unicode="%"
-d="M266 10v-65h205q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-205v-65h-55v-140h55zM341 145h60v-130h-60v130zM71 215v-130h60q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5
-q1 1 10 2.5t19.5 2.5t19.5 2t11 3q3 3 5.5 12t4 19.5t2 20t-1.5 13.5h50q-2 4 -2 13q0 10 1.5 20.5t4.5 19.5t6 12t12 6t19.5 4.5t19.5 1.5q10 0 14 -2v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130h-60
-q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-3 -3 -5.5 -11.5t-4 -18t-2 -18t1.5 -12.5q-3 1 -10.5 0.5t-15.5 -2t-15 -3.5t-9 -5
-t-4.5 -10t-4 -15t-2.5 -15t1 -10q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM1 495q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h190q-2 4 -1.5 12.5t2 18
-t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-190q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130zM141 625h60v-130h-60v130z" />
- <glyph glyph-name="ampersand" unicode="&"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h195v60h70v-60h135v65h-60v140h60v65h-270v-65h60v-135h-120v265h120q-2 4 -1.5 13.5t2 20t4 19.5t5.5 12t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5
-t-5.5 11.5t-4 18t-2 18t1.5 12.5h-190q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-135h60v-70h-60v-265zM196 540h50v-130h-50v130z" />
- <glyph glyph-name="quotesingle" unicode="'"
-d="M178 604v-200h120v200h-120v0z" />
- <glyph glyph-name="parenleft" unicode="("
-d="M282 -66v-65h135v65h-65v140h-65v340h65v140h65v65h-135v-65h-60v-140h-65v-340h65v-140h60v0z" />
- <glyph glyph-name="parenright" unicode=")"
-d="M165 -61l1 -68h121v65h75v140h65v340h-65v137h-70v68h-126l-1 -72h66l1 -133h55v-340h-55l-1 -137h-66z" />
- <glyph glyph-name="asterisk" unicode="*"
-d="M109 216v-65h125v60h70v-60h135v65h-60v70h130v60h-130v70h60v65h-135v-60h-70v60h-125v-65h60v-70h-130v-60h130v-70h-60v0z" />
- <glyph glyph-name="plus" unicode="+"
-d="M194 252v-135h130v135h135v60h-135v135h-130v-135h-135v-60h135v0z" />
- <glyph glyph-name="comma" unicode=","
-d="M200 -63v-65h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v200h-190v-135h50v-70h-50z" />
- <glyph glyph-name="minus" unicode="-"
-d="M56 303v-50h400v50h-400z" />
- <glyph glyph-name="period" unicode="."
-d="M198 130v-130h190v130h-190v0z" />
- <glyph glyph-name="slash" unicode="/"
-d="M87 -64h99l301 631v49h-108l-292 -584v-96z" />
- <glyph glyph-name="zero" unicode="0"
-d="M82 71q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM218 134h60v140h-60v265h130v-65h-60v-140h60v-265h-130v65z" />
- <glyph glyph-name="one" unicode="1"
-d="M249 406v-405h135v610h-135v-65h-60v-70h-135v-70h195v0z" />
- <glyph glyph-name="two" unicode="2"
-d="M98 0h400v65h-260v70h58q-2 4 -3 13.5t-1 19.5q0 11 1.5 20t4.5 12q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v55h65v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260
-q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130h135v130h125v-205h-60q1 -3 1 -11t-1.5 -17t-4 -16.5t-5.5 -10.5q-2 -3 -9.5 -4.5t-16.5 -2.5t-18 -1q-8 0 -11 2q2 -4 3.5 -14t1.5 -22q0 -11 -1 -21t-4 -13q-2 -2 -12 -1.5t-22.5 1.5
-t-23.5 1q-10 0 -11 -1q-2 -2 -2 -12t0.5 -22.5t0 -23t-1.5 -11.5q-3 -3 -12 -4t-19 -1t-19 1.5t-13 3.5v-135z" />
- <glyph glyph-name="three" unicode="3"
-d="M95 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v205h-60v60h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5
-t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130h135v130h125v-205h-120v-60h120v-205h-125v130h-135v-130z" />
- <glyph glyph-name="four" unicode="4"
-d="M319 135v-135h140v135h65v70h-65v265h-140v-260h-125v65h50v335h-125v-335h-65v-140h265v0z" />
- <glyph glyph-name="five" unicode="5"
-d="M44 65v-65h313q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v135h-65v60h-248v210h313v65h-453v-335h313v-135q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -12t-4 -19.5
-t-2 -20t1.5 -13.5h-243z" />
- <glyph glyph-name="six" unicode="6"
-d="M95 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v260q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 12t-4 19.5t-2 20t1.5 13.5h-130v65q4 -2 12.5 -1.5t18 2t18 4
-t11.5 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v60h-195v-130q-4 2 -13.5 1.5t-20 -2t-19.5 -4t-12 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM235 330h120v-260h-120v260z" />
- <glyph glyph-name="seven" unicode="7"
-d="M157 205v-205h125v205h70v130h70v140h65v135h-400v-65h260v-70h-65v-140h-60v-130h-65v0z" />
- <glyph glyph-name="eight" unicode="8"
-d="M87 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v205h-60v60h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5
-t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-205h60v-60h-60v-205zM227 270h50q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-130h-120v200zM282 405h-55v135h120v-200h-65v65z" />
- <glyph glyph-name="nine" unicode="9"
-d="M156 60v-60h195v130q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5
-t-18 -4t-18 -2t-12.5 1.5v-260q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-50q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM226 540h120v-260h-120v260z" />
- <glyph glyph-name="colon" unicode=":"
-d="M193 139v-130h190v130h-190v0zM193 479v-130h190v130h-190v0z" />
- <glyph glyph-name="semicolon" unicode=";"
-d="M198 -66v-65h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v200h-190v-135h50v-70h-50zM198 479v-130h190v130h-190z" />
- <glyph glyph-name="less" unicode="<"
-d="M494 0h-102l-301 300l301 310h102v-42l-267 -269l267 -262v-37z" />
- <glyph glyph-name="equal" unicode="="
-d="M99 283v-60h401v60h-401v0zM99 422v-60h401v60h-401v0z" />
- <glyph glyph-name="greater" unicode=">"
-d="M92 0h102l301 300l-301 310h-102v-42l259 -261l-259 -265v-42z" />
- <glyph glyph-name="question" unicode="?"
-d="M211 130v-130h120v130h-120zM211 335v-125h125v120q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18
-t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130h135v130h125v-130q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -12t-4 -19.5t-2 -20t1.5 -13.5h-50z" />
- <glyph glyph-name="at" unicode="@"
-d="M7 71q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h470v65h-400v481h265v-141h-140v-70h-55v-130h55v-65h275v404h-66l-4 66h-406v-65l-64 -1v-474zM359 335h72v-130h-72v130z" />
- <glyph glyph-name="A" unicode="A"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190z" />
- <glyph glyph-name="B" unicode="B"
-d="M62 610v-610h330q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v205h-60v60h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-330zM202 270h120v-200h-120v200zM202 540h120v-200h-120v200z" />
- <glyph glyph-name="C" unicode="C"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5
-h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470z" />
- <glyph glyph-name="D" unicode="D"
-d="M54 610v-610h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5
-t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-260zM194 540h50q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-330q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -11.5t-4 -18t-2 -18t1.5 -12.5h-50v470z" />
- <glyph glyph-name="E" unicode="E"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0z" />
- <glyph glyph-name="F" unicode="F"
-d="M59 610v-610h135v275h195v60h-190v210h260v65h-400v0z" />
- <glyph glyph-name="G" unicode="G"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v270h-200v-65h60v-135h-120v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5
-t-18 -4t-18 -2t-12.5 1.5v-470z" />
- <glyph glyph-name="H" unicode="H"
-d="M59 610v-610h135v270h130v-270h135v610h-135v-270h-130v270h-135v0z" />
- <glyph glyph-name="I" unicode="I"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0z" />
- <glyph glyph-name="J" unicode="J"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v130h-135v-130z" />
- <glyph glyph-name="K" unicode="K"
-d="M56 610v-610h135v270h60v-135h70v-135h135v135h-65v140h-65v60h65v140h65v135h-135v-135h-70v-135h-60v270h-135v0z" />
- <glyph glyph-name="L" unicode="L"
-d="M59 610v-610h400v65h-265v545h-135v0z" />
- <glyph glyph-name="M" unicode="M"
-d="M44 610v-610h135v405h55v70h-55v135h-135zM379 400v-400h135v610h-135v-130q-4 2 -13.5 1.5t-20 -2t-19.5 -4t-12 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-190h65v190h70z" />
- <glyph glyph-name="N" unicode="N"
-d="M56 610v-610h135v350l200 -176v-174h135v610h-135v-301l-200 191v110h-135z" />
- <glyph glyph-name="O" unicode="O"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470z" />
- <glyph glyph-name="P" unicode="P"
-d="M57 615v-615h139v275h200v60h65v209l-65 1v70h-339v0zM196 544h129v-209h-129v209v0z" />
- <glyph glyph-name="Q" unicode="Q"
-d="M247 0q-2 -4 -1.5 -13.5t2 -20t4 -19.5t5.5 -12q1 -2 10 -3t19.5 -2t19.5 -2.5t11 -2.5q3 -3 5.5 -11.5t4 -18t2 -18t-1.5 -12.5h130v65h-60v140h60v475q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120zM197 545h120v-470h-120v470z" />
- <glyph glyph-name="R" unicode="R"
-d="M79 610v-610h135v270h55q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v205h-60v130h60v205q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-330zM219 540h120v-200h-120v200z" />
- <glyph glyph-name="S" unicode="S"
-d="M51 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -12 5.5t-19.5 4t-20 2
-t-13.5 -1.5v50q-4 -2 -14 -2q-9 0 -19.5 1.5t-19.5 4.5t-12 6t-6 12t-4.5 19.5t-1.5 19.5q0 10 2 14h-50v135h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4
-t-18 -2t-12.5 1.5v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 11.5 -5.5t18 -4t18 -2t12.5 1.5q-2 -3 -1 -10.5t2.5 -15.5t4 -15t4.5 -9t9 -4.5t15 -4t15.5 -2.5t10.5 1q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4
-t18 -2t12.5 1.5v-130h-125v60h-135v-60z" />
- <glyph glyph-name="T" unicode="T"
-d="M194 545v-545h130v545h135v65h-400v-65h135v0z" />
- <glyph glyph-name="U" unicode="U"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540z" />
- <glyph glyph-name="V" unicode="V"
-d="M54 140q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q1 -2 10 -3t19.5 -2t19.5 -2.5t11 -2.5q3 -3 5.5 -11.5t4 -18t2 -18t-1.5 -12.5h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5
-t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v470h-135v-470h-130v470h-135v-470z" />
- <glyph glyph-name="W" unicode="W"
-d="M119 205v-205h130v205h65v195h-65v-190h-60v400h-135v-405h65v0zM324 205v-205h135v205h65v405h-135v-405h-65v0z" />
- <glyph glyph-name="X" unicode="X"
-d="M56 200v-200h135v270h55q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v200q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v120q4 -2 12.5 -1.5t18 2t18 4
-t11.5 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-200h-70v65h-60v135h-135v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 11.5 -5.5t18 -4t18 -2t12.5 1.5v-120q-4 2 -12.5 1.5t-18 -2
-t-18 -4t-11.5 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" />
- <glyph glyph-name="Y" unicode="Y"
-d="M189 275v-275h130v275h70v60h65v275h-135v-270h-130v270h-135v-275h65v-60h70v0z" />
- <glyph glyph-name="Z" unicode="Z"
-d="M56 200v-200h400v65h-260v140h50q-2 4 -2 13q0 10 1.5 20.5t4.5 19.5t6 12t12 6t19.5 4.5t19.5 1.5q10 0 14 -2v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v200h-400v-65h260v-135q-4 2 -12.5 1.5t-18 -2
-t-18 -4t-11.5 -5.5t-5.5 -11.5t-4 -18t-2 -18t1.5 -12.5q-3 1 -10.5 0.5t-15.5 -2t-15 -3.5t-9 -5t-4.5 -9.5t-4 -14.5t-2.5 -15.5t1 -10.5q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z
-" />
- <glyph glyph-name="bracketleft" unicode="["
-d="M121 623v-798h269v55h-130v678h130v65h-269v0z" />
- <glyph glyph-name="backslash" unicode="\"
-d="M372 -60l110 -3l-2 53l-314 625l-84 2v-99z" />
- <glyph glyph-name="bracketright" unicode="]"
-d="M166 -132v-55h260v810h-260v-65h120v-690h-120v0z" />
- <glyph glyph-name="asciicircum" unicode="^"
-d="M208 717v-60v0h-60v0v-60v0h-60v0v-60v0h120v0v60h120v0v-60v0h108v0v60v0h-48v0v60v0h-60v0v60v0h-120v0z" />
- <glyph glyph-name="underscore" unicode="_"
-d="M0 -158v-50h550v50h-550z" />
- <glyph glyph-name="grave" unicode="`"
-d="M282 589v-69h140v69h-70v140h-199v-70h70v-70h59z" />
- <glyph glyph-name="a" unicode="a"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130z" />
- <glyph glyph-name="b" unicode="b"
-d="M97 610v-610h330q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330h-66v75h-199v135h-135zM237 400h120v-330h-120v330z" />
- <glyph glyph-name="c" unicode="c"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v60h-135v-60h-125v330h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5
-h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330z" />
- <glyph glyph-name="d" unicode="d"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v610h-135v-135h-195q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330z" />
- <glyph glyph-name="e" unicode="e"
-d="M51 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260v65h-190v140h260v195q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-330zM191 400h120v-120h-120v120z" />
- <glyph glyph-name="f" unicode="f"
-d="M124 275v-275h130v275h209v61h-208v211h208v67h-267v-68h-72v-211h-70v-60h70v0z" />
- <glyph glyph-name="g" unicode="g"
-d="M62 -140v-55h335v55h65v615h-330q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h190v-140h-260zM202 405h120v-330h-120v330z" />
- <glyph glyph-name="h" unicode="h"
-d="M62 610v-610h135v400h130v-400h135v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 12t-4 19.5t-2 20t1.5 13.5h-195v135h-135z" />
- <glyph glyph-name="i" unicode="i"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM199 660v-110h120v110h-120v0z" />
- <glyph glyph-name="j" unicode="j"
-d="M59 -155v-55h265v55h65v615h-260v-65h120v-550h-190v0zM259 650v-110h130v110h-130v0z" />
- <glyph glyph-name="k" unicode="k"
-d="M62 610v-610h135v200h55q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t12 -5.5t19.5 -4t20 -2t13.5 1.5v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v65h65v60h65v135h-135v-135h-65
-q2 -3 1.5 -11t-2 -17t-4 -16.5t-5.5 -10.5t-11 0t-16.5 7.5t-16.5 8.5t-11 4v310h-135z" />
- <glyph glyph-name="l" unicode="l"
-d="M59 65v-65h400v65h-135v545h-265v-65h130v-480h-130v0z" />
- <glyph glyph-name="m" unicode="m"
-d="M59 470v-470h135v400h60v-330h70v330h70v-400h135v400h-65v70h-405v0z" />
- <glyph glyph-name="n" unicode="n"
-d="M59 470v-470h135v400h130v-400h135v400l-65 7v63h-335v0z" />
- <glyph glyph-name="o" unicode="o"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330z" />
- <glyph glyph-name="p" unicode="p"
-d="M56 470v-664h134v193h193q-2 4 -1.5 13.5t2 19.5t4 19t5.5 13q3 3 11 5.5t17.5 4t17.5 1.5q9 0 13 -1v326q-4 -2 -12.5 -1.5t-18 2t-17.5 4t-11 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-327zM195 400h118v-326h-118v326z" />
- <glyph glyph-name="q" unicode="q"
-d="M324 1v-194h135v664h-327q1 -4 2 -15t1 -23t-1 -21.5t-4 -9.5q-4 0 -13.5 -0.5t-20 -1t-20.5 -0.5q-9 0 -13 2v-327q4 2 14 3t21.5 0.5t21.5 -1.5t13 -4t4 -13.5t0 -22t-2.5 -22t-2.5 -14.5h192zM201 402h119v-327h-119v327z" />
- <glyph glyph-name="r" unicode="r"
-d="M62 470v-470h135v276l60 1l1 58h204v135h-135l1 -63h-70l-2 -72h-59v135h-135z" />
- <glyph glyph-name="s" unicode="s"
-d="M62 65v-65h330q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 12t-4 19.5t-2 20t1.5 13.5h-190v130h260v65h-330q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-120q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h190v-140h-260z" />
- <glyph glyph-name="t" unicode="t"
-d="M124 70q4 2 13.5 1.5t20 -2t19.5 -4t12 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260v65h-200v340h200v70h-205v135h-130v-135h-65v-70h65v-335z" />
- <glyph glyph-name="u" unicode="u"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400z" />
- <glyph glyph-name="v" unicode="v"
-d="M59 140q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q1 -2 10 -3t19.5 -2t19.5 -2.5t11 -2.5q3 -3 5.5 -11.5t4 -18t2 -18t-1.5 -12.5h120q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5
-t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330h-135v-330h-130v330h-135v-330z" />
- <glyph glyph-name="w" unicode="w"
-d="M113 133v-133h129v133h64v263h-64v-257h-59v326h-135v-332h65v0zM316 133v-133h134v133h64v332h-133v-332h-65v0z" />
- <glyph glyph-name="x" unicode="x"
-d="M59 130v-130h135v130h130v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v65h65v60h65v135h-135v-130h-130v130h-135v-135h65v-60h65v-65q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5
-q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" />
- <glyph glyph-name="y" unicode="y"
-d="M22 -141v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z
-" />
- <glyph glyph-name="z" unicode="z"
-d="M59 130v-130h400v65h-260v70h50q-2 4 -1.5 13.5t2 20t4 19.5t5.5 12q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v55h65v135h-400v-65h260v-70h-60q1 -3 1 -11t-1.5 -17t-4 -16.5t-5.5 -10.5q-2 -3 -9 -5.5
-t-15 -4t-15.5 -2t-10.5 1.5q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" />
- <glyph glyph-name="braceleft" unicode="{"
-d="M240 -47v-65h135v65h-65v205h-68v75h-57v65h60v65h65v199h65v65h-135v-65h-60v-199h-70v-65h-65v-65h66v-75h69v-205h60z" />
- <glyph glyph-name="bar" unicode="|"
-d="M228 611v-810h120v810h-120v0z" />
- <glyph glyph-name="braceright" unicode="}"
-d="M101 -61v-65h139v70h75v200h72v80h63v65h-65v76h-70v200h-77v65h-139v-65h71v-200h78l2 -76h60v-65h-59v-75h-79v-210h-71z" />
- <glyph glyph-name="asciitilde" unicode="~"
-d="M1 557v-134h61v65h67v68h77v-68h60v-65h216v65h59v135h-60v-63h-80v-67h-60v68h-80v71h-195v-75h-65z" />
- <glyph glyph-name="tilde" unicode="˜"
-d="M1 557v-134h61v65h67v68h77v-68h60v-65h216v65h59v135h-60v-63h-80v-67h-60v68h-80v71h-195v-75h-65z" />
- <glyph glyph-name="sf256"
- />
- <glyph glyph-name="sf260"
-d="M0 479v-480h120v400h160v-400h152q0 82 1.5 150t-2.5 122.5t-18 94.5t-44 67t-80.5 40.5t-128.5 13.5q-9 0 -32 -1.5t-48.5 -3t-48 -2.5t-31.5 -1z" />
- <glyph glyph-name="sf264"
-d="M6 236q0 -62 6.5 -106t26.5 -72.5t58.5 -41.5t103.5 -13t103.5 13t59 41.5t26.5 72.5t6 106t-6 106t-26.5 72t-59 41t-103.5 13t-103.5 -13t-58.5 -41t-26.5 -72t-6.5 -106zM164 386h75v-300h-75v300z" />
- <glyph glyph-name="sf265"
-d="M8 417v-705q6 0 17 2.5t23 7t22 9.5t13 11q6 6 16 28t21.5 47t21.5 47t16 28t28 17t47 23t47 22t28 13q8 6 21 17t25 23t20.5 22t8.5 13t1 21t2.5 42t2.5 48.5t1 38.5t-1 38t-2.5 48t-2.5 42.5t-1 21.5q-3 8 -12 19.5t-20.5 23t-23 20.5t-19.5 12q-3 0 -21.5 1t-42.5 2.5
-t-48 2.5t-38 1q-9 0 -30 -1t-45 -2.5t-45.5 -2.5t-29.5 -1zM158 342h75v-300h-75v300z" />
- <glyph glyph-name="sf259"
-d="M69 448v-450h75l3 372l109 -297l150 300v-375h143q0 15 -1.5 45t-4.5 67t-6.5 78t-6.5 77.5t-6 65.5t-5 42q0 8 -8.5 21t-20.5 25t-25 20.5t-21 8.5q-3 0 -25.5 1t-52 2.5t-60 2.5t-50.5 1q-11 0 -37.5 -1t-56 -2.5t-56 -2.5t-37.5 -1z" />
- <glyph glyph-name="sf261"
-d="M10 610v-610h135v311q3 0 11 4t16.5 8t16.5 6.5t11 0.5t5.5 -9t4 -15t2 -15.5t-1.5 -10.5q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v610h-135v-270h-65q2 4 1.5 12.5t-2 18t-4 18
-t-5.5 11.5q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 12t-4 19.5t-2 20t1.5 13.5h-55v135h-135z" />
- <glyph glyph-name="sf263"
-d="M7 457v-457h102v233q2 0 8 3t12.5 6t12.5 5t8 0t4 -6.5t3 -10.5t1 -12q0 -5 -1 -8q3 1 9 1q7 0 14 -1.5t13.5 -3.5t8.5 -4q1 -1 2 -8t2 -14.5t2 -14.5t2 -8q3 -2 9.5 -4t14 -3t15 -1.5t10.5 1.5v-150h101v457h-101v-202h-49q1 3 1 9q0 7 -1.5 14t-3.5 13.5t-4 8.5
-q-1 1 -8 2t-14.5 1.5t-14.5 1.5t-8 2q-2 3 -4 9.5t-3 14.5t-1.5 15t1.5 10h-41v101h-102z" />
- <glyph glyph-name="sf262"
-d="M7 457v-457h102v304h41v52h-41v101h-102zM259 300v-300h101v457h-101v-97q-3 1 -11 1q-7 0 -14.5 -1.5t-14 -3.5t-9.5 -4q-1 -1 -2 -8t-2 -14.5t-2 -14.5t-2 -8q-2 -2 -8.5 -4t-13.5 -3t-13.5 -1.5t-9.5 1.5v-143h49v143h53z" />
- <glyph glyph-name="sf266"
-d="M10 130v-130h135v130h130v-130h135v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -11.5 5.5t-18 4t-18 2t-12.5 -1.5v65h65v60h65v135h-135v-130h-130v130h-135v-135h65v-60h65v-65q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5
-q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5z" />
- <glyph glyph-name="sf267"
-d="M6 -139v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z" />
- <glyph glyph-name="sf268"
-d="M145 4v-130h130v130q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v130q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -12 5.5t-19.5 4t-20 2t-13.5 -1.5v50
-q-4 -2 -14 -2q-9 0 -19.5 1.5t-19.5 4.5t-12 6t-6 12t-4.5 19.5t-1.5 19.5q0 10 2 14h-50v135h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-3 3 -12 5.5t-19.5 4t-20 2t-13.5 -1.5v90h-130v-90q-4 2 -13.5 1.5t-20 -2
-t-19.5 -4t-12 -5.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 11.5 -5.5t18 -4t18 -2t12.5 1.5q-2 -3 -1 -10t2.5 -15t4 -15t4.5 -10t9 -5
-t15 -3.5t15.5 -2t10.5 0.5q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-130h-125v60h-135v-60q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 12 -5.5t19.5 -4t20 -2t13.5 1.5z" />
- <glyph glyph-name="sf269"
-d="M10 810v-810h260v55h-130v690h130v65h-260v0z" />
- <glyph glyph-name="sf270"
-d="M56 603v-200h130v200h-130v0zM326 603v-200h130v200h-130v0z" />
- <glyph glyph-name="acute" unicode="´"
-d="M292 589v-69h-140v69h70v140h199v-70h-70v-70h-59z" />
- <glyph glyph-name="degree" unicode="°"
-d="M146 649v-63v0h-67v0v-127v0h67v0v-63v0h271v0v63v0h63v0v127v0h-63v0v63v0h-271v0zM354 586v-127h-139v127h139z" />
- <glyph glyph-name="section" unicode="§"
-d="M148 578v-60v0h-60v0v-120v0h60v-120v0h-60v0v-120v0h60v0v-60v0h60v0v-66v0h120v-136h-120v0v68v0h-120v0v-68v0h60v0v-66v0h240v0v66v0h60v0v136v0h-60v126v0h60v0v120v0h-60v0v60v0h-60v0v60v0h-120v120v0h120v0v-60v0h120v0v60v0h-60v0v60v0h-240v0zM328 278v-120
-h-120v120h120z" />
- <glyph glyph-name="adieresis" unicode="ä"
-d="M136 440v-60v0h202v-141v0h-202v0v-60v0h-60v0v-120v0h60v0v-60v0h322v0v381v0h-60v0v60v0h-262v0zM338 179v-120h-134v120h134zM81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0z" />
- <glyph glyph-name="Adieresis" unicode="Ä"
-d="M57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0zM198 576v-66v0h-68v0v-69v0h-66v0v-442v0h134v0v180h139v-180v0h134v0v442v0h-66v0v69v0h-68v0v66v0h-139v0zM337 441v-202h-139v0v202h139z" />
- <glyph glyph-name="odieresis" unicode="ö"
-d="M81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0zM141 447v-60v0h-60v0v-327v0h60v0v-60v0h240v0v60v0h60v0v327v0h-60v0v60v0h-240v0zM321 387v-327h-120v0v327h120z" />
- <glyph glyph-name="Odieresis" unicode="Ö"
-d="M119 580v-70v0h-60v0v-447v0h60v0v-60v0h279v0v60v0h60v0v447v0h-60v0v70v0h-279v0zM338 510v0v-447h-143v0v447h143zM57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0z" />
- <glyph glyph-name="udieresis" unicode="ü"
-d="M83 435v-377v0h60v0v-60v0h300v0v437v0h-120v0v-377h-120v0v377v0h-120v0zM81 641v-120v0h120v0v120v0h-120v0zM321 641v-120v0h120v0v120v0h-120v0z" />
- <glyph glyph-name="Udieresis" unicode="Ü"
-d="M59 572v-513v0h60v0v-60v0h281v0v60v0h60v0v513v0h-120v0v-513h-149v0v513v0h-132v0zM57 770v-129v0h134v0v129v0h-134v0zM330 770v-129v0h134v0v129v0h-134v0z" />
- <glyph glyph-name="germandbls" unicode="ß"
-d="M138 576v-60v0h-60v0v-517v0h120v0v517v0h60v-204v0h60v0v-253v0h-60v0v-60v0h120v0v60v0h60v0v253v0h-60v0v204v0h-60v0v60v0h-180v0z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001" unicode="…"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001" unicode="
"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="uni0001"
-d="M67 600h400v-600h-400v600z" />
- <glyph glyph-name="glyph124"
-d="M267 600h133v-267h-200z" />
- <glyph glyph-name="uni0091"
-d="M266 600h132v-66h-68v-68h68v-133h-200v201h68v66z" />
- <glyph glyph-name="uni0092"
-d="M200 600h200v-199h-67v-68h-133v68h66v67h-66v132z" />
- <glyph glyph-name="exclamdown" unicode="¡"
-d="M200 400h133v-133h-133v133zM200 200h132v-133h68v-200h-67v-67h-133v67h-67v200h67v133z" />
- <glyph glyph-name="cent" unicode="¢"
-d="M200 600h133v-133h66v-67h67v-67h-133v67h-133v-267h132v67h133v-66h-65v-66h-67v-135h-133v135h-67v65h-66v267h65v68h68v132z" />
- <glyph glyph-name="sterling" unicode="£"
-d="M0 133h67v135h-67v65h67v200h66v67h267v-66h66v-67h-133v66h-133v-200h200v-65h-201v-134h-66v-67h334v-67h-467v133z" />
- <glyph glyph-name="currency" unicode="¤"
-d="M200 400v-133h133v133h-133zM67 533h132v-66h134v66h134v-66h-67v-67h66v-133h-67v-66h68v-68h-134v68h-133v-68h-133v67h66v67h-66v133h66v67h-66v66z" />
- <glyph glyph-name="yen" unicode="¥"
-d="M67 600h132v-199h134v199h133v-199h-66v-68h66v-66h-133v-67h132v-67h-132v-133h-133v133h-133v67h133v67h-133v66h65v68h-65v199z" />
- <glyph glyph-name="brokenbar" unicode="¦"
-d="M200 133h133v-333h-133v333zM200 600h133v-333h-133v333z" />
- <glyph glyph-name="dieresis" unicode="¨"
-d="M67 667h133v-134h-133v134zM333 667h134v-134h-134v134z" />
- <glyph glyph-name="uni00AD" unicode="­"
-d="M466 268h-400v65h400v-65z" />
- <glyph glyph-name="macron" unicode="¯"
-d="M0 800h532v-66h-532v66z" />
- <glyph glyph-name="periodcentered" unicode="·"
-d="M200 400h200v-133h-200v133z" />
- <glyph glyph-name="logicalnot" unicode="¬"
-d="M467 333v-200h-135v134h-265v66h400z" />
- <glyph glyph-name="uni00B2" unicode="²"
-d="M133 600h200v-67h67v-66h-68v-66h-65v-68h133v-66h-267v133h67v67h67v66h-134v67z" />
- <glyph glyph-name="plusminus" unicode="±"
-d="M466 68v-68h-399v68h399zM200 467h133v-134h133v-66h-133v-134h-133v134h-133v66h133v134z" />
- <glyph glyph-name="uni00B3" unicode="³"
-d="M133 600h200v-67h67v-65h-67v-67h66v-67h-66v-67h-200v66h134v68h-67v66h67v66h-134v67z" />
- <glyph glyph-name="divide" unicode="÷"
-d="M200 200h133v-133h-133v133zM200 533h133v-133h-133v133zM465 333v-66h-398v66h398z" />
- <glyph glyph-name="edieresis" unicode="ë"
-d="M67 667h133v-134h-133v134zM200 400v-133h133v133h-133zM133 467h266v-67h68v-200h-267v-133h199v-66h-266v66h-66v334h66v66zM333 667h134v-134h-134v134z" />
- <glyph glyph-name="copyright" unicode="©"
-d="M200 467h132v-67h68v-67h-67v68h-133v-201h-67v200h67v67zM67 468v-334h66v-66h267v66h67v335h-67v65h-268v-66h-65zM0 533h66v67h399v-67h68v-466h-67v-67h-399v67h-67v466zM200 200h133v67h67v-66h-68v-67h-132v66z" />
- <glyph glyph-name="ordfeminine" unicode="ª"
-d="M200 400v-67h133v67h-133zM467 200v-67h-400v67h400zM134 601h266v-68h67v-266h-335v66h-65v67h65v67h201v66h-199v68z" />
- <glyph glyph-name="guillemotleft" unicode="«"
-d="M266 334v-66h-68v-66h-66v-68h66v-67h68v-66h-133v67h-67v66h-67v66h67v67h66v67h134zM400 334h133v-65h-67v-67h-66v-68h64v-66h69v-68h-133v67h-68v67h-65v66h66v66h67v68z" />
- <glyph glyph-name="registered" unicode="®"
-d="M67 467v-333h66v-66h267v66h66v333h-66v66h-267v-66h-66zM132 133v334h200v-67h68v-133h-67v133h-133v-132h132v-68h67v-66h-67v67h-133v-68h-67zM0 533h67v67h398v-67h68v-466h-67v-67h-400v67h-66v466z" />
- <glyph glyph-name="egrave" unicode="è"
-d="M200 400v-133h133v133h-133zM333 600v-67h-134v67h-66v67h-66v67h199v-134h67zM133 467h267v-67h66v-200h-266v-133h199v-68h-266v68h-66v333h66v67z" />
- <glyph glyph-name="eacute" unicode="é"
-d="M200 400v-133h133v133h-133zM133 467h267v-67h67v-200h-267v-133h199v-68h-266v68h-66v334h66v66zM267 733h198v-65h-65v-67h-67v-68h-133v67h67v133z" />
- <glyph glyph-name="ecircumflex" unicode="ê"
-d="M200 400v-133h133v133h-133zM133 467h267v-67h67v-200h-267v-133h199v-66h-266v66h-66v334h66v66zM200 733h132v-66h68v-66h66v-67h-134v66h-132v-67h-133v68h66v66h67v66z" />
- <glyph glyph-name="Agrave" unicode="À"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM129 803h133v-67h66v-67h-133v67h-66v67z" />
- <glyph glyph-name="Aacute" unicode="Á"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM263 737v66h134v-65h-68v-68h-131v67h65z" />
- <glyph glyph-name="Acircumflex" unicode="Â"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM130 803h267v-66h67v-68h-134v67h-133v-66h-133v66h66v67z" />
- <glyph glyph-name="Atilde" unicode="Ã"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5h-120q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5q-2 -2 -11 -3
-t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM129 803h200v-66h67v66h132v-67h-67v-65h-198v65h-67v-65h-133v65h66v67z" />
- <glyph glyph-name="Aring" unicode="Å"
-d="M59 470v-470h135v200h130v-200h135v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t75.5 6.5v71h66v63h-65v66h-265v-65h-68v-64h65v-69q75 0 74.5 -8.5t-2 -18
-t-4 -18t-5.5 -11.5q-2 -2 -11 -3t-19.5 -2t-19.5 -2.5t-10 -2.5q-2 -2 -3 -11t-2 -19.5t-2.5 -19.5t-2.5 -10q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5zM199 470h120v-190h-120v190zM194 739h133v-66h-133v66z" />
- <glyph glyph-name="Egrave" unicode="È"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM127 805h131v-64h67v-63h-134v62h-64v65z" />
- <glyph glyph-name="Eacute" unicode="É"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM260 803h132v-66h-66v-66h-133v66h67v66z" />
- <glyph glyph-name="Ecircumflex" unicode="Ê"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM129 806h265v-66h67v-66h-132v65h-134v-66h-133v67h67v66z" />
- <glyph glyph-name="Edieresis" unicode="Ë"
-d="M59 610v-610h400v65h-260v210h190v60h-190v210h260v65h-400v0zM62 807h132v-133h-132v133zM326 806h132v-133h-132v133z" />
- <glyph glyph-name="Igrave" unicode="Ì"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM127 806h133v-67h66v-65h-133v66h-66v66z" />
- <glyph glyph-name="Iacute" unicode="Í"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM261 805h132v-67h-66v-66h-133v65h67v68z" />
- <glyph glyph-name="Icircumflex" unicode="Î"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM124 809h266v-66h67v-66h-133v66h-134v-66h-132v65h66v67z" />
- <glyph glyph-name="Idieresis" unicode="Ï"
-d="M124 65v-65h260v65h-60v480h60v65h-260v-65h60v-480h-60v0zM55 813h133v-131h-133v131zM322 812h132v-132h-132v132z" />
- <glyph glyph-name="Ograve" unicode="Ò"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM142 808h133v-66h67v-68h-133v68h-67v66z" />
- <glyph glyph-name="Oacute" unicode="Ó"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM276 806h132v-66h-66v-66h-133v65h67v67z" />
- <glyph glyph-name="Ocircumflex" unicode="Ô"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM141 808h266v-68h66v-65h-132v67h-133v-66h-133v65h66v67z" />
- <glyph glyph-name="Otilde" unicode="Õ"
-d="M75 69q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v470q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470zM215 539h120v-470h-120v470zM138 807h200v-66h67v66h132v-66h-66v-66h-199v65h-67v-65h-133v65h66v67z" />
- <glyph glyph-name="Ugrave" unicode="Ù"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540zM124 809h133v-65h65v-67h-131v67h-67v65z" />
- <glyph glyph-name="Uacute" unicode="Ú"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540zM259 809h133v-66h-68v-66h-132v66h67v66z" />
- <glyph glyph-name="Ucircumflex" unicode="Û"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v540h-135v-540h-130v540h-135v-540zM124 809h268v-66h65v-65h-132v65h-132v-66h-134v66h65v66z" />
- <glyph glyph-name="ograve" unicode="ò"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM59 742h200v-133h66v-67h-132v67h-68v67h-66v66z" />
- <glyph glyph-name="oacute" unicode="ó"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM254 741h199v-66h-65v-67h-67v-67h-133v66h66v134z" />
- <glyph glyph-name="ocircumflex" unicode="ô"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM192 737h133v-66h67v-68h65v-66h-132v67h-134v-68h-132v67h65v67h68v67z" />
- <glyph glyph-name="otilde" unicode="õ"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18
-t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330zM199 400h120v-330h-120v330zM0 672h67v65h199v-66h66v-67h68v68h65v65h67v-132h-67l1 -67h-199v67h-67v67h-68v-68h-66v-66h-66v134z" />
- <glyph glyph-name="ugrave" unicode="ù"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400zM58 738h199v-132h67v-68h-133v68h-67v67h-66v65z" />
- <glyph glyph-name="uacute" unicode="ú"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400zM259 737h199v-66h-66v-66h-67v-67h-133v66h67v133z" />
- <glyph glyph-name="ucircumflex" unicode="û"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v470h-135v-400h-130v400h-135v-400zM193 736h132v-65h67v-67h66v-67h-133v67h-133v-68h-132v67h66v67h67v66z" />
- <glyph glyph-name="Ntilde" unicode="Ñ"
-d="M63 610v-610h135v311q3 0 11 4t16.5 8t16.5 6.5t11 0.5t5.5 -9t4 -15t2 -15.5t-1.5 -10.5q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5q1 -2 2.5 -11t2.5 -19.5t2 -19.5t3 -10q3 -3 12 -5.5t19.5 -4t20 -2t13.5 1.5v-200h135v610h-135v-270h-65q2 4 1.5 12.5t-2 18t-4 18
-t-5.5 11.5q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 12t-4 19.5t-2 20t1.5 13.5h-55v135h-135zM132 800h201v-66h66l1 66h132v-66h-66v-66h-199v66h-68v-66h-134v66h67v66z" />
- <glyph glyph-name="Eth" unicode="Ð"
-d="M55 611v-271h-55v-64h54v-276h260q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5q1 1 10 2.5t19.5 2.5t19.5 2t11 3q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 11.5 5.5t18 4t18 2t12.5 -1.5v330q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5q-2 1 -3 10t-2 19.5t-2.5 19.5t-2.5 11
-q-2 1 -11 2.5t-19.5 2.5t-19.5 2t-10 3q-3 3 -5.5 11.5t-4 18t-2 18t1.5 12.5zM194 540h50q-2 -4 -1.5 -12.5t2 -18t4 -18t5.5 -11.5t11.5 -5.5t18 -4t18 -2t12.5 1.5v-330q-4 2 -12.5 1.5t-18 -2t-18 -4t-11.5 -5.5t-5.5 -11.5t-4 -18t-2 -18t1.5 -12.5h-50v205h67v65h-67
-v200z" />
- <glyph glyph-name="Yacute" unicode="Ý"
-d="M189 275v-275h130v275h70v60h65v275h-135v-270h-130v270h-135v-275h65v-60h70v0zM189 743h68v67h132v-66h-66v-66h-134v65z" />
- <glyph glyph-name="agrave" unicode="à"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM63 737h198v-133h66v-67h-133v67h-66v68h-65v65z" />
- <glyph glyph-name="aacute" unicode="á"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM459 739l1 -65h-67v-67h-66v-68h-133v67h67v133h198z" />
- <glyph glyph-name="acircumflex" unicode="â"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM461 606v-68h-133v68h-134v-67h-133v66h67v67h66v66h133v-66h67v-66h67z" />
- <glyph glyph-name="atilde" unicode="ã"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM532 736v-132h-67v-68h-198v67h-67v67h-68v-66h-66v-67h-66v133h67v67h200v-67h66v-67h66v67h66v66h67z" />
- <glyph glyph-name="aring" unicode="å"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h330v400q-4 -2 -12.5 -1.5t-18 2t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260v-65h190v-130h-190q2 -4 1.5 -13.5t-2 -20t-4 -19.5t-5.5 -12t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5
-v-130zM199 200h120v-130h-120v130zM459 674h-67v66h-266v-66h-66v-67h65v-67h268v68h66v66zM194 672h133v-67h-132z" />
- <glyph glyph-name="igrave" unicode="ì"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM194 537h133v67h-67v133h-200v-65h67v-67h67v-68z" />
- <glyph glyph-name="iacute" unicode="í"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM109 577zM257 606h-66v-67h132v67h67v67h67v65h-200v-132z" />
- <glyph glyph-name="icircumflex" unicode="î"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM192 737v-66h-67v-67h-66v-67h133v68h133v-67h134v66h-66v67h-67v66h-134v0z" />
- <glyph glyph-name="idieresis" unicode="ï"
-d="M59 65v-65h400v65h-135v405h-265v-65h130v-340h-130v0zM323 672v-135h134v135h-134v0zM58 672v-135h134v135h-134v0z" />
- <glyph glyph-name="ntilde" unicode="ñ"
-d="M59 470v-470h135v400h130v-400h135v400l-65 7v63h-335v0zM533 736v-133h-67v-68h-199v67h-67v67h-68v-66h-66v-68h-67v134h67v67h200v-66h66v-67h68v66h66v67h67z" />
- <glyph glyph-name="yacute" unicode="ý"
-d="M6 -139v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z
-M272 744h200v-66h-66v-67h-67v-68h-133v67h67z" />
- <glyph glyph-name="ydieresis" unicode="ÿ"
-d="M6 -139v-55h265v50q4 -2 13.5 -1.5t20 2t19.5 4t12 5.5q1 1 2.5 10t2.5 19.5t2 19.5t3 11q3 3 12 5.5t19.5 4t20 2t13.5 -1.5v135h65v405h-135v-400h-130v400h-135v-400q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -12t4 -19.5t2 -20t-1.5 -13.5h120v-70h-55v-70h-205z
-M207 674v-134h-133v134h133zM476 674v-134h-134v134h134z" />
- <glyph glyph-name="oslash" unicode="ø"
-d="M200 133v-66h133v133h-66v-67h-67zM200 400v-133h66v66h67v67h-133zM133 467h333v-400h-66v-67h-333v400h66v67z" />
- <glyph glyph-name="cedilla" unicode="¸"
-d="M200 0h132v-67h68v-65h-67v-68h-200v67h134v66h-67v67z" />
- <glyph glyph-name="uni00B9" unicode="¹"
-d="M200 600h133v-333h-133v200h-67v67h67v66z" />
- <glyph glyph-name="ordmasculine" unicode="º"
-d="M135 600v-66h-66v-201h65v-66h268v66h66v200h-66v67h-267zM466 200v-67h-399v67h399zM200 333v200h133v-200h-133z" />
- <glyph glyph-name="paragraph" unicode="¶"
-d="M533 600v-67h-67v-733h-133v333h-133v67h-67v67h-66v200h66v66h67v67h333z" />
- <glyph glyph-name="mu" unicode="µ"
-d="M199 467v-400h134v400h132v-400h68v-67h-133v68h-67v-68h-133v-132h-67v-68h-133v67h67v600h132z" />
- <glyph glyph-name="Thorn" unicode="Þ"
-d="M200 200h133v200h-133v-200zM67 600h133v-132h199v-68h66v-199h-66v-67h-199v-134h-133v600z" />
- <glyph glyph-name="thorn" unicode="þ"
-d="M200 68h133v266h-133v-266zM67 600h133v-199h199v-68h66v-266h-65v-67h-200v-200h-133v800z" />
- <glyph glyph-name="guillemotright" unicode="»"
-d="M266 334v-66h68v-66h66v-68h-66v-67h-68v-66h133v67h67v66h67v66h-67v67h-66v67h-134zM132 334h-133v-65h67v-67h66v-68h-64v-66h-69v-68h133v67h68v67h65v66h-66v66h-67v68z" />
- <glyph glyph-name="Ccedilla" unicode="Ç"
-d="M59 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h64v-66h72v-65h-137v-68h204v68h66v64h-67v67h58q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v470h125v-130h135v130q-4 -2 -12.5 -1.5t-18 2
-t-18 4t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-470z" />
- <glyph glyph-name="Oslash" unicode="Ø"
-d="M200 133v-66h133v201h-66v-135h-67zM199 533v-200h67v134h66v66h-133zM133 600l333 1v-534h-66v-67h-333v534h66v66z" />
- <glyph glyph-name="multiply" unicode="×"
-d="M67 200v-132h65v65h68v68h133v-67h66v-66h66v132h-66v67h-67v67h68v66h66v134h-66v-67h-67v-67h-134v68h-67v66h-65v-133h66v-67h66v-67h-67v-67h-65z" />
- <glyph glyph-name="questiondown" unicode="¿"
-d="M328 270v130h-120v-130h120zM329 72v125h-125v-120q-4 2 -13.5 1.5t-20 -2t-19.5 -4t-12 -5.5q-1 -1 -2.5 -10t-2.5 -19.5t-2 -19.5t-3 -11q-3 -3 -11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-130q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h260
-q-2 4 -1.5 12.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v130h-135v-130h-125v130q4 -2 12.5 -1.5t18 2t18 4t11.5 5.5t5.5 12t4 19.5t2 20t-1.5 13.5h50z" />
- <glyph glyph-name="ccedilla" unicode="ç"
-d="M56 70q4 2 12.5 1.5t18 -2t18 -4t11.5 -5.5t5.5 -11.5t4 -18t2 -18t-1.5 -12.5h67v-64h68v-63h-130v-69h198v69h66v62h-66v67h56q-1 2 -0.5 10.5t2 18t4 18t5.5 11.5t11.5 5.5t18 4t18 2t12.5 -1.5v60h-135v-60h-125v330h125v-60h135v60q-4 -2 -12.5 -1.5t-18 2t-18 4
-t-11.5 5.5t-5.5 11.5t-4 18t-2 18t1.5 12.5h-260q2 -4 1.5 -12.5t-2 -18t-4 -18t-5.5 -11.5t-11.5 -5.5t-18 -4t-18 -2t-12.5 1.5v-330z" />
- <glyph glyph-name="eth" unicode="ð"
-d="M200 334h133v-267h-133v267zM332 600v-67h-66v67h-133v-67h67v-66h-133v-67h133v-67h-133v-266h66v-67h267v68h65v333h-65v66h-68v67h133v66h-133zM200 400h67v67h-67v-67z" />
- <glyph glyph-name="ae" unicode="æ"
-d="M533 401v-200h-200v-133h199v-68h-199v68h-66v-68h-200v68h-67v133h66v67h134v133h-133v67h132v-67h67v67h199v-67h68zM333 267h67v133h-67v-133zM133 67h67v133h-67v-133z" />
- <glyph glyph-name="AE" unicode="Æ"
-d="M267 600h266v-67h-133v-199h132v-66h-132v-201h132v-67h-265v201h-68v-201h-132v400h65v67h67v66h68v67zM200 267h67v133h-67v-133z" />
- <glyph glyph-name="onequarter" unicode="¼"
-d="M67 667h132v-334h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h200v-334h-133v67h-200v133h-68v-66h-132v66h66v67h67v67h67v66h-134v200h-66v68h67v66zM333 67h67v66h-67v-66zM267 200h66v67h-66v-67zM200 133h67v67h-67v-67z" />
- <glyph glyph-name="onehalf" unicode="½"
-d="M67 667h132v-334h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h132v-66h67v-67h-67v-66h-65v-68h133v-67h-267v135h66v66h67v67h-199v-68h-68v-66h-132v66h66v67h67v67h67v66h-134v200h-66v68h67v66z" />
- <glyph glyph-name="threequarters" unicode="¾"
-d="M0 667h199v-67h67v-66h-67v-67h67v-66h-67v-68h68v68h66v66h66v66h134v-65h-68v-67h-66v-67h-66v-67h199v-334h-132v66h-200v135h67v66h66v67h-67v-66h-66v-68h-68v-66h-132v66h66v67h67v67h67v66h-200v68h132v67h-66v65h67v68h-133v66zM333 67h67v66h-67v-66z" />
- <glyph glyph-name="Euro" unicode="€"
-d="M125 625h311v-61h63v-64h-124v63h-188v-162h188v-57l-189 -1v-63h126v-64h-126v-153h188v62h125v-61h-62v-64h-313v64h-61v154h-63v63h63v63h-63v56h62v163h63v62z" />
- </font>
-</defs></svg>
diff --git a/web/static/css/fonts/Fixedsys500c.ttf b/web/static/css/fonts/Fixedsys500c.ttf
Binary files differ.
diff --git a/web/static/css/fonts/Fixedsys500c.woff b/web/static/css/fonts/Fixedsys500c.woff
Binary files differ.
diff --git a/web/static/css/fonts/Px437_IBM_EGA8.otf b/web/static/css/fonts/Px437_IBM_EGA8.otf
Binary files differ.
diff --git a/web/static/img/moncheeta.png b/web/static/img/moncheeta.png
Binary files differ.
diff --git a/web/static/js/bootstrap.js b/web/static/js/bootstrap.js
@@ -1,2425 +0,0 @@
-/* ===================================================
- * bootstrap-transition.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#transitions
- * ===================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
- * ======================================================= */
-
- $(function () {
- $.support.transition = (function () {
- var transitionEnd = (function () {
- var el = document.createElement("bootstrap"),
- transEndEventNames = {
- WebkitTransition: "webkitTransitionEnd",
- MozTransition: "transitionend",
- OTransition: "oTransitionEnd otransitionend",
- transition: "transitionend",
- },
- name;
-
- for (name in transEndEventNames) {
- if (el.style[name] !== undefined) {
- return transEndEventNames[name];
- }
- }
- })();
-
- return (
- transitionEnd && {
- end: transitionEnd,
- }
- );
- })();
- });
-})(window.jQuery); /* ==========================================================
- * bootstrap-alert.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#alerts
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* ALERT CLASS DEFINITION
- * ====================== */
-
- var dismiss = '[data-dismiss="alert"]',
- Alert = function (el) {
- $(el).on("click", dismiss, this.close);
- };
-
- Alert.prototype.close = function (e) {
- var $this = $(this),
- selector = $this.attr("data-target"),
- $parent;
-
- if (!selector) {
- selector = $this.attr("href");
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ""); //strip for ie7
- }
-
- $parent = $(selector);
-
- e && e.preventDefault();
-
- $parent.length ||
- ($parent = $this.hasClass("alert") ? $this : $this.parent());
-
- $parent.trigger((e = $.Event("close")));
-
- if (e.isDefaultPrevented()) return;
-
- $parent.removeClass("in");
-
- function removeElement() {
- $parent.trigger("closed").remove();
- }
-
- $.support.transition && $parent.hasClass("fade")
- ? $parent.on($.support.transition.end, removeElement)
- : removeElement();
- };
-
- /* ALERT PLUGIN DEFINITION
- * ======================= */
-
- var old = $.fn.alert;
-
- $.fn.alert = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("alert");
- if (!data) $this.data("alert", (data = new Alert(this)));
- if (typeof option == "string") data[option].call($this);
- });
- };
-
- $.fn.alert.Constructor = Alert;
-
- /* ALERT NO CONFLICT
- * ================= */
-
- $.fn.alert.noConflict = function () {
- $.fn.alert = old;
- return this;
- };
-
- /* ALERT DATA-API
- * ============== */
-
- $(document).on("click.alert.data-api", dismiss, Alert.prototype.close);
-})(
- window.jQuery,
-); /* ============================================================
- * bootstrap-button.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#buttons
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* BUTTON PUBLIC CLASS DEFINITION
- * ============================== */
-
- var Button = function (element, options) {
- this.$element = $(element);
- this.options = $.extend({}, $.fn.button.defaults, options);
- };
-
- Button.prototype.setState = function (state) {
- var d = "disabled",
- $el = this.$element,
- data = $el.data(),
- val = $el.is("input") ? "val" : "html";
-
- state = state + "Text";
- data.resetText || $el.data("resetText", $el[val]());
-
- $el[val](data[state] || this.options[state]);
-
- // push to event loop to allow forms to submit
- setTimeout(function () {
- state == "loadingText"
- ? $el.addClass(d).attr(d, d)
- : $el.removeClass(d).removeAttr(d);
- }, 0);
- };
-
- Button.prototype.toggle = function () {
- var $parent = this.$element.closest('[data-toggle="buttons-radio"]');
-
- $parent && $parent.find(".active").removeClass("active");
-
- this.$element.toggleClass("active");
- };
-
- /* BUTTON PLUGIN DEFINITION
- * ======================== */
-
- var old = $.fn.button;
-
- $.fn.button = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("button"),
- options = typeof option == "object" && option;
- if (!data) $this.data("button", (data = new Button(this, options)));
- if (option == "toggle") data.toggle();
- else if (option) data.setState(option);
- });
- };
-
- $.fn.button.defaults = {
- loadingText: "loading...",
- };
-
- $.fn.button.Constructor = Button;
-
- /* BUTTON NO CONFLICT
- * ================== */
-
- $.fn.button.noConflict = function () {
- $.fn.button = old;
- return this;
- };
-
- /* BUTTON DATA-API
- * =============== */
-
- $(document).on(
- "click.button.data-api",
- "[data-toggle^=button]",
- function (e) {
- var $btn = $(e.target);
- if (!$btn.hasClass("btn")) $btn = $btn.closest(".btn");
- $btn.button("toggle");
- },
- );
-})(window.jQuery); /* ==========================================================
- * bootstrap-carousel.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#carousel
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* CAROUSEL CLASS DEFINITION
- * ========================= */
-
- var Carousel = function (element, options) {
- this.$element = $(element);
- this.$indicators = this.$element.find(".carousel-indicators");
- this.options = options;
- this.options.pause == "hover" &&
- this.$element
- .on("mouseenter", $.proxy(this.pause, this))
- .on("mouseleave", $.proxy(this.cycle, this));
- };
-
- Carousel.prototype = {
- cycle: function (e) {
- if (!e) this.paused = false;
- if (this.interval) clearInterval(this.interval);
- this.options.interval &&
- !this.paused &&
- (this.interval = setInterval(
- $.proxy(this.next, this),
- this.options.interval,
- ));
- return this;
- },
-
- getActiveIndex: function () {
- this.$active = this.$element.find(".item.active");
- this.$items = this.$active.parent().children();
- return this.$items.index(this.$active);
- },
-
- to: function (pos) {
- var activeIndex = this.getActiveIndex(),
- that = this;
-
- if (pos > this.$items.length - 1 || pos < 0) return;
-
- if (this.sliding) {
- return this.$element.one("slid", function () {
- that.to(pos);
- });
- }
-
- if (activeIndex == pos) {
- return this.pause().cycle();
- }
-
- return this.slide(
- pos > activeIndex ? "next" : "prev",
- $(this.$items[pos]),
- );
- },
-
- pause: function (e) {
- if (!e) this.paused = true;
- if (
- this.$element.find(".next, .prev").length &&
- $.support.transition.end
- ) {
- this.$element.trigger($.support.transition.end);
- this.cycle(true);
- }
- clearInterval(this.interval);
- this.interval = null;
- return this;
- },
-
- next: function () {
- if (this.sliding) return;
- return this.slide("next");
- },
-
- prev: function () {
- if (this.sliding) return;
- return this.slide("prev");
- },
-
- slide: function (type, next) {
- var $active = this.$element.find(".item.active"),
- $next = next || $active[type](),
- isCycling = this.interval,
- direction = type == "next" ? "left" : "right",
- fallback = type == "next" ? "first" : "last",
- that = this,
- e;
-
- this.sliding = true;
-
- isCycling && this.pause();
-
- $next = $next.length ? $next : this.$element.find(".item")[fallback]();
-
- e = $.Event("slide", {
- relatedTarget: $next[0],
- direction: direction,
- });
-
- if ($next.hasClass("active")) return;
-
- if (this.$indicators.length) {
- this.$indicators.find(".active").removeClass("active");
- this.$element.one("slid", function () {
- var $nextIndicator = $(
- that.$indicators.children()[that.getActiveIndex()],
- );
- $nextIndicator && $nextIndicator.addClass("active");
- });
- }
-
- if ($.support.transition && this.$element.hasClass("slide")) {
- this.$element.trigger(e);
- if (e.isDefaultPrevented()) return;
- $next.addClass(type);
- $next[0].offsetWidth; // force reflow
- $active.addClass(direction);
- $next.addClass(direction);
- this.$element.one($.support.transition.end, function () {
- $next.removeClass([type, direction].join(" ")).addClass("active");
- $active.removeClass(["active", direction].join(" "));
- that.sliding = false;
- setTimeout(function () {
- that.$element.trigger("slid");
- }, 0);
- });
- } else {
- this.$element.trigger(e);
- if (e.isDefaultPrevented()) return;
- $active.removeClass("active");
- $next.addClass("active");
- this.sliding = false;
- this.$element.trigger("slid");
- }
-
- isCycling && this.cycle();
-
- return this;
- },
- };
-
- /* CAROUSEL PLUGIN DEFINITION
- * ========================== */
-
- var old = $.fn.carousel;
-
- $.fn.carousel = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("carousel"),
- options = $.extend(
- {},
- $.fn.carousel.defaults,
- typeof option == "object" && option,
- ),
- action = typeof option == "string" ? option : options.slide;
- if (!data) $this.data("carousel", (data = new Carousel(this, options)));
- if (typeof option == "number") data.to(option);
- else if (action) data[action]();
- else if (options.interval) data.pause().cycle();
- });
- };
-
- $.fn.carousel.defaults = {
- interval: 5000,
- pause: "hover",
- };
-
- $.fn.carousel.Constructor = Carousel;
-
- /* CAROUSEL NO CONFLICT
- * ==================== */
-
- $.fn.carousel.noConflict = function () {
- $.fn.carousel = old;
- return this;
- };
-
- /* CAROUSEL DATA-API
- * ================= */
-
- $(document).on(
- "click.carousel.data-api",
- "[data-slide], [data-slide-to]",
- function (e) {
- var $this = $(this),
- href,
- $target = $(
- $this.attr("data-target") ||
- ((href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "")),
- ), //strip for ie7
- options = $.extend({}, $target.data(), $this.data()),
- slideIndex;
-
- $target.carousel(options);
-
- if ((slideIndex = $this.attr("data-slide-to"))) {
- $target.data("carousel").pause().to(slideIndex).cycle();
- }
-
- e.preventDefault();
- },
- );
-})(
- window.jQuery,
-); /* =============================================================
- * bootstrap-collapse.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#collapse
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* COLLAPSE PUBLIC CLASS DEFINITION
- * ================================ */
-
- var Collapse = function (element, options) {
- this.$element = $(element);
- this.options = $.extend({}, $.fn.collapse.defaults, options);
-
- if (this.options.parent) {
- this.$parent = $(this.options.parent);
- }
-
- this.options.toggle && this.toggle();
- };
-
- Collapse.prototype = {
- constructor: Collapse,
-
- dimension: function () {
- var hasWidth = this.$element.hasClass("width");
- return hasWidth ? "width" : "height";
- },
-
- show: function () {
- var dimension, scroll, actives, hasData;
-
- if (this.transitioning || this.$element.hasClass("in")) return;
-
- dimension = this.dimension();
- scroll = $.camelCase(["scroll", dimension].join("-"));
- actives = this.$parent && this.$parent.find("> .accordion-group > .in");
-
- if (actives && actives.length) {
- hasData = actives.data("collapse");
- if (hasData && hasData.transitioning) return;
- actives.collapse("hide");
- hasData || actives.data("collapse", null);
- }
-
- this.$element[dimension](0);
- this.transition("addClass", $.Event("show"), "shown");
- $.support.transition &&
- this.$element[dimension](this.$element[0][scroll]);
- },
-
- hide: function () {
- var dimension;
- if (this.transitioning || !this.$element.hasClass("in")) return;
- dimension = this.dimension();
- this.reset(this.$element[dimension]());
- this.transition("removeClass", $.Event("hide"), "hidden");
- this.$element[dimension](0);
- },
-
- reset: function (size) {
- var dimension = this.dimension();
-
- this.$element.removeClass("collapse")[dimension](size || "auto")[0]
- .offsetWidth;
-
- this.$element[size !== null ? "addClass" : "removeClass"]("collapse");
-
- return this;
- },
-
- transition: function (method, startEvent, completeEvent) {
- var that = this,
- complete = function () {
- if (startEvent.type == "show") that.reset();
- that.transitioning = 0;
- that.$element.trigger(completeEvent);
- };
-
- this.$element.trigger(startEvent);
-
- if (startEvent.isDefaultPrevented()) return;
-
- this.transitioning = 1;
-
- this.$element[method]("in");
-
- $.support.transition && this.$element.hasClass("collapse")
- ? this.$element.one($.support.transition.end, complete)
- : complete();
- },
-
- toggle: function () {
- this[this.$element.hasClass("in") ? "hide" : "show"]();
- },
- };
-
- /* COLLAPSE PLUGIN DEFINITION
- * ========================== */
-
- var old = $.fn.collapse;
-
- $.fn.collapse = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("collapse"),
- options = $.extend(
- {},
- $.fn.collapse.defaults,
- $this.data(),
- typeof option == "object" && option,
- );
- if (!data) $this.data("collapse", (data = new Collapse(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.collapse.defaults = {
- toggle: true,
- };
-
- $.fn.collapse.Constructor = Collapse;
-
- /* COLLAPSE NO CONFLICT
- * ==================== */
-
- $.fn.collapse.noConflict = function () {
- $.fn.collapse = old;
- return this;
- };
-
- /* COLLAPSE DATA-API
- * ================= */
-
- $(document).on(
- "click.collapse.data-api",
- "[data-toggle=collapse]",
- function (e) {
- var $this = $(this),
- href,
- target =
- $this.attr("data-target") ||
- e.preventDefault() ||
- ((href = $this.attr("href")) && href.replace(/.*(?=#[^\s]+$)/, "")), //strip for ie7
- option = $(target).data("collapse") ? "toggle" : $this.data();
- $this[$(target).hasClass("in") ? "addClass" : "removeClass"]("collapsed");
- $(target).collapse(option);
- },
- );
-})(
- window.jQuery,
-); /* ============================================================
- * bootstrap-dropdown.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#dropdowns
- * ============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* DROPDOWN CLASS DEFINITION
- * ========================= */
-
- var toggle = "[data-toggle=dropdown]",
- Dropdown = function (element) {
- var $el = $(element).on("click.dropdown.data-api", this.toggle);
- $("html").on("click.dropdown.data-api", function () {
- $el.parent().removeClass("open");
- });
- };
-
- Dropdown.prototype = {
- constructor: Dropdown,
-
- toggle: function (e) {
- var $this = $(this),
- $parent,
- isActive;
-
- if ($this.is(".disabled, :disabled")) return;
-
- $parent = getParent($this);
-
- isActive = $parent.hasClass("open");
-
- clearMenus();
-
- if (!isActive) {
- $parent.toggleClass("open");
- }
-
- $this.focus();
-
- return false;
- },
-
- keydown: function (e) {
- var $this, $items, $active, $parent, isActive, index;
-
- if (!/(38|40|27)/.test(e.keyCode)) return;
-
- $this = $(this);
-
- e.preventDefault();
- e.stopPropagation();
-
- if ($this.is(".disabled, :disabled")) return;
-
- $parent = getParent($this);
-
- isActive = $parent.hasClass("open");
-
- if (!isActive || (isActive && e.keyCode == 27)) {
- if (e.which == 27) $parent.find(toggle).focus();
- return $this.click();
- }
-
- $items = $("[role=menu] li:not(.divider):visible a", $parent);
-
- if (!$items.length) return;
-
- index = $items.index($items.filter(":focus"));
-
- if (e.keyCode == 38 && index > 0) index--; // up
- if (e.keyCode == 40 && index < $items.length - 1) index++; // down
- if (!~index) index = 0;
-
- $items.eq(index).focus();
- },
- };
-
- function clearMenus() {
- $(toggle).each(function () {
- getParent($(this)).removeClass("open");
- });
- }
-
- function getParent($this) {
- var selector = $this.attr("data-target"),
- $parent;
-
- if (!selector) {
- selector = $this.attr("href");
- selector =
- selector &&
- /#/.test(selector) &&
- selector.replace(/.*(?=#[^\s]*$)/, ""); //strip for ie7
- }
-
- $parent = selector && $(selector);
-
- if (!$parent || !$parent.length) $parent = $this.parent();
-
- return $parent;
- }
-
- /* DROPDOWN PLUGIN DEFINITION
- * ========================== */
-
- var old = $.fn.dropdown;
-
- $.fn.dropdown = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("dropdown");
- if (!data) $this.data("dropdown", (data = new Dropdown(this)));
- if (typeof option == "string") data[option].call($this);
- });
- };
-
- $.fn.dropdown.Constructor = Dropdown;
-
- /* DROPDOWN NO CONFLICT
- * ==================== */
-
- $.fn.dropdown.noConflict = function () {
- $.fn.dropdown = old;
- return this;
- };
-
- /* APPLY TO STANDARD DROPDOWN ELEMENTS
- * =================================== */
-
- $(document)
- .on("click.dropdown.data-api", clearMenus)
- .on("click.dropdown.data-api", ".dropdown form", function (e) {
- e.stopPropagation();
- })
- .on("click.dropdown-menu", function (e) {
- e.stopPropagation();
- })
- .on("click.dropdown.data-api", toggle, Dropdown.prototype.toggle)
- .on(
- "keydown.dropdown.data-api",
- toggle + ", [role=menu]",
- Dropdown.prototype.keydown,
- );
-})(window.jQuery);
-/* =========================================================
- * bootstrap-modal.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#modals
- * =========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================= */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* MODAL CLASS DEFINITION
- * ====================== */
-
- var Modal = function (element, options) {
- this.options = options;
- this.$element = $(element).delegate(
- '[data-dismiss="modal"]',
- "click.dismiss.modal",
- $.proxy(this.hide, this),
- );
- this.options.remote &&
- this.$element.find(".modal-body").load(this.options.remote);
- };
-
- Modal.prototype = {
- constructor: Modal,
-
- toggle: function () {
- return this[!this.isShown ? "show" : "hide"]();
- },
-
- show: function () {
- var that = this,
- e = $.Event("show");
-
- this.$element.trigger(e);
-
- if (this.isShown || e.isDefaultPrevented()) return;
-
- this.isShown = true;
-
- this.escape();
-
- this.backdrop(function () {
- var transition = $.support.transition && that.$element.hasClass("fade");
-
- if (!that.$element.parent().length) {
- that.$element.appendTo(document.body); //don't move modals dom position
- }
-
- that.$element.show();
-
- if (transition) {
- that.$element[0].offsetWidth; // force reflow
- }
-
- that.$element.addClass("in").attr("aria-hidden", false);
-
- that.enforceFocus();
-
- transition
- ? that.$element.one($.support.transition.end, function () {
- that.$element.focus().trigger("shown");
- })
- : that.$element.focus().trigger("shown");
- });
- },
-
- hide: function (e) {
- e && e.preventDefault();
-
- var that = this;
-
- e = $.Event("hide");
-
- this.$element.trigger(e);
-
- if (!this.isShown || e.isDefaultPrevented()) return;
-
- this.isShown = false;
-
- this.escape();
-
- $(document).off("focusin.modal");
-
- this.$element.removeClass("in").attr("aria-hidden", true);
-
- $.support.transition && this.$element.hasClass("fade")
- ? this.hideWithTransition()
- : this.hideModal();
- },
-
- enforceFocus: function () {
- var that = this;
- $(document).on("focusin.modal", function (e) {
- if (
- that.$element[0] !== e.target &&
- !that.$element.has(e.target).length
- ) {
- that.$element.focus();
- }
- });
- },
-
- escape: function () {
- var that = this;
- if (this.isShown && this.options.keyboard) {
- this.$element.on("keyup.dismiss.modal", function (e) {
- e.which == 27 && that.hide();
- });
- } else if (!this.isShown) {
- this.$element.off("keyup.dismiss.modal");
- }
- },
-
- hideWithTransition: function () {
- var that = this,
- timeout = setTimeout(function () {
- that.$element.off($.support.transition.end);
- that.hideModal();
- }, 500);
-
- this.$element.one($.support.transition.end, function () {
- clearTimeout(timeout);
- that.hideModal();
- });
- },
-
- hideModal: function () {
- var that = this;
- this.$element.hide();
- this.backdrop(function () {
- that.removeBackdrop();
- that.$element.trigger("hidden");
- });
- },
-
- removeBackdrop: function () {
- this.$backdrop && this.$backdrop.remove();
- this.$backdrop = null;
- },
-
- backdrop: function (callback) {
- var that = this,
- animate = this.$element.hasClass("fade") ? "fade" : "";
-
- if (this.isShown && this.options.backdrop) {
- var doAnimate = $.support.transition && animate;
-
- this.$backdrop = $(
- '<div class="modal-backdrop ' + animate + '" />',
- ).appendTo(document.body);
-
- this.$backdrop.click(
- this.options.backdrop == "static"
- ? $.proxy(this.$element[0].focus, this.$element[0])
- : $.proxy(this.hide, this),
- );
-
- if (doAnimate) this.$backdrop[0].offsetWidth; // force reflow
-
- this.$backdrop.addClass("in");
-
- if (!callback) return;
-
- doAnimate
- ? this.$backdrop.one($.support.transition.end, callback)
- : callback();
- } else if (!this.isShown && this.$backdrop) {
- this.$backdrop.removeClass("in");
-
- $.support.transition && this.$element.hasClass("fade")
- ? this.$backdrop.one($.support.transition.end, callback)
- : callback();
- } else if (callback) {
- callback();
- }
- },
- };
-
- /* MODAL PLUGIN DEFINITION
- * ======================= */
-
- var old = $.fn.modal;
-
- $.fn.modal = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("modal"),
- options = $.extend(
- {},
- $.fn.modal.defaults,
- $this.data(),
- typeof option == "object" && option,
- );
- if (!data) $this.data("modal", (data = new Modal(this, options)));
- if (typeof option == "string") data[option]();
- else if (options.show) data.show();
- });
- };
-
- $.fn.modal.defaults = {
- backdrop: true,
- keyboard: true,
- show: true,
- };
-
- $.fn.modal.Constructor = Modal;
-
- /* MODAL NO CONFLICT
- * ================= */
-
- $.fn.modal.noConflict = function () {
- $.fn.modal = old;
- return this;
- };
-
- /* MODAL DATA-API
- * ============== */
-
- $(document).on("click.modal.data-api", '[data-toggle="modal"]', function (e) {
- var $this = $(this),
- href = $this.attr("href"),
- $target = $(
- $this.attr("data-target") ||
- (href && href.replace(/.*(?=#[^\s]+$)/, "")),
- ), //strip for ie7
- option = $target.data("modal")
- ? "toggle"
- : $.extend(
- { remote: !/#/.test(href) && href },
- $target.data(),
- $this.data(),
- );
-
- e.preventDefault();
-
- $target.modal(option).one("hide", function () {
- $this.focus();
- });
- });
-})(window.jQuery);
-/* ===========================================================
- * bootstrap-tooltip.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#tooltips
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* TOOLTIP PUBLIC CLASS DEFINITION
- * =============================== */
-
- var Tooltip = function (element, options) {
- this.init("tooltip", element, options);
- };
-
- Tooltip.prototype = {
- constructor: Tooltip,
-
- init: function (type, element, options) {
- var eventIn, eventOut, triggers, trigger, i;
-
- this.type = type;
- this.$element = $(element);
- this.options = this.getOptions(options);
- this.enabled = true;
-
- triggers = this.options.trigger.split(" ");
-
- for (i = triggers.length; i--; ) {
- trigger = triggers[i];
- if (trigger == "click") {
- this.$element.on(
- "click." + this.type,
- this.options.selector,
- $.proxy(this.toggle, this),
- );
- } else if (trigger != "manual") {
- eventIn = trigger == "hover" ? "mouseenter" : "focus";
- eventOut = trigger == "hover" ? "mouseleave" : "blur";
- this.$element.on(
- eventIn + "." + this.type,
- this.options.selector,
- $.proxy(this.enter, this),
- );
- this.$element.on(
- eventOut + "." + this.type,
- this.options.selector,
- $.proxy(this.leave, this),
- );
- }
- }
-
- this.options.selector
- ? (this._options = $.extend({}, this.options, {
- trigger: "manual",
- selector: "",
- }))
- : this.fixTitle();
- },
-
- getOptions: function (options) {
- options = $.extend(
- {},
- $.fn[this.type].defaults,
- this.$element.data(),
- options,
- );
-
- if (options.delay && typeof options.delay == "number") {
- options.delay = {
- show: options.delay,
- hide: options.delay,
- };
- }
-
- return options;
- },
-
- enter: function (e) {
- var defaults = $.fn[this.type].defaults,
- options = {},
- self;
-
- this._options &&
- $.each(
- this._options,
- function (key, value) {
- if (defaults[key] != value) options[key] = value;
- },
- this,
- );
-
- self = $(e.currentTarget)[this.type](options).data(this.type);
-
- if (!self.options.delay || !self.options.delay.show) return self.show();
-
- clearTimeout(this.timeout);
- self.hoverState = "in";
- this.timeout = setTimeout(function () {
- if (self.hoverState == "in") self.show();
- }, self.options.delay.show);
- },
-
- leave: function (e) {
- var self = $(e.currentTarget)[this.type](this._options).data(this.type);
-
- if (this.timeout) clearTimeout(this.timeout);
- if (!self.options.delay || !self.options.delay.hide) return self.hide();
-
- self.hoverState = "out";
- this.timeout = setTimeout(function () {
- if (self.hoverState == "out") self.hide();
- }, self.options.delay.hide);
- },
-
- show: function () {
- var $tip,
- pos,
- actualWidth,
- actualHeight,
- placement,
- tp,
- e = $.Event("show");
-
- if (this.hasContent() && this.enabled) {
- this.$element.trigger(e);
- if (e.isDefaultPrevented()) return;
- $tip = this.tip();
- this.setContent();
-
- if (this.options.animation) {
- $tip.addClass("fade");
- }
-
- placement =
- typeof this.options.placement == "function"
- ? this.options.placement.call(this, $tip[0], this.$element[0])
- : this.options.placement;
-
- $tip.detach().css({ top: 0, left: 0, display: "block" });
-
- this.options.container
- ? $tip.appendTo(this.options.container)
- : $tip.insertAfter(this.$element);
-
- pos = this.getPosition();
-
- actualWidth = $tip[0].offsetWidth;
- actualHeight = $tip[0].offsetHeight;
-
- switch (placement) {
- case "bottom":
- tp = {
- top: pos.top + pos.height,
- left: pos.left + pos.width / 2 - actualWidth / 2,
- };
- break;
- case "top":
- tp = {
- top: pos.top - actualHeight,
- left: pos.left + pos.width / 2 - actualWidth / 2,
- };
- break;
- case "left":
- tp = {
- top: pos.top + pos.height / 2 - actualHeight / 2,
- left: pos.left - actualWidth,
- };
- break;
- case "right":
- tp = {
- top: pos.top + pos.height / 2 - actualHeight / 2,
- left: pos.left + pos.width,
- };
- break;
- }
-
- this.applyPlacement(tp, placement);
- this.$element.trigger("shown");
- }
- },
-
- applyPlacement: function (offset, placement) {
- var $tip = this.tip(),
- width = $tip[0].offsetWidth,
- height = $tip[0].offsetHeight,
- actualWidth,
- actualHeight,
- delta,
- replace;
-
- $tip.offset(offset).addClass(placement).addClass("in");
-
- actualWidth = $tip[0].offsetWidth;
- actualHeight = $tip[0].offsetHeight;
-
- if (placement == "top" && actualHeight != height) {
- offset.top = offset.top + height - actualHeight;
- replace = true;
- }
-
- if (placement == "bottom" || placement == "top") {
- delta = 0;
-
- if (offset.left < 0) {
- delta = offset.left * -2;
- offset.left = 0;
- $tip.offset(offset);
- actualWidth = $tip[0].offsetWidth;
- actualHeight = $tip[0].offsetHeight;
- }
-
- this.replaceArrow(delta - width + actualWidth, actualWidth, "left");
- } else {
- this.replaceArrow(actualHeight - height, actualHeight, "top");
- }
-
- if (replace) $tip.offset(offset);
- },
-
- replaceArrow: function (delta, dimension, position) {
- this.arrow().css(
- position,
- delta ? 50 * (1 - delta / dimension) + "%" : "",
- );
- },
-
- setContent: function () {
- var $tip = this.tip(),
- title = this.getTitle();
-
- $tip.find(".tooltip-inner")[this.options.html ? "html" : "text"](title);
- $tip.removeClass("fade in top bottom left right");
- },
-
- hide: function () {
- var that = this,
- $tip = this.tip(),
- e = $.Event("hide");
-
- this.$element.trigger(e);
- if (e.isDefaultPrevented()) return;
-
- $tip.removeClass("in");
-
- function removeWithAnimation() {
- var timeout = setTimeout(function () {
- $tip.off($.support.transition.end).detach();
- }, 500);
-
- $tip.one($.support.transition.end, function () {
- clearTimeout(timeout);
- $tip.detach();
- });
- }
-
- $.support.transition && this.$tip.hasClass("fade")
- ? removeWithAnimation()
- : $tip.detach();
-
- this.$element.trigger("hidden");
-
- return this;
- },
-
- fixTitle: function () {
- var $e = this.$element;
- if (
- $e.attr("title") ||
- typeof $e.attr("data-original-title") != "string"
- ) {
- $e.attr("data-original-title", $e.attr("title") || "").attr(
- "title",
- "",
- );
- }
- },
-
- hasContent: function () {
- return this.getTitle();
- },
-
- getPosition: function () {
- var el = this.$element[0];
- return $.extend(
- {},
- typeof el.getBoundingClientRect == "function"
- ? el.getBoundingClientRect()
- : {
- width: el.offsetWidth,
- height: el.offsetHeight,
- },
- this.$element.offset(),
- );
- },
-
- getTitle: function () {
- var title,
- $e = this.$element,
- o = this.options;
-
- title =
- $e.attr("data-original-title") ||
- (typeof o.title == "function" ? o.title.call($e[0]) : o.title);
-
- return title;
- },
-
- tip: function () {
- return (this.$tip = this.$tip || $(this.options.template));
- },
-
- arrow: function () {
- return (this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow"));
- },
-
- validate: function () {
- if (!this.$element[0].parentNode) {
- this.hide();
- this.$element = null;
- this.options = null;
- }
- },
-
- enable: function () {
- this.enabled = true;
- },
-
- disable: function () {
- this.enabled = false;
- },
-
- toggleEnabled: function () {
- this.enabled = !this.enabled;
- },
-
- toggle: function (e) {
- var self = e
- ? $(e.currentTarget)[this.type](this._options).data(this.type)
- : this;
- self.tip().hasClass("in") ? self.hide() : self.show();
- },
-
- destroy: function () {
- this.hide()
- .$element.off("." + this.type)
- .removeData(this.type);
- },
- };
-
- /* TOOLTIP PLUGIN DEFINITION
- * ========================= */
-
- var old = $.fn.tooltip;
-
- $.fn.tooltip = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("tooltip"),
- options = typeof option == "object" && option;
- if (!data) $this.data("tooltip", (data = new Tooltip(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.tooltip.Constructor = Tooltip;
-
- $.fn.tooltip.defaults = {
- animation: true,
- placement: "top",
- selector: false,
- template:
- '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
- trigger: "hover focus",
- title: "",
- delay: 0,
- html: false,
- container: false,
- };
-
- /* TOOLTIP NO CONFLICT
- * =================== */
-
- $.fn.tooltip.noConflict = function () {
- $.fn.tooltip = old;
- return this;
- };
-})(window.jQuery);
-/* ===========================================================
- * bootstrap-popover.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#popovers
- * ===========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* POPOVER PUBLIC CLASS DEFINITION
- * =============================== */
-
- var Popover = function (element, options) {
- this.init("popover", element, options);
- };
-
- /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
- ========================================== */
-
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
- constructor: Popover,
-
- setContent: function () {
- var $tip = this.tip(),
- title = this.getTitle(),
- content = this.getContent();
-
- $tip.find(".popover-title")[this.options.html ? "html" : "text"](title);
- $tip
- .find(".popover-content")
- [this.options.html ? "html" : "text"](content);
-
- $tip.removeClass("fade top bottom left right in");
- },
-
- hasContent: function () {
- return this.getTitle() || this.getContent();
- },
-
- getContent: function () {
- var content,
- $e = this.$element,
- o = this.options;
-
- content =
- (typeof o.content == "function" ? o.content.call($e[0]) : o.content) ||
- $e.attr("data-content");
-
- return content;
- },
-
- tip: function () {
- if (!this.$tip) {
- this.$tip = $(this.options.template);
- }
- return this.$tip;
- },
-
- destroy: function () {
- this.hide()
- .$element.off("." + this.type)
- .removeData(this.type);
- },
- });
-
- /* POPOVER PLUGIN DEFINITION
- * ======================= */
-
- var old = $.fn.popover;
-
- $.fn.popover = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("popover"),
- options = typeof option == "object" && option;
- if (!data) $this.data("popover", (data = new Popover(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.popover.Constructor = Popover;
-
- $.fn.popover.defaults = $.extend({}, $.fn.tooltip.defaults, {
- placement: "right",
- trigger: "click",
- content: "",
- template:
- '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
- });
-
- /* POPOVER NO CONFLICT
- * =================== */
-
- $.fn.popover.noConflict = function () {
- $.fn.popover = old;
- return this;
- };
-})(window.jQuery);
-/* =============================================================
- * bootstrap-scrollspy.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#scrollspy
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* SCROLLSPY CLASS DEFINITION
- * ========================== */
-
- function ScrollSpy(element, options) {
- var process = $.proxy(this.process, this),
- $element = $(element).is("body") ? $(window) : $(element),
- href;
- this.options = $.extend({}, $.fn.scrollspy.defaults, options);
- this.$scrollElement = $element.on("scroll.scroll-spy.data-api", process);
- this.selector =
- (this.options.target ||
- ((href = $(element).attr("href")) &&
- href.replace(/.*(?=#[^\s]+$)/, "")) || //strip for ie7
- "") + " .nav li > a";
- this.$body = $("body");
- this.refresh();
- this.process();
- }
-
- ScrollSpy.prototype = {
- constructor: ScrollSpy,
-
- refresh: function () {
- var self = this,
- $targets;
-
- this.offsets = $([]);
- this.targets = $([]);
-
- $targets = this.$body
- .find(this.selector)
- .map(function () {
- var $el = $(this),
- href = $el.data("target") || $el.attr("href"),
- $href = /^#\w/.test(href) && $(href);
- return (
- ($href &&
- $href.length && [
- [
- $href.position().top +
- (!$.isWindow(self.$scrollElement.get(0)) &&
- self.$scrollElement.scrollTop()),
- href,
- ],
- ]) ||
- null
- );
- })
- .sort(function (a, b) {
- return a[0] - b[0];
- })
- .each(function () {
- self.offsets.push(this[0]);
- self.targets.push(this[1]);
- });
- },
-
- process: function () {
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset,
- scrollHeight =
- this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight,
- maxScroll = scrollHeight - this.$scrollElement.height(),
- offsets = this.offsets,
- targets = this.targets,
- activeTarget = this.activeTarget,
- i;
-
- if (scrollTop >= maxScroll) {
- return activeTarget != (i = targets.last()[0]) && this.activate(i);
- }
-
- for (i = offsets.length; i--; ) {
- activeTarget != targets[i] &&
- scrollTop >= offsets[i] &&
- (!offsets[i + 1] || scrollTop <= offsets[i + 1]) &&
- this.activate(targets[i]);
- }
- },
-
- activate: function (target) {
- var active, selector;
-
- this.activeTarget = target;
-
- $(this.selector).parent(".active").removeClass("active");
-
- selector =
- this.selector +
- '[data-target="' +
- target +
- '"],' +
- this.selector +
- '[href="' +
- target +
- '"]';
-
- active = $(selector).parent("li").addClass("active");
-
- if (active.parent(".dropdown-menu").length) {
- active = active.closest("li.dropdown").addClass("active");
- }
-
- active.trigger("activate");
- },
- };
-
- /* SCROLLSPY PLUGIN DEFINITION
- * =========================== */
-
- var old = $.fn.scrollspy;
-
- $.fn.scrollspy = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("scrollspy"),
- options = typeof option == "object" && option;
- if (!data) $this.data("scrollspy", (data = new ScrollSpy(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.scrollspy.Constructor = ScrollSpy;
-
- $.fn.scrollspy.defaults = {
- offset: 10,
- };
-
- /* SCROLLSPY NO CONFLICT
- * ===================== */
-
- $.fn.scrollspy.noConflict = function () {
- $.fn.scrollspy = old;
- return this;
- };
-
- /* SCROLLSPY DATA-API
- * ================== */
-
- $(window).on("load", function () {
- $('[data-spy="scroll"]').each(function () {
- var $spy = $(this);
- $spy.scrollspy($spy.data());
- });
- });
-})(window.jQuery); /* ========================================================
- * bootstrap-tab.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#tabs
- * ========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* TAB CLASS DEFINITION
- * ==================== */
-
- var Tab = function (element) {
- this.element = $(element);
- };
-
- Tab.prototype = {
- constructor: Tab,
-
- show: function () {
- var $this = this.element,
- $ul = $this.closest("ul:not(.dropdown-menu)"),
- selector = $this.attr("data-target"),
- previous,
- $target,
- e;
-
- if (!selector) {
- selector = $this.attr("href");
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ""); //strip for ie7
- }
-
- if ($this.parent("li").hasClass("active")) return;
-
- previous = $ul.find(".active:last a")[0];
-
- e = $.Event("show", {
- relatedTarget: previous,
- });
-
- $this.trigger(e);
-
- if (e.isDefaultPrevented()) return;
-
- $target = $(selector);
-
- this.activate($this.parent("li"), $ul);
- this.activate($target, $target.parent(), function () {
- $this.trigger({
- type: "shown",
- relatedTarget: previous,
- });
- });
- },
-
- activate: function (element, container, callback) {
- var $active = container.find("> .active"),
- transition =
- callback && $.support.transition && $active.hasClass("fade");
-
- function next() {
- $active
- .removeClass("active")
- .find("> .dropdown-menu > .active")
- .removeClass("active");
-
- element.addClass("active");
-
- if (transition) {
- element[0].offsetWidth; // reflow for transition
- element.addClass("in");
- } else {
- element.removeClass("fade");
- }
-
- if (element.parent(".dropdown-menu")) {
- element.closest("li.dropdown").addClass("active");
- }
-
- callback && callback();
- }
-
- transition ? $active.one($.support.transition.end, next) : next();
-
- $active.removeClass("in");
- },
- };
-
- /* TAB PLUGIN DEFINITION
- * ===================== */
-
- var old = $.fn.tab;
-
- $.fn.tab = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("tab");
- if (!data) $this.data("tab", (data = new Tab(this)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.tab.Constructor = Tab;
-
- /* TAB NO CONFLICT
- * =============== */
-
- $.fn.tab.noConflict = function () {
- $.fn.tab = old;
- return this;
- };
-
- /* TAB DATA-API
- * ============ */
-
- $(document).on(
- "click.tab.data-api",
- '[data-toggle="tab"], [data-toggle="pill"]',
- function (e) {
- e.preventDefault();
- $(this).tab("show");
- },
- );
-})(
- window.jQuery,
-); /* =============================================================
- * bootstrap-typeahead.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* TYPEAHEAD PUBLIC CLASS DEFINITION
- * ================================= */
-
- var Typeahead = function (element, options) {
- this.$element = $(element);
- this.options = $.extend({}, $.fn.typeahead.defaults, options);
- this.matcher = this.options.matcher || this.matcher;
- this.sorter = this.options.sorter || this.sorter;
- this.highlighter = this.options.highlighter || this.highlighter;
- this.updater = this.options.updater || this.updater;
- this.source = this.options.source;
- this.$menu = $(this.options.menu);
- this.shown = false;
- this.listen();
- };
-
- Typeahead.prototype = {
- constructor: Typeahead,
-
- select: function () {
- var val = this.$menu.find(".active").attr("data-value");
- this.$element.val(this.updater(val)).change();
- return this.hide();
- },
-
- updater: function (item) {
- return item;
- },
-
- show: function () {
- var pos = $.extend({}, this.$element.position(), {
- height: this.$element[0].offsetHeight,
- });
-
- this.$menu
- .insertAfter(this.$element)
- .css({
- top: pos.top + pos.height,
- left: pos.left,
- })
- .show();
-
- this.shown = true;
- return this;
- },
-
- hide: function () {
- this.$menu.hide();
- this.shown = false;
- return this;
- },
-
- lookup: function (event) {
- var items;
-
- this.query = this.$element.val();
-
- if (!this.query || this.query.length < this.options.minLength) {
- return this.shown ? this.hide() : this;
- }
-
- items = $.isFunction(this.source)
- ? this.source(this.query, $.proxy(this.process, this))
- : this.source;
-
- return items ? this.process(items) : this;
- },
-
- process: function (items) {
- var that = this;
-
- items = $.grep(items, function (item) {
- return that.matcher(item);
- });
-
- items = this.sorter(items);
-
- if (!items.length) {
- return this.shown ? this.hide() : this;
- }
-
- return this.render(items.slice(0, this.options.items)).show();
- },
-
- matcher: function (item) {
- return ~item.toLowerCase().indexOf(this.query.toLowerCase());
- },
-
- sorter: function (items) {
- var beginswith = [],
- caseSensitive = [],
- caseInsensitive = [],
- item;
-
- while ((item = items.shift())) {
- if (!item.toLowerCase().indexOf(this.query.toLowerCase()))
- beginswith.push(item);
- else if (~item.indexOf(this.query)) caseSensitive.push(item);
- else caseInsensitive.push(item);
- }
-
- return beginswith.concat(caseSensitive, caseInsensitive);
- },
-
- highlighter: function (item) {
- var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
- return item.replace(
- new RegExp("(" + query + ")", "ig"),
- function ($1, match) {
- return "<strong>" + match + "</strong>";
- },
- );
- },
-
- render: function (items) {
- var that = this;
-
- items = $(items).map(function (i, item) {
- i = $(that.options.item).attr("data-value", item);
- i.find("a").html(that.highlighter(item));
- return i[0];
- });
-
- items.first().addClass("active");
- this.$menu.html(items);
- return this;
- },
-
- next: function (event) {
- var active = this.$menu.find(".active").removeClass("active"),
- next = active.next();
-
- if (!next.length) {
- next = $(this.$menu.find("li")[0]);
- }
-
- next.addClass("active");
- },
-
- prev: function (event) {
- var active = this.$menu.find(".active").removeClass("active"),
- prev = active.prev();
-
- if (!prev.length) {
- prev = this.$menu.find("li").last();
- }
-
- prev.addClass("active");
- },
-
- listen: function () {
- this.$element
- .on("focus", $.proxy(this.focus, this))
- .on("blur", $.proxy(this.blur, this))
- .on("keypress", $.proxy(this.keypress, this))
- .on("keyup", $.proxy(this.keyup, this));
-
- if (this.eventSupported("keydown")) {
- this.$element.on("keydown", $.proxy(this.keydown, this));
- }
-
- this.$menu
- .on("click", $.proxy(this.click, this))
- .on("mouseenter", "li", $.proxy(this.mouseenter, this))
- .on("mouseleave", "li", $.proxy(this.mouseleave, this));
- },
-
- eventSupported: function (eventName) {
- var isSupported = eventName in this.$element;
- if (!isSupported) {
- this.$element.setAttribute(eventName, "return;");
- isSupported = typeof this.$element[eventName] === "function";
- }
- return isSupported;
- },
-
- move: function (e) {
- if (!this.shown) return;
-
- switch (e.keyCode) {
- case 9: // tab
- case 13: // enter
- case 27: // escape
- e.preventDefault();
- break;
-
- case 38: // up arrow
- e.preventDefault();
- this.prev();
- break;
-
- case 40: // down arrow
- e.preventDefault();
- this.next();
- break;
- }
-
- e.stopPropagation();
- },
-
- keydown: function (e) {
- this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40, 38, 9, 13, 27]);
- this.move(e);
- },
-
- keypress: function (e) {
- if (this.suppressKeyPressRepeat) return;
- this.move(e);
- },
-
- keyup: function (e) {
- switch (e.keyCode) {
- case 40: // down arrow
- case 38: // up arrow
- case 16: // shift
- case 17: // ctrl
- case 18: // alt
- break;
-
- case 9: // tab
- case 13: // enter
- if (!this.shown) return;
- this.select();
- break;
-
- case 27: // escape
- if (!this.shown) return;
- this.hide();
- break;
-
- default:
- this.lookup();
- }
-
- e.stopPropagation();
- e.preventDefault();
- },
-
- focus: function (e) {
- this.focused = true;
- },
-
- blur: function (e) {
- this.focused = false;
- if (!this.mousedover && this.shown) this.hide();
- },
-
- click: function (e) {
- e.stopPropagation();
- e.preventDefault();
- this.select();
- this.$element.focus();
- },
-
- mouseenter: function (e) {
- this.mousedover = true;
- this.$menu.find(".active").removeClass("active");
- $(e.currentTarget).addClass("active");
- },
-
- mouseleave: function (e) {
- this.mousedover = false;
- if (!this.focused && this.shown) this.hide();
- },
- };
-
- /* TYPEAHEAD PLUGIN DEFINITION
- * =========================== */
-
- var old = $.fn.typeahead;
-
- $.fn.typeahead = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("typeahead"),
- options = typeof option == "object" && option;
- if (!data) $this.data("typeahead", (data = new Typeahead(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.typeahead.defaults = {
- source: [],
- items: 8,
- menu: '<ul class="typeahead dropdown-menu"></ul>',
- item: '<li><a href="#"></a></li>',
- minLength: 1,
- };
-
- $.fn.typeahead.Constructor = Typeahead;
-
- /* TYPEAHEAD NO CONFLICT
- * =================== */
-
- $.fn.typeahead.noConflict = function () {
- $.fn.typeahead = old;
- return this;
- };
-
- /* TYPEAHEAD DATA-API
- * ================== */
-
- $(document).on(
- "focus.typeahead.data-api",
- '[data-provide="typeahead"]',
- function (e) {
- var $this = $(this);
- if ($this.data("typeahead")) return;
- $this.typeahead($this.data());
- },
- );
-})(window.jQuery);
-/* ==========================================================
- * bootstrap-affix.js v2.3.1
- * http://twitter.github.com/bootstrap/javascript.html#affix
- * ==========================================================
- * Copyright 2012 Twitter, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-!(function ($) {
- "use strict"; // jshint ;_;
-
- /* AFFIX CLASS DEFINITION
- * ====================== */
-
- var Affix = function (element, options) {
- this.options = $.extend({}, $.fn.affix.defaults, options);
- this.$window = $(window)
- .on("scroll.affix.data-api", $.proxy(this.checkPosition, this))
- .on(
- "click.affix.data-api",
- $.proxy(function () {
- setTimeout($.proxy(this.checkPosition, this), 1);
- }, this),
- );
- this.$element = $(element);
- this.checkPosition();
- };
-
- Affix.prototype.checkPosition = function () {
- if (!this.$element.is(":visible")) return;
-
- var scrollHeight = $(document).height(),
- scrollTop = this.$window.scrollTop(),
- position = this.$element.offset(),
- offset = this.options.offset,
- offsetBottom = offset.bottom,
- offsetTop = offset.top,
- reset = "affix affix-top affix-bottom",
- affix;
-
- if (typeof offset != "object") offsetBottom = offsetTop = offset;
- if (typeof offsetTop == "function") offsetTop = offset.top();
- if (typeof offsetBottom == "function") offsetBottom = offset.bottom();
-
- affix =
- this.unpin != null && scrollTop + this.unpin <= position.top
- ? false
- : offsetBottom != null &&
- position.top + this.$element.height() >= scrollHeight - offsetBottom
- ? "bottom"
- : offsetTop != null && scrollTop <= offsetTop
- ? "top"
- : false;
-
- if (this.affixed === affix) return;
-
- this.affixed = affix;
- this.unpin = affix == "bottom" ? position.top - scrollTop : null;
-
- this.$element
- .removeClass(reset)
- .addClass("affix" + (affix ? "-" + affix : ""));
- };
-
- /* AFFIX PLUGIN DEFINITION
- * ======================= */
-
- var old = $.fn.affix;
-
- $.fn.affix = function (option) {
- return this.each(function () {
- var $this = $(this),
- data = $this.data("affix"),
- options = typeof option == "object" && option;
- if (!data) $this.data("affix", (data = new Affix(this, options)));
- if (typeof option == "string") data[option]();
- });
- };
-
- $.fn.affix.Constructor = Affix;
-
- $.fn.affix.defaults = {
- offset: 0,
- };
-
- /* AFFIX NO CONFLICT
- * ================= */
-
- $.fn.affix.noConflict = function () {
- $.fn.affix = old;
- return this;
- };
-
- /* AFFIX DATA-API
- * ============== */
-
- $(window).on("load", function () {
- $('[data-spy="affix"]').each(function () {
- var $spy = $(this),
- data = $spy.data();
-
- data.offset = data.offset || {};
-
- data.offsetBottom && (data.offset.bottom = data.offsetBottom);
- data.offsetTop && (data.offset.top = data.offsetTop);
-
- $spy.affix(data);
- });
- });
-})(window.jQuery);
-self._386 = self._386 || {};
-
-$(function () {
- var character = { height: 20, width: 12.4 };
-
- function scrollLock() {
- var last = 0;
- $(window).bind("scroll", function (e) {
- var func,
- off = $(window).scrollTop();
-
- console.log(off, last, off < last ? "up" : "down");
-
- // this determines whether the user is intending to go up or down.
- func = off < last ? "floor" : "ceil";
-
- // make sure we don't run this from ourselves
- if (off % character.height === 0) {
- return;
- }
- last = off;
-
- window.scrollTo(0, Math[func](off / character.height) * character.height);
- });
- }
-
- function loading() {
- if (_386.fastLoad) {
- document.body.style.visibility = "visible";
- return;
- }
-
- var onePass = _386.onePass,
- speedFactor = (1 / (_386.speedFactor || 1)) * 165000;
- (wrap = document.createElement("div")),
- (bar = wrap.appendChild(document.createElement("div"))),
- (cursor = document.createElement("div")),
- // If the user specified that the visibility is hidden, then we
- // start at the first pass ... otherwise we just do the
- // cursor fly-by
- (pass = $(document.body).css("visibility") == "visible" ? 1 : 0),
- (height = $(window).height()),
- (width = $(window).width()),
- // this makes the loading of the screen proportional to the real-estate of the window.
- // it helps keep the cool sequence there while not making it waste too much time.
- (rounds = (height * width) / speedFactor),
- (column = width),
- (row = height - character.height);
-
- wrap.id = "wrap386";
- bar.id = "bar386";
- cursor.id = "cursor386";
-
- cursor.innerHTML = bar.innerHTML = "▄";
-
- // only inject the wrap if the pass is 0
- if (pass === 0) {
- document.body.appendChild(wrap);
- document.body.style.visibility = "visible";
- } else {
- document.body.appendChild(cursor);
- rounds /= 2;
- character.height *= 4;
- }
-
- var ival = setInterval(function () {
- for (var m = 0; m < rounds; m++) {
- column -= character.width;
-
- if (column <= 0) {
- column = width;
- row -= character.height;
- }
- if (row <= 0) {
- pass++;
- row = height - character.height;
-
- if (pass == 2) {
- document.body.removeChild(cursor);
- clearInterval(ival);
- } else {
- wrap.parentNode.removeChild(wrap);
- if (onePass) {
- clearInterval(ival);
- } else {
- document.body.appendChild(cursor);
- rounds /= 2;
- character.height *= 4;
- }
- }
- }
-
- if (pass === 0) {
- bar.style.width = column + "px";
- wrap.style.height = row + "px";
- } else {
- cursor.style.right = column + "px";
- cursor.style.bottom = row + "px";
- }
- }
- }, 1);
- }
- loading();
-});
diff --git a/web/static/js/wakatime.js b/web/static/js/wakatime.js
@@ -1,56 +0,0 @@
-function createRow(data, max_length, total_hours) {
- const { date, hours, text } = data;
- var row = date.toLowerCase().padEnd(max_length);
- row += " | ";
-
- if (hours > 0 && total_hours > 0) {
- const bar_length = Math.ceil((hours / total_hours) * (100 / 5));
- const bar = "#".repeat(bar_length);
- if (bar.length !== 0) {
- row += `${bar} `;
- }
- }
- row += `${text}\n`;
- return row;
-}
-
-function createChart(data) {
- const table = [];
- var max_length = 0;
- var total_hours = 0;
- data.forEach((entry) => {
- const date = entry.range.text.replace(/\s*\d{4}$/, "");
- max_length = Math.max(max_length, date.length);
- const { total_seconds, text: timeText } = entry.grand_total;
- const hours = total_seconds / 60 / 60;
- total_hours += hours;
- table.push({ date, hours, text: timeText });
- });
-
- var chart = "";
- table.forEach((row) => {
- chart += createRow(row, max_length, total_hours);
- });
- var total_minutes = total_hours % 1;
- total_hours -= total_minutes;
- total_minutes = Math.ceil(total_minutes * 60);
- chart += `total: ${total_hours} hours and ${total_minutes} minutes`;
- return chart;
-}
-
-$.ajax({
- type: "GET",
- url: "https://wakatime.com/share/@Moncheeta/235513c0-b88a-483b-a5a5-d0f54e7c471e.json",
- dataType: "jsonp",
- success: function (response) {
- const chart = createChart(response.data);
- for (let element of document.getElementsByClassName("activity")) {
- element.textContent = chart;
- }
- },
- error: function (error) {
- console.error("Error fetching data:", error);
- document.getElementById("activity-small").textContent = "Failed to load chart";
- document.getElementById("activity-big").textContent = "Failed to load chart";
- },
-});
diff --git a/web/templates/404.html b/web/templates/404.html
@@ -1,9 +0,0 @@
-{% extends "error.html" %}
-
-{% block title %}
-<title>not found</title>
-{% endblock %}
-
-{% block message %}
-<h1 id="message">not found (404)</h1>
-{% endblock %}
diff --git a/web/templates/429.html b/web/templates/429.html
@@ -1,9 +0,0 @@
-{% extends "error.html" %}
-
-{% block title %}
-<title>too many requests</title>
-{% endblock %}
-
-{% block message %}
-<h1 id="message">too many requests (429)</h1>
-{% endblock %}
diff --git a/web/templates/500.html b/web/templates/500.html
@@ -1,9 +0,0 @@
-{% extends "error.html" %}
-
-{% block title %}
-<title>server error</title>
-{% endblock %}
-
-{% block message %}
-<h1 id="message">server error (500)</h1>
-{% endblock %}
diff --git a/web/templates/base.html b/web/templates/base.html
@@ -1,52 +0,0 @@
-<!doctype html>
-<html lang="en">
- <head>
- <meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-
- <title>Damian Myrda</title>
- <link rel="icon" type="image/png" href="/img/moncheeta.png" />
- <meta
- name="description"
- content="Terminal enthusiast, learning from Curious George (the curious part, not the monkey business). Systems and backend programming are my focus. Striving to turn spaghetti code into well-structured algorithms and make every line count with efficiency and creativity."
- />
-
- {% block title %}{% endblock %}
-
- <style>
- body {
- visibility: hidden;
- min-height: 100vh;
- }
-
- #content {
- max-width: 800px;
- margin: 0 auto 0 auto;
- padding: 1rem 0 1rem 0;
- }
-
- pre {
- color: #e8e6e3 !important;
- background-color: #000084 !important;
- }
-
- h3 {
- text-align: center !important;
- }
- </style>
- <link href="/css/bootstrap.css" rel="stylesheet" media="screen" />
- <link href="/css/bootstrap-responsive.css" rel="stylesheet" />
-
- <script src="https://code.jquery.com/jquery.js"></script>
- <script>
- _386 = { onePass: true };
- </script>
- <script src="/js/bootstrap.js"></script>
- </head>
-
- <body>
- {% block navbar %}{% endblock %}
-
- <div id="content">{% block content %}{% endblock %}</div>
- </body>
-</html>
diff --git a/web/templates/error.html b/web/templates/error.html
@@ -1,29 +0,0 @@
-{% extends "base.html" %}
-
-{% import "nav.html" as nav %}
-{% block navbar %}
-{{ nav::bar(active="") }}
-{% endblock %}
-
-{% block content %}
-<div>
- {% block message %}
- {% endblock %}
-</div>
-<style>
- #content {
- padding: 0px !important;
- }
-
- #message {
- color: #ff5555;
- display: flex;
- justify-content: center;
- align-items: center;
- height: 100vh;
- }
-</style>
-<script>
- _386 = { fastLoad: true };
-</script>
-{% endblock %}
diff --git a/web/templates/index.html b/web/templates/index.html
@@ -1,107 +0,0 @@
-{% extends "base.html" %}
-
-{% import "projects.html" as projects %}
-
-{% block title %}
-<title>prime8.dev</title>
-{% endblock %}
-
-{% block content %}
-<div id="logo">
- <div>
- <pre id="firstname">
- _ _
- | | (_)
- __| | __ _ _ __ ___ _ __ _ _ __
- / _` |/ _` | '_ ` _ \| |/ _` | '_ \
-| (_| | (_| | | | | | | | (_| | | | |
- \__,_|\__,_|_| |_| |_|_|\__,_|_| |_|
- </pre>
- <div style="display: table; width: 100%">
- <div class="d-table-cell">
- <a href="mailto:damian@prime8.dev">damian@prime8.dev</a>
- </div>
- <div style="display: table-cell; text-align: right">
- <pre class="hidden-phone">chicago,</pre>
- <a class="visible-phone" href="https://www.linkedin.com/in/damian-myrda/">linkedin</a></pre>
- </div>
- </div>
- </div>
- <pre id="middle" class="hidden-phone"></pre>
- <pre id="lastname" class="hidden-phone">
- _
- | |
- _ __ ___ _ _ _ __ __| | __ _
-| '_ ` _ \| | | | '__/ _` |/ _` |
-| | | | | | |_| | | | (_| | (_| |
-|_| |_| |_|\__, |_| \__,_|\__,_|
- __/ |
-illinois |___/ <a class="align-right" href="https://www.linkedin.com/in/damian-myrda/">linkedin</a></pre>
- <script>
- const heights = [
- document.getElementById("firstname").textContent.split("\n").length,
- document.getElementById("lastname").textContent.split("\n").length,
- ];
- const max_height = Math.max(...heights);
- document.getElementById("middle").textContent = " \n".repeat(max_height);
- </script>
- <style>
- #logo {
- display: table;
- margin-left: auto;
- margin-right: auto;
- }
-
- #firstname, #middle, #lastname {
- display: table-cell;
- }
-
- @media (max-width: 480px) {
- #firstname, #middle, #lastname {
- font-size: 16px !important;
- line-height: 18px !important;
- }
- }
- </style>
-</div>
-<div id="content">
- <p class="lead" style="text-align: center">
- Terminal enthusiast, learning from Curious George (the curious part, not the
- monkey business). Systems and backend programming are my focus. Striving to
- turn spaghetti code into well-structured algorithms and make every line
- count with efficiency and creativity.
- </p>
- <div style="display: table; width: 100%">
- <div class="d-table-cell">
- <h3>techonologies:</h3>
- <ul>
- <li style="color: #fff">languages: <span style="color: #fefe54">zig</span>, <span style="color: #ff5555">rust</span>, <span style="color: #55ffff">go</span>, <span style="color: #bbb">c</span>, <span style="color: #00aaaa">c++</span>, <span style="color: #fefe54">python</span></li>
- <li style="color: #fff">frameworks: <span style="color: #ff5555">tokio</span>, <span style="color: #55ff55">fastapi<span>, <span style="color: #bbb">flask</span></li>
- <li style="color: #fff">libraries: <span style="color: #ff5555">torch</span>, <span style="color: #fe54fe">kafka</span>
- <li style="color: #fff">tools: <span style="color: #bbb">git</span>, <span style="color: #55ff55">bash</span>, <span style="color: #aa5500">make</span>, <span style="color: #bbb">gdb</span>, <span style="color: #00aaaa">docker</span></li>
- </ul>
- <h3>learning:</h3>
- <ul>
- <li style="color: #00aaaa">typescript</li>
- <li style="color: #a85400">java</li>
- </ul>
- <div class="visible-phone">
- <h3>activity:</h3>
- <pre class="activity" style="color: #bbb !important">Loading activity...</pre>
- </div>
- </div>
- <div style="display: table-cell; vertical-align: middle">
- <div style="display: flex; justify-content: center">
- <div class="hidden-phone">
- <h3>activity:</h3>
- <pre class="activity" style="color: #bbb !important">Loading activity...</pre>
- </div>
- </div>
- </div>
- </div
- <div>
- {{ projects::list() }}
- </div>
-</div>
-<script src="js/wakatime.js"></script>
-{% endblock %}
diff --git a/web/templates/nav.html b/web/templates/nav.html
@@ -1,19 +0,0 @@
-{% macro bar(active) %}
-<div class="navbar navbar-inverse navbar-fixed-top">
- <div class="navbar-inner">
- <a class="brand" href="/">prime8</a>
- <ul class="nav">
- {% for tab in config.extra.tabs %}
- <li {% if tab.name == active %} class="active" {% endif %}>
- <a href="{{ tab.url }}">{{ tab.name }}</a>
- </li>
- {% endfor %}
- </ul>
- </div>
-</div>
-<style>
- .brand {
- margin-left: 0 !important;
- }
-</style>
-{% endmacro %}
diff --git a/web/templates/projects.html b/web/templates/projects.html
@@ -1,83 +0,0 @@
-{% macro list() %}
-<pre style="color: #fff !important">
- _ _
- (_) | |
- _ __ _ __ ___ _ ___ ___| |_ ___
-| '_ \| '__/ _ \| |/ _ \/ __| __/ __|
-| |_) | | | (_) | | __/ (__| |_\__ \
-| .__/|_| \___/| |\___|\___|\__|___/
-| | _/ |
-|_| |__/
-
-</pre>
-<div class="row-fluid">
- <div class="span4 w-100">
- <h3>MOS</h3>
- <p>
- In my free time, I work on MOS, my minimal operating system. This project
- has deepened my understanding of OS internals, and I'm planning to rewrite
- it for the RISC-V architecture. Users interact with the terminal through
- command line and terminal user interfaces designed for ease of use and
- efficiency.
- </p>
- <a href="https://git.prime8.dev/?p=mos.git" class="btn">src</a>
- </div>
- <div class="span4 w-100">
- <h3>Janitor</h3>
- <p>
- During my summer internship at Amplifier Health, I developed a service
- that sorts audio files into three categories: speech, music, and noise. I
- wrote it in Rust with tch-rs and Axum aiming for better performance. The
- service is designed to be fast, using efficient multithreading on the CPU
- and taking advantage of the GPU for highly parallel processing.
- </p>
- <a href="https://git.prime8.dev/?p=janitor.git" class="btn">src</a>
- </div>
- <div class="span4 w-100">
- <h3>Summarizer</h3>
- <p>
- An experiment using a microservice architecture that transcribes and
- summarizes audio into text using OpenAI's API. Each service has its own
- function that it performs, and the services communicate with each other
- through Kafka, where jobs are requested and results are received. The
- entire system can be easily deployed with a Docker Compose file.
- </p>
- <a href="https://github.com/moncheeta/summarizer" class="btn">src</a>
- </div>
-</div>
-<div class="row-fluid">
- <div class="span4 w-100">
- <h3>Tutor Connect</h3>
- <p>
- For HSHacks 2024, my friends and I developed a website to help students
- find tutors. Recognizing that not every school has a dedicated portal for
- peer tutoring, we created a district-wide, easily accessible platform. We
- used ReactJS for the user interface and Firebase for storage and
- authentication. In the end, we won 3rd place!
- </p>
- <a href="https://d214tutorconnect.prime8.dev" class="btn">src</a>
- </div>
- <div class="span4 w-100">
- <h3>CSC Website</h3>
- <p>
- I built a website for the Computer Science Club (CSC) at Prospect High
- School during a mini-hackathon. The site displays important information it
- fetches from the Schoology API. Members can share their projects using
- their Google account and uploading their work to a SQLite database.
- </p>
- <a href="https://git.prime8.dev/?p=csc.git" class="btn">src</a>
- <a href="https://csc.prime8.dev" class="btn">live</a>
- </div>
- <div class="span4 w-100">
- <h3>Veterans Website</h3>
- <p>
- For HSHacks 2023, my very first hackathon, I created a website for an
- organization that helps veterans manage donations. Donors can use their
- Venmo account to donate to the organization. They receive a notification
- on their phone for confirmation, and each donor gets a thank-you email as
- a gesture of appreciation.
- </p>
- <a href="https://github.com/moncheeta/veteran_donations" class="btn">src</a>
- </div>
-</div>
-{% endmacro %}
diff --git a/web/tsconfig.json b/web/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "compilerOptions": {
+ "strictNullChecks": true
+ }
+}