feat: moonshot v2 profile redesign

This commit is contained in:
developtheweb 2026-07-07 22:01:23 -04:00
commit c7b0d4ff3b
11 changed files with 692 additions and 191 deletions

BIN
.DS_Store vendored

Binary file not shown.

62
.github/workflows/demon.yml vendored Normal file
View file

@ -0,0 +1,62 @@
name: Maxwell's Demon
on:
issues:
types: [opened]
concurrency:
group: demon-state
cancel-in-progress: false
permissions:
contents: write
issues: write
jobs:
sort:
if: "startsWith(github.event.issue.title, 'demon: sort 12 bits')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Sort 12 bits into the lattice
run: |
python3 - <<'EOF'
import datetime
import json
path = "state/demon.json"
with open(path) as fh:
state = json.load(fh)
state["bits_sorted"] += 12
state["generation"] += 1
state["demons"] += 1
state["last_sorted_at"] = datetime.datetime.now(
datetime.timezone.utc
).isoformat(timespec="seconds")
with open(path, "w") as fh:
json.dump(state, fh, indent=2)
fh.write("\n")
EOF
python3 engine/generate_entropy_svg.py
- name: Commit lowered entropy
env:
AUTHOR: ${{ github.event.issue.user.login }}
run: |
git config user.name "github-actions[bot]"
git config user.email "41898470+github-actions[bot]@users.noreply.github.com"
git add state/demon.json assets/entropy.svg
git commit -m "chore: demon sorted 12 bits (S lowered by @${AUTHOR})"
git pull --rebase origin "${GITHUB_REF_NAME}"
git push
- name: Thank the demon and close the gate
env:
GH_TOKEN: ${{ github.token }}
ISSUE: ${{ github.event.issue.number }}
run: |
gh issue comment "$ISSUE" --repo "$GITHUB_REPOSITORY" --body \
"12 bits sorted. Entropy of this README decreased by 34.4 zJ (12 × kT ln 2 at 300 K). The second law remains statistical. Thank you, demon."
gh issue edit "$ISSUE" --repo "$GITHUB_REPOSITORY" --add-label demon
gh issue close "$ISSUE" --repo "$GITHUB_REPOSITORY"

37
.github/workflows/nightly.yml vendored Normal file
View file

@ -0,0 +1,37 @@
name: Nightly Telemetry
on:
schedule:
- cron: "17 6 * * *"
workflow_dispatch:
concurrency:
group: demon-state
cancel-in-progress: false
permissions:
contents: write
jobs:
refresh:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Refresh feed, stats, featured cards, entropy field
env:
GITHUB_TOKEN: ${{ github.token }}
run: python3 engine/nightly.py
- name: Commit if changed
run: |
if git diff --quiet; then
echo "no changes"
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "41898470+github-actions[bot]@users.noreply.github.com"
git add README.md state/demon.json assets/entropy.svg
git commit -m "chore: nightly telemetry refresh"
git pull --rebase origin "${GITHUB_REF_NAME}"
git push

View file

@ -4,19 +4,15 @@ on:
schedule:
# Runs every 12 hours
- cron: "0 */12 * * *"
workflow_dispatch:
push:
branches:
- main
jobs:
generate:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Generate Snake
uses: Platane/snk/svg-only@v3
@ -25,11 +21,11 @@ jobs:
outputs: |
dist/github-contribution-grid-snake.svg
dist/github-contribution-grid-snake-dark.svg?palette=github-dark
- name: Push to output branch
uses: crazy-max/ghaction-github-pages@v4
with:
target_branch: output
build_dir: dist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.DS_Store

View file

@ -4,23 +4,33 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Repository Overview
This is a GitHub profile repository containing only a README.md file that displays on the @developtheweb GitHub profile page. There is no source code, build configuration, or tests in this repository.
This is the GitHub profile repository for @developtheweb. Its README renders on the profile page and is a live system, not a static page: an animated entropy-reversal SVG whose state is lowered by visitors ("Maxwell's demon"), plus nightly-refreshed telemetry. Do not reintroduce third-party rendering services (capsule-render, readme-typing-svg, komarev, vercel stats/quotes apps) — everything renders from this repo, GitHub, or stevenmilanese.com assets.
## Repository Structure
## Architecture
```
/home/aurelius/git/developtheweb/
└── README.md
README.md profile page; contains marker-fenced generated sections
engine/generate_entropy_svg.py SMIL-animated assets/entropy.svg from state/demon.json (stdlib only)
engine/nightly.py refreshes README marker sections + bumps entropy generation (stdlib only)
state/demon.json bits_sorted / generation / demons / last_sorted_at
assets/entropy.svg generated — never hand-edit; regenerate via the engine
.github/workflows/demon.yml issues:opened, title "demon: sort 12 bits" → +12 bits, regen SVG, commit, comment, close
.github/workflows/nightly.yml cron 17 6 * * * → engine/nightly.py, commit if changed
.github/workflows/snake.yml cron every 12h → contribution snake SVGs on the `output` branch
```
## Working with this Repository
## README marker sections (machine-written — edit the generators, not the sections)
Since this is a profile repository with only a README.md file:
- `<!-- FEED:START/END -->` — 4 newest Strange Quarks articles (RSS `/feed.xml` if populated, else parsed from https://stevenmilanese.com/blog HTML)
- `<!-- STATS:START/END -->` — telemetry row with live star/repo totals
- `<!-- FEATURED:START/END -->` — featured cards (anthropic-certs, slTrain, meowchi-releases, mpl) with live star counts
- Any changes should maintain the professional formatting and structure of the profile README
- The README uses GitHub-flavored markdown with centered content, badges, and images
- External image assets are referenced from `https://github.com/developtheweb/stevenmilanese-com/blob/main/public/`
`engine/nightly.py` is fail-safe per section: on fetch/parse failure it leaves that section untouched and exits 0.
## Note
## Conventions
This is not a development project - it's a GitHub profile repository used for personal branding and showcasing work. There are no build commands, tests, or development workflows associated with this repository.
- Conventional commit messages (`feat:`, `fix:`, `chore:`, `ci:`). No attribution footers of any kind.
- Contact is `rev@moonfactory.dev` only — the old Telegram link and the old level-host email address are retired and must not reappear.
- Entropy formula: `S = max(12.7, 100 0.0002·bits_sorted)`; 12 bits per demon click = 34.4 zJ (12 × kT ln 2 at 300 K).
- SVG regeneration is deterministic for a given `generation` — diffs stay reviewable.
- Test locally with `python3 engine/generate_entropy_svg.py` and `GITHUB_TOKEN=$(gh auth token) python3 engine/nightly.py` (both stdlib-only; no pip installs).

277
README.md
View file

@ -1,191 +1,120 @@
<div align="center">
<!-- Animated Wave -->
<img src="https://capsule-render.vercel.app/api?type=waving&color=gradient&customColorList=14,15,16,17,18,19&height=100&section=header&fontSize=0" width="100%" />
# Reversing the irreversible
<!-- Logo with Animation -->
<img src="https://stevenmilanese.com/StevenMilanese-full-logo.png" alt="Steven Milanese" width="400"/>
*Rev. Steven Milanese — the second law is statistical, not sacred. The demon pays its bills in bits.*
<!-- Animated Typing Header -->
[![Typing SVG](https://readme-typing-svg.demolab.com?font=Fira+Code&size=32&duration=2800&pause=2000&color=06B6D4&center=true&vCenter=true&width=600&lines=Steven+Milanese;Autodidactic+Polymath;Systems+Alchemist;Physicist+%26+Reverend;Arch+Linux+User+BTW)](https://git.io/typing-svg)
<!-- Profile Views Counter -->
<br>
<img src="https://komarev.com/ghpvc/?username=developtheweb&color=0891b2&style=for-the-badge&label=PROFILE+VIEWS" alt="Profile Views"/>
<!-- Social Badges with Custom Colors -->
<br><br>
[![Website](https://img.shields.io/badge/Website-stevenmilanese.com-1F2937?style=for-the-badge&logo=googlechrome&logoColor=white&labelColor=374151&color=06B6D4)](https://stevenmilanese.com)
[![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white&labelColor=084C91&color=0A66C2)](https://www.linkedin.com/in/stevenmilanese/)
[![Blog](https://img.shields.io/badge/Blog-Strange_Quarks-14B8A6?style=for-the-badge&logo=hashnode&logoColor=white&labelColor=047857&color=14B8A6)](https://stevenmilanese.com/strange-quarks)
<br>
[![X](https://img.shields.io/badge/X-@developtheweb-000000?style=for-the-badge&logo=x&logoColor=white&labelColor=171717&color=000000)](https://x.com/developtheweb)
[![Telegram](https://img.shields.io/badge/Telegram-@CodeAndVerse-26A5E4?style=for-the-badge&logo=telegram&logoColor=white&labelColor=0088CC&color=26A5E4)](https://t.me/CodeAndVerse)
[![Email](https://img.shields.io/badge/Email-Contact_Me-EA4335?style=for-the-badge&logo=gmail&logoColor=white&labelColor=C23B2C&color=EA4335)](mailto:dev@level.host)
<br>
[![ORCID](https://img.shields.io/badge/ORCID-Research_Profile-A6CE39?style=for-the-badge&logo=orcid&logoColor=white&labelColor=87A330&color=A6CE39)](https://orcid.org/0009-0008-0442-208X)
[![OSF](https://img.shields.io/badge/OSF-Open_Science-2077B4?style=for-the-badge&logo=osf&logoColor=white&labelColor=1A5F8F&color=2077B4)](https://osf.io/3tsd4/)
</div>
<!-- Animated Banner -->
<div align="center">
<img src="https://stevenmilanese.com/StevenMilanese-hero-stars.webp" alt="Hero Banner" width="100%"/>
<img src="assets/entropy.svg" width="100%" alt="Entropy-reversal field: particles converging from chaos into a (2,5) torus-knot lattice"/>
[⚡ Be the demon — sort 12 bits](https://github.com/developtheweb/developtheweb/issues/new?title=demon%3A+sort+12+bits&body=One+tap.+Submit+to+sort.)
<sub>Each click opens a one-tap issue; an Action sorts the field, recommits the SVG, closes the issue. This README's state is community-lowered entropy.</sub>
</div>
<!-- Quote Section -->
<div align="center">
<br>
<img src="https://quotes-github-readme.vercel.app/api?type=horizontal&theme=tokyonight&quote=Transforming%20complexity%20into%20elegance%2C%20one%20algorithm%20at%20a%20time.&author=Steven%20Milanese" alt="Quote"/>
<br>
</div>
## About the Reverend
## 🎯 About Me
```python
class StevenMilanese:
def __init__(self):
self.title = "Autodidactic Polymath | Systems Alchemist"
self.location = "🌍 Earth"
self.os = "Arch Linux BTW 🐧"
self.current_focus = ["AI Architecture", "Quantum Computing", "WebGL", "Spiritual Tech"]
self.philosophy = "Bridge technical excellence with human experience"
def transform_challenges(self, problem):
return f"✨ Inspired solution for {problem}"
```
Reverend ≔ Physicist ⊗ Minister ⊗ Systems_Alchemist
domain : ℝ³·¹ ⊗ CY₃(χ = ±6)
axiom : complexity ⟼ elegance
method : ∀ p ∈ Inconceivable — solve(p) pose(better_p)
runtime : Arch Linux, btw
```
I transform complex challenges into inspired technological solutions. By seamlessly integrating Artificial Intelligence with cutting-edge development practices, I create systems that push the boundaries of what's possible. My expertise spans multiple domains including theoretical physics, mathematics, AI systems architecture, and spiritual technology.
*Written in MPL — the author's own language. Ordained minister, autodidactic polymath, natural philosopher. The ministry and the physics are the same inquiry conducted at different energy scales.*
## 🚀 Tech Arsenal
## The mission — goals inconceivable by design
<table>
<tr>
<td width="50%" valign="top">
**Reverse the irreversible**
Maxwell's demon on GitHub's own infrastructure, funded in Landauer's currency. *(running above)*
</td>
<td width="50%" valign="top">
**Derive the three generations**
CalabiYau compactifications, χ = ±6. [ORCID](https://orcid.org/0009-0008-0442-208X) · [OSF](https://osf.io/3tsd4/) · [companion essays](https://stevenmilanese.com/blog/tag/calabi-yau-manifolds)
</td>
</tr>
<tr>
<td width="50%" valign="top">
**Cognitive universality**
[MPL](https://github.com/developtheweb/mpl): if you can write the equation, you can run it.
</td>
<td width="50%" valign="top">
**Planetary intelligence**
Earth as information processor, argued in full on [Strange Quarks](https://stevenmilanese.com/blog/planetary-intelligence-earth-as-information-processor).
</td>
</tr>
</table>
<!-- STATS:START -->
<div align="center">
### Languages & Frameworks
![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white)
![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black)
![Python](https://img.shields.io/badge/Python-3776AB?style=for-the-badge&logo=python&logoColor=white)
![React](https://img.shields.io/badge/React-61DAFB?style=for-the-badge&logo=react&logoColor=black)
![Next.js](https://img.shields.io/badge/Next.js-000000?style=for-the-badge&logo=nextdotjs&logoColor=white)
![Node.js](https://img.shields.io/badge/Node.js-339933?style=for-the-badge&logo=nodedotjs&logoColor=white)
![Three.js](https://img.shields.io/badge/Three.js-000000?style=for-the-badge&logo=threedotjs&logoColor=white)
### Operating System & Environment
![Arch Linux](https://img.shields.io/badge/Arch_Linux-1793D1?style=for-the-badge&logo=arch-linux&logoColor=white)
![BTW I Use Arch](https://img.shields.io/badge/BTW_I_Use_Arch-1793D1?style=for-the-badge&logo=arch-linux&logoColor=white)
![Neovim](https://img.shields.io/badge/Neovim-57A143?style=for-the-badge&logo=neovim&logoColor=white)
![Terminal](https://img.shields.io/badge/Terminal-4D4D4D?style=for-the-badge&logo=windows-terminal&logoColor=white)
### Tools & Technologies
![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white)
![AWS](https://img.shields.io/badge/AWS-232F3E?style=for-the-badge&logo=amazonaws&logoColor=white)
![PostgreSQL](https://img.shields.io/badge/PostgreSQL-336791?style=for-the-badge&logo=postgresql&logoColor=white)
![Git](https://img.shields.io/badge/Git-F05032?style=for-the-badge&logo=git&logoColor=white)
![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=for-the-badge&logo=tailwind-css&logoColor=white)
![WebGL](https://img.shields.io/badge/WebGL-990000?style=for-the-badge&logo=webgl&logoColor=white)
![AI/ML](https://img.shields.io/badge/AI/ML-FF6F61?style=for-the-badge&logo=tensorflow&logoColor=white)
`10¹⁰⁶ yr until heat death — the deadline` · `2.9 zJ of order per bit sorted (kT ln 2, 300 K)` · `★ 27 stars across 14 public repos`
</div>
<!-- STATS:END -->
## 📊 GitHub Analytics
## Beneath the physics — the verified inventory
<!-- FEATURED:START -->
<div align="center">
<img width="49%" height="195px" src="https://github-readme-stats.vercel.app/api?username=developtheweb&show_icons=true&count_private=true&hide_border=true&title_color=06B6D4&icon_color=06B6D4&text_color=c9d1d9&bg_color=0d1117" alt="Steven Milanese github stats" />
<img width="41%" height="195px" src="https://github-readme-stats.vercel.app/api/top-langs/?username=developtheweb&layout=compact&hide_border=true&title_color=06B6D4&text_color=c9d1d9&bg_color=0d1117" />
<table>
<tr>
<td width="50%" valign="top">
<h3 align="center"><a href="https://github.com/developtheweb/anthropic-certs">anthropic-certs</a></h3>
<p align="center"><code>★ 11</code></p>
<p align="center">Verified Anthropic certifications — Claude, API, Claude Code CLI, MCP.</p>
</td>
<td width="50%" valign="top">
<h3 align="center"><a href="https://github.com/developtheweb/slTrain">slTrain</a></h3>
<p align="center"><code>★ 4</code></p>
<p align="center">A steam locomotive for your terminal, smoke trail included.</p>
</td>
</tr>
<tr>
<td width="50%" valign="top">
<h3 align="center"><a href="https://github.com/developtheweb/meowchi-releases">meowchi-releases</a></h3>
<p align="center"><code>★ 4</code></p>
<p align="center">A desktop pet that evolves when you actually get work done.</p>
</td>
<td width="50%" valign="top">
<h3 align="center"><a href="https://github.com/developtheweb/mpl">mpl</a></h3>
<p align="center"><code>★ 2</code></p>
<p align="center">Mathematics Programming Language — write the equation, run the equation.</p>
</td>
</tr>
</table>
</div>
<!-- FEATURED:END -->
<div align="center">
<img src="https://github-readme-activity-graph.vercel.app/graph?username=developtheweb&custom_title=Contribution%20Graph&bg_color=0d1117&color=06B6D4&line=06B6D4&point=06B6D4&area_color=1a1b27&title_color=06B6D4&area=true" alt="Steven Milanese's Activity Graph" width="100%"/>
</div>
## Latest from Strange Quarks
## 🎨 Featured Projects
<!-- FEED:START -->
| Article | |
|:---|---:|
| [Mathematical Programming Language: A Vision for Cognitive Universality Through Unicode-Based Syntax](https://stevenmilanese.com/blog/mathematical-programming-language-a-vision-for-cognitive-universality-through-unicode-based-syntax) | Jul 28, 2025 · 17 min read |
| [The Ultimate Easter Egg Hunt: An Online Odyssey for the Brilliant Minds](https://stevenmilanese.com/blog/gunter) | Jul 21, 2025 · 45 min read |
| [The Architect of Acquiescence](https://stevenmilanese.com/blog/the-architect-of-acquiescence) | Jun 25, 2025 · 11 min read |
| [Planetary Intelligence: Earth as Information Processor](https://stevenmilanese.com/blog/planetary-intelligence-earth-as-information-processor) | Jun 18, 2025 · 49 min read |
<!-- FEED:END -->
<div align="center">
<table>
<tr>
<td width="50%">
<h3 align="center">stevenmilanese.com</h3>
<div align="center">
<a href="https://stevenmilanese.com" target="_blank"><img src="https://stevenmilanese.com/projects/calabi-yau.webp" width="100%" alt="Portfolio"/></a>
<br><br>
<p><strong>Immersive Portfolio Experience</strong></p>
<p>Three.js visualizations • Server-side rendering • Headless CMS</p>
<p>
<a href="https://stevenmilanese.com" target="_blank"><img src="https://img.shields.io/badge/Visit-Live_Site-06B6D4?style=for-the-badge&logo=vercel&logoColor=white" alt="Visit Live Site"/></a>
</p>
</div>
</td>
<td width="50%">
<h3 align="center">Emergence Intelligence</h3>
<div align="center">
<a href="https://stevenmilanese.com/#projects" target="_blank"><img src="https://stevenmilanese.com/projects/emergence-intelligence.webp" width="100%" alt="Emergence Intelligence"/></a>
<br><br>
<p><strong>Advanced AI System</strong></p>
<p>Cognitive architecture • Semantic processing • Episodic memory</p>
<p>
<a href="https://stevenmilanese.com/#projects" target="_blank"><img src="https://img.shields.io/badge/Learn-More-14B8A6?style=for-the-badge&logo=openai&logoColor=white" alt="Learn More"/></a>
</p>
</div>
</td>
</tr>
</table>
</div>
## 📚 Latest Articles
<div align="center">
| 📝 Article | 🏷️ Topics |
|:---|:---|
| [The Intersection of Physics and AI](https://stevenmilanese.com/strange-quarks) | `Quantum Computing` `Machine Learning` `Physics` |
| [Building Resilient Distributed Systems](https://stevenmilanese.com/strange-quarks) | `Architecture` `Scalability` `DevOps` |
| [WebGL Performance Optimization Techniques](https://stevenmilanese.com/strange-quarks) | `WebGL` `Three.js` `Performance` |
| [Quantum Computing: Practical Applications](https://stevenmilanese.com/strange-quarks) | `Quantum` `Algorithms` `Future Tech` |
</div>
## 🔭 Current Focus
<div align="center">
```mermaid
graph LR
A[Advanced 3D Visualizations] --> B{Current Projects}
C[Serverless Architecture] --> B
D[Quantum Computing + AI] --> B
E[Spiritual Technology] --> B
B --> F[🚀 Innovation]
```
</div>
## 🏆 Achievements & Certifications
<div align="center">
<img src="https://img.shields.io/badge/Physics-Research_Publications-FF6B6B?style=for-the-badge"/>
<img src="https://img.shields.io/badge/AI/ML-Advanced_Practitioner-4ECDC4?style=for-the-badge"/>
<img src="https://img.shields.io/badge/Architecture-Systems_Design-95E1D3?style=for-the-badge"/>
<img src="https://img.shields.io/badge/Leadership-Technical_Strategy-F38181?style=for-the-badge"/>
<br>
<img src="https://img.shields.io/badge/🐧_Arch_Linux-Full_Time_BTW-1793D1?style=for-the-badge"/>
<img src="https://img.shields.io/badge/pacman-Package_Manager-1793D1?style=for-the-badge"/>
<img src="https://img.shields.io/badge/AUR-Helper_yay-1793D1?style=for-the-badge"/>
</div>
## 💫 Connect & Collaborate
<div align="center">
<img src="https://readme-typing-svg.demolab.com?font=Fira+Code&size=22&duration=3000&pause=1000&color=06B6D4&center=true&vCenter=true&width=435&lines=Let's+build+something+amazing!;Open+to+collaborations;Reach+out+anytime!" alt="Typing SVG" />
<br><br>
[![🌐 Website](https://img.shields.io/badge/🌐_Website-stevenmilanese.com-06B6D4?style=for-the-badge)](https://stevenmilanese.com)
[![💼 LinkedIn](https://img.shields.io/badge/💼_LinkedIn-Connect-0A66C2?style=for-the-badge)](https://www.linkedin.com/in/stevenmilanese/)
[![📧 Email](https://img.shields.io/badge/📧_Email-Contact-EA4335?style=for-the-badge)](mailto:dev@level.host)
[![📝 Blog](https://img.shields.io/badge/📝_Blog-Read-14B8A6?style=for-the-badge)](https://stevenmilanese.com/strange-quarks)
</div>
<!-- Snake Animation -->
<div align="center">
<br>
<picture>
@ -197,13 +126,17 @@ graph LR
---
<div align="center">
<img src="https://stevenmilanese.com/StevenMilanese-ghost-logo.png" alt="Steven Milanese Logo" width="80"/>
<br>
<img src="https://readme-typing-svg.demolab.com?font=Fira+Code&size=14&duration=3000&pause=1000&color=718096&center=true&vCenter=true&width=435&lines=Systems+Alchemist;Transforming+Complexity+into+Elegance" alt="Typing SVG" />
<br>
<sub>⚡ Powered by curiosity, driven by innovation</sub>
</div>
<table width="100%">
<tr>
<td align="left">
<!-- Wave Footer -->
<img src="https://capsule-render.vercel.app/api?type=waving&color=gradient&customColorList=14,15,16,17,18,19&height=80&section=footer&fontSize=0" width="100%" />
*Founder, [MoonFactory](https://moonfactory.dev) — development and consulting.*
</td>
<td align="right">
[stevenmilanese.com](https://stevenmilanese.com) · [Strange Quarks](https://stevenmilanese.com/blog) · [X](https://x.com/developtheweb) · [LinkedIn](https://www.linkedin.com/in/stevenmilanese/) · [ORCID](https://orcid.org/0009-0008-0442-208X) · [OSF](https://osf.io/3tsd4/) · [rev@moonfactory.dev](mailto:rev@moonfactory.dev)
</td>
</tr>
</table>

126
assets/entropy.svg Normal file
View file

@ -0,0 +1,126 @@
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="260" viewBox="0 0 880 260" role="img" aria-label="Entropy-reversal field: S = 100.0 k-bits">
<rect x="0.5" y="0.5" width="879" height="259" rx="8" fill="#010409" stroke="#21262d"/>
<circle r="3" fill="#4dd4e8" cx="379.1" cy="69.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="379.1;612.1;612.1;379.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="69.0;130.0;130.0;69.0"/></circle>
<circle r="3" fill="#1d6f7d" cx="49.8" cy="208.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="49.8;609.3;609.3;49.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="208.5;141.8;141.8;208.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="246.0" cy="44.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="246.0;601.4;601.4;246.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="44.2;152.7;152.7;44.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="350.5" cy="92.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="350.5;588.9;588.9;350.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="92.0;162.2;162.2;92.0"/></circle>
<circle r="3" fill="#4dd4e8" cx="240.5" cy="46.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="240.5;572.9;572.9;240.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="46.6;169.7;169.7;46.6"/></circle>
<circle r="3" fill="#1d6f7d" cx="791.9" cy="224.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="791.9;554.8;554.8;791.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="224.7;175.0;175.0;224.7"/></circle>
<circle r="3" fill="#1d6f7d" cx="267.5" cy="234.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="267.5;535.8;535.8;267.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="234.6;178.1;178.1;234.6"/></circle>
<circle r="3" fill="#4dd4e8" cx="262.3" cy="161.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="262.3;517.3;517.3;262.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="161.5;179.3;179.3;161.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="682.3" cy="164.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="682.3;500.2;500.2;682.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="164.4;179.1;179.1;164.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="847.4" cy="120.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="847.4;485.4;485.4;847.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="120.8;178.1;178.1;120.8"/></circle>
<circle r="3" fill="#4dd4e8" cx="647.7" cy="235.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="647.7;472.9;472.9;647.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="235.9;177.2;177.2;235.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="303.3" cy="217.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="303.3;462.6;462.6;303.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="217.0;176.9;176.9;217.0"/></circle>
<circle r="3" fill="#1d6f7d" cx="445.8" cy="230.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="445.8;454.0;454.0;445.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="230.2;177.8;177.8;230.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="333.3" cy="148.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="333.3;446.2;446.2;333.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="148.9;180.2;180.2;148.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="650.0" cy="60.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="650.0;438.1;438.1;650.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="60.2;184.2;184.2;60.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="187.8" cy="136.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="187.8;429.0;429.0;187.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="136.4;189.5;189.5;136.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="490.5" cy="170.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="490.5;417.8;417.8;490.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="170.3;195.7;195.7;170.3"/></circle>
<circle r="3" fill="#1d6f7d" cx="248.8" cy="70.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="248.8;404.3;404.3;248.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="70.2;202.1;202.1;70.2"/></circle>
<circle r="3" fill="#1d6f7d" cx="231.6" cy="129.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="231.6;388.2;388.2;231.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="129.5;207.9;207.9;129.5"/></circle>
<circle r="3" fill="#1d6f7d" cx="80.8" cy="34.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="80.8;369.9;369.9;80.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="34.3;212.3;212.3;34.3"/></circle>
<circle r="3" fill="#4dd4e8" cx="321.3" cy="111.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="321.3;350.2;350.2;321.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="111.0;214.6;214.6;111.0"/></circle>
<circle r="3" fill="#4dd4e8" cx="793.1" cy="219.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="793.1;330.1;330.1;793.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="219.2;214.4;214.4;219.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="396.6" cy="115.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="396.6;311.0;311.0;396.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="115.6;211.2;211.2;115.6"/></circle>
<circle r="3" fill="#4dd4e8" cx="816.9" cy="102.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="816.9;294.2;294.2;816.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="102.0;205.2;205.2;102.0"/></circle>
<circle r="3" fill="#4dd4e8" cx="576.8" cy="84.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="576.8;280.8;280.8;576.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="84.5;196.7;196.7;84.5"/></circle>
<circle r="3" fill="#1d6f7d" cx="423.4" cy="164.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="423.4;271.9;271.9;423.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="164.0;186.2;186.2;164.0"/></circle>
<circle r="3" fill="#4dd4e8" cx="225.7" cy="92.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="225.7;267.9;267.9;225.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="92.4;174.5;174.5;92.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="364.2" cy="130.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="364.2;269.0;269.0;364.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="130.5;162.2;162.2;130.5"/></circle>
<circle r="3" fill="#1d6f7d" cx="528.0" cy="229.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="528.0;274.8;274.8;528.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="229.3;150.3;150.3;229.3"/></circle>
<circle r="3" fill="#4dd4e8" cx="614.1" cy="215.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="614.1;284.5;284.5;614.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="215.8;139.4;139.4;215.8"/></circle>
<circle r="3" fill="#4dd4e8" cx="104.2" cy="238.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="104.2;296.9;296.9;104.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="238.0;130.0;130.0;238.0"/></circle>
<circle r="3" fill="#4dd4e8" cx="322.8" cy="238.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="322.8;310.8;310.8;322.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="238.5;122.3;122.3;238.5"/></circle>
<circle r="3" fill="#1d6f7d" cx="110.0" cy="176.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="110.0;324.8;324.8;110.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="176.0;116.3;116.3;176.0"/></circle>
<circle r="3" fill="#1d6f7d" cx="858.3" cy="169.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="858.3;337.7;337.7;858.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="169.7;111.6;111.6;169.7"/></circle>
<circle r="3" fill="#1d6f7d" cx="789.4" cy="210.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="789.4;348.7;348.7;789.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="210.9;107.8;107.8;210.9"/></circle>
<circle r="3" fill="#1d6f7d" cx="153.7" cy="176.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="153.7;357.3;357.3;153.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="176.2;104.4;104.4;176.2"/></circle>
<circle r="3" fill="#1d6f7d" cx="509.5" cy="81.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="509.5;363.4;363.4;509.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="81.9;100.5;100.5;81.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="706.8" cy="135.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="706.8;367.5;367.5;706.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="135.9;95.7;95.7;135.9"/></circle>
<circle r="3" fill="#1d6f7d" cx="148.3" cy="215.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="148.3;370.2;370.2;148.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="215.1;89.5;89.5;215.1"/></circle>
<circle r="3" fill="#1d6f7d" cx="364.3" cy="83.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="364.3;372.6;372.6;364.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="83.2;81.9;81.9;83.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="248.7" cy="187.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="248.7;375.7;375.7;248.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="187.2;72.8;72.8;187.2"/></circle>
<circle r="3" fill="#1d6f7d" cx="280.4" cy="153.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="280.4;380.6;380.6;280.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="153.5;62.7;62.7;153.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="289.1" cy="58.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="289.1;388.2;388.2;289.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="58.4;52.1;52.1;58.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="804.8" cy="100.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="804.8;398.8;398.8;804.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="100.1;41.9;41.9;100.1"/></circle>
<circle r="3" fill="#1d6f7d" cx="221.2" cy="28.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="221.2;412.5;412.5;221.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="28.9;32.8;32.8;28.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="741.3" cy="212.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="741.3;429.0;429.0;741.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="212.5;25.7;25.7;212.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="638.5" cy="202.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="638.5;447.4;447.4;638.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="202.9;21.3;21.3;202.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="249.0" cy="56.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="249.0;466.7;466.7;249.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="56.8;20.0;20.0;56.8"/></circle>
<circle r="3" fill="#4dd4e8" cx="63.4" cy="126.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="63.4;485.5;485.5;63.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="126.3;22.0;22.0;126.3"/></circle>
<circle r="3" fill="#1d6f7d" cx="463.0" cy="222.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="463.0;502.7;502.7;463.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="222.2;27.3;27.3;222.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="239.2" cy="200.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="239.2;517.1;517.1;239.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="200.3;35.3;35.3;200.3"/></circle>
<circle r="3" fill="#4dd4e8" cx="705.8" cy="177.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="705.8;527.8;527.8;705.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="177.7;45.6;45.6;177.7"/></circle>
<circle r="3" fill="#4dd4e8" cx="818.9" cy="42.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="818.9;534.4;534.4;818.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="42.0;57.4;57.4;42.0"/></circle>
<circle r="3" fill="#4dd4e8" cx="123.3" cy="34.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="123.3;536.9;536.9;123.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="34.0;69.7;69.7;34.0"/></circle>
<circle r="3" fill="#1d6f7d" cx="236.1" cy="162.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="236.1;535.8;535.8;236.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="162.4;81.9;81.9;162.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="89.8" cy="104.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="89.8;531.9;531.9;89.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="104.2;93.2;93.2;104.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="37.3" cy="238.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="37.3;526.3;526.3;37.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="238.7;103.1;103.1;238.7"/></circle>
<circle r="3" fill="#4dd4e8" cx="775.7" cy="119.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="775.7;520.2;520.2;775.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="119.7;111.6;111.6;119.7"/></circle>
<circle r="3" fill="#4dd4e8" cx="576.4" cy="128.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="576.4;514.9;514.9;576.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="128.3;118.7;118.7;128.3"/></circle>
<circle r="3" fill="#4dd4e8" cx="129.7" cy="203.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="129.7;511.2;511.2;129.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="203.5;124.6;124.6;203.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="204.6" cy="220.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="204.6;510.0;510.0;204.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="220.7;130.0;130.0;220.7"/></circle>
<circle r="3" fill="#4dd4e8" cx="256.7" cy="152.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="256.7;511.2;511.2;256.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="152.7;135.4;135.4;152.7"/></circle>
<circle r="3" fill="#4dd4e8" cx="807.5" cy="193.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="807.5;514.9;514.9;807.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="193.2;141.3;141.3;193.2"/></circle>
<circle r="3" fill="#1d6f7d" cx="247.0" cy="194.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="247.0;520.2;520.2;247.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="194.9;148.4;148.4;194.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="196.2" cy="142.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="196.2;526.3;526.3;196.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="142.2;156.9;156.9;142.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="252.9" cy="41.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="252.9;531.9;531.9;252.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="41.9;166.8;166.8;41.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="641.8" cy="236.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="641.8;535.8;535.8;641.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="236.9;178.1;178.1;236.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="163.3" cy="192.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="163.3;536.9;536.9;163.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="192.4;190.3;190.3;192.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="166.4" cy="180.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="166.4;534.4;534.4;166.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="180.2;202.6;202.6;180.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="325.8" cy="157.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="325.8;527.8;527.8;325.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="157.2;214.4;214.4;157.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="471.7" cy="205.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="471.7;517.1;517.1;471.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="205.4;224.7;224.7;205.4"/></circle>
<circle r="3" fill="#1d6f7d" cx="20.7" cy="75.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="20.7;502.7;502.7;20.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="75.8;232.7;232.7;75.8"/></circle>
<circle r="3" fill="#4dd4e8" cx="230.9" cy="184.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="230.9;485.5;485.5;230.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="184.1;238.0;238.0;184.1"/></circle>
<circle r="3" fill="#4dd4e8" cx="217.0" cy="162.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="217.0;466.7;466.7;217.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="162.4;240.0;240.0;162.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="187.1" cy="146.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="187.1;447.4;447.4;187.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="146.9;238.7;238.7;146.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="52.8" cy="23.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="52.8;429.0;429.0;52.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="23.4;234.3;234.3;23.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="403.6" cy="141.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="403.6;412.5;412.5;403.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="141.9;227.2;227.2;141.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="761.6" cy="28.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="761.6;398.8;398.8;761.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="28.9;218.1;218.1;28.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="523.9" cy="94.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="523.9;388.2;388.2;523.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="94.8;207.9;207.9;94.8"/></circle>
<circle r="3" fill="#4dd4e8" cx="50.8" cy="46.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="50.8;380.6;380.6;50.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="46.4;197.3;197.3;46.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="829.3" cy="113.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="829.3;375.7;375.7;829.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="113.6;187.2;187.2;113.6"/></circle>
<circle r="3" fill="#4dd4e8" cx="311.6" cy="21.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="311.6;372.6;372.6;311.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="21.0;178.1;178.1;21.0"/></circle>
<circle r="3" fill="#4dd4e8" cx="774.8" cy="156.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="774.8;370.2;370.2;774.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="156.1;170.5;170.5;156.1"/></circle>
<circle r="3" fill="#1d6f7d" cx="551.4" cy="148.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="551.4;367.5;367.5;551.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="148.5;164.3;164.3;148.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="671.5" cy="238.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="671.5;363.4;363.4;671.5"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="238.9;159.5;159.5;238.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="569.7" cy="190.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="569.7;357.3;357.3;569.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="190.5;155.6;155.6;190.5"/></circle>
<circle r="3" fill="#1d6f7d" cx="231.3" cy="229.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="231.3;348.7;348.7;231.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="229.3;152.2;152.2;229.3"/></circle>
<circle r="3" fill="#4dd4e8" cx="119.3" cy="150.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="119.3;337.7;337.7;119.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="150.0;148.4;148.4;150.0"/></circle>
<circle r="3" fill="#4dd4e8" cx="517.6" cy="147.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="517.6;324.8;324.8;517.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="147.9;143.7;143.7;147.9"/></circle>
<circle r="3" fill="#1d6f7d" cx="485.4" cy="84.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="485.4;310.8;310.8;485.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="84.1;137.7;137.7;84.1"/></circle>
<circle r="3" fill="#4dd4e8" cx="39.2" cy="65.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="39.2;296.9;296.9;39.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="65.5;130.0;130.0;65.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="264.4" cy="164.3"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="264.4;284.5;284.5;264.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="164.3;120.6;120.6;164.3"/></circle>
<circle r="3" fill="#4dd4e8" cx="166.7" cy="231.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="166.7;274.8;274.8;166.7"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="231.5;109.7;109.7;231.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="60.0" cy="212.7"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="60.0;269.0;269.0;60.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="212.7;97.8;97.8;212.7"/></circle>
<circle r="3" fill="#4dd4e8" cx="248.3" cy="112.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="248.3;267.9;267.9;248.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="112.4;85.5;85.5;112.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="39.8" cy="159.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="39.8;271.9;271.9;39.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="159.0;73.8;73.8;159.0"/></circle>
<circle r="3" fill="#1d6f7d" cx="532.0" cy="229.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="532.0;280.8;280.8;532.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="229.1;63.3;63.3;229.1"/></circle>
<circle r="3" fill="#4dd4e8" cx="642.1" cy="45.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="642.1;294.2;294.2;642.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="45.2;54.8;54.8;45.2"/></circle>
<circle r="3" fill="#4dd4e8" cx="807.2" cy="137.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="807.2;311.0;311.0;807.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="137.1;48.8;48.8;137.1"/></circle>
<circle r="3" fill="#4dd4e8" cx="342.4" cy="64.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="342.4;330.1;330.1;342.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="64.9;45.6;45.6;64.9"/></circle>
<circle r="3" fill="#1d6f7d" cx="624.6" cy="183.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="624.6;350.2;350.2;624.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="183.4;45.4;45.4;183.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="56.3" cy="58.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="56.3;369.9;369.9;56.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="58.8;47.7;47.7;58.8"/></circle>
<circle r="3" fill="#4dd4e8" cx="682.6" cy="54.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="682.6;388.2;388.2;682.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="54.5;52.1;52.1;54.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="460.1" cy="226.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="460.1;404.3;404.3;460.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="226.1;57.9;57.9;226.1"/></circle>
<circle r="3" fill="#4dd4e8" cx="682.6" cy="74.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="682.6;417.8;417.8;682.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="74.1;64.3;64.3;74.1"/></circle>
<circle r="3" fill="#1d6f7d" cx="548.1" cy="112.4"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="548.1;429.0;429.0;548.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="112.4;70.5;70.5;112.4"/></circle>
<circle r="3" fill="#4dd4e8" cx="265.1" cy="178.5"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="265.1;438.1;438.1;265.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="178.5;75.8;75.8;178.5"/></circle>
<circle r="3" fill="#4dd4e8" cx="728.6" cy="135.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="728.6;446.2;446.2;728.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="135.9;79.8;79.8;135.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="262.9" cy="215.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="262.9;454.0;454.0;262.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="215.2;82.2;82.2;215.2"/></circle>
<circle r="3" fill="#1d6f7d" cx="582.0" cy="139.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="582.0;462.6;462.6;582.0"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="139.6;83.1;83.1;139.6"/></circle>
<circle r="3" fill="#4dd4e8" cx="661.3" cy="210.2"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="661.3;472.9;472.9;661.3"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="210.2;82.8;82.8;210.2"/></circle>
<circle r="3" fill="#1d6f7d" cx="88.9" cy="100.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="88.9;485.4;485.4;88.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="100.6;81.9;81.9;100.6"/></circle>
<circle r="3" fill="#1d6f7d" cx="364.2" cy="222.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="364.2;500.2;500.2;364.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="222.8;80.9;80.9;222.8"/></circle>
<circle r="3" fill="#1d6f7d" cx="719.9" cy="143.8"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="719.9;517.3;517.3;719.9"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="143.8;80.7;80.7;143.8"/></circle>
<circle r="3" fill="#4dd4e8" cx="168.8" cy="155.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="168.8;535.8;535.8;168.8"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="155.9;81.9;81.9;155.9"/></circle>
<circle r="3" fill="#4dd4e8" cx="473.2" cy="48.0"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="473.2;554.8;554.8;473.2"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="48.0;85.0;85.0;48.0"/></circle>
<circle r="3" fill="#1d6f7d" cx="282.6" cy="60.9"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="282.6;572.9;572.9;282.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="60.9;90.3;90.3;60.9"/></circle>
<circle r="3" fill="#1d6f7d" cx="495.6" cy="74.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="495.6;588.9;588.9;495.6"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="74.1;97.8;97.8;74.1"/></circle>
<circle r="3" fill="#4dd4e8" cx="313.4" cy="136.1"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="313.4;601.4;601.4;313.4"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="136.1;107.3;107.3;136.1"/></circle>
<circle r="3" fill="#1d6f7d" cx="818.1" cy="84.6"><animate attributeName="cx" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="818.1;609.3;609.3;818.1"/><animate attributeName="cy" dur="11s" repeatCount="indefinite" calcMode="spline" keyTimes="0;0.64;0.82;1" keySplines="0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1" values="84.6;118.2;118.2;84.6"/></circle>
<text x="16" y="26" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="14" fill="#4dd4e8">S = 100.0 k·bits</text>
<text x="864" y="26" text-anchor="end" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="14" fill="#7ee2a8">dS/dt &lt; 0</text>
<text x="864" y="246" text-anchor="end" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11" fill="#8b949e">bits sorted by visitors: 0</text>
</svg>

After

Width:  |  Height:  |  Size: 52 KiB

View file

@ -0,0 +1,120 @@
#!/usr/bin/env python3
"""Generate assets/entropy.svg — a SMIL-animated entropy-reversal field.
120 particles loop from a seeded chaos cloud into a (2,5) torus-knot
lattice, hold, and scatter back. State (bits sorted by visitors, chaos
generation) comes from state/demon.json. Stdlib only; deterministic for
a given generation so regenerated output is diffable.
"""
import hashlib
import json
import math
import os
import sys
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATE_PATH = os.path.join(ROOT, "state", "demon.json")
OUT_PATH = os.path.join(ROOT, "assets", "entropy.svg")
WIDTH, HEIGHT = 880, 260
MARGIN = 20
N_PARTICLES = 120
KNOT_R, KNOT_r = 150, 58
DUR = "11s"
KEY_TIMES = "0;0.64;0.82;1"
KEY_SPLINES = "0.25 0.1 0.25 1;0 0 1 1;0.55 0 0.45 1"
BG = "#010409"
BORDER = "#21262d"
CYAN = "#4dd4e8"
DEEP = "#1d6f7d"
GREEN = "#7ee2a8"
MUTED = "#8b949e"
def seeded_unit(index, generation, channel):
"""Deterministic float in [0, 1) from particle index + generation."""
digest = hashlib.sha256(f"{index}:{generation}:{channel}".encode()).digest()
return int.from_bytes(digest[:8], "big") / 2**64
def knot_points(n):
"""(2,5) torus knot sampled at n points, scaled/centered to the canvas."""
raw = []
for i in range(n):
t = 2 * math.pi * i / n
rad = KNOT_R + KNOT_r * math.cos(5 * t)
raw.append((rad * math.cos(2 * t), 0.62 * rad * math.sin(2 * t)))
xs, ys = [p[0] for p in raw], [p[1] for p in raw]
span_x, span_y = max(xs) - min(xs), max(ys) - min(ys)
scale = min((WIDTH - 2 * MARGIN) / span_x, (HEIGHT - 2 * MARGIN) / span_y)
cx, cy = (max(xs) + min(xs)) / 2, (max(ys) + min(ys)) / 2
return [
(WIDTH / 2 + (x - cx) * scale, HEIGHT / 2 + (y - cy) * scale)
for x, y in raw
]
def main():
with open(STATE_PATH) as fh:
state = json.load(fh)
bits = int(state.get("bits_sorted", 0))
generation = int(state.get("generation", 0))
entropy = max(12.7, 100 - 0.0002 * bits)
s_label = f"{entropy:.1f}"
lattice = knot_points(N_PARTICLES)
parts = [
f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" '
f'viewBox="0 0 {WIDTH} {HEIGHT}" role="img" '
f'aria-label="Entropy-reversal field: S = {s_label} k-bits">',
f'<rect x="0.5" y="0.5" width="{WIDTH - 1}" height="{HEIGHT - 1}" '
f'rx="8" fill="{BG}" stroke="{BORDER}"/>',
]
for i, (lx, ly) in enumerate(lattice):
chaos_x = MARGIN + seeded_unit(i, generation, "x") * (WIDTH - 2 * MARGIN)
chaos_y = MARGIN + seeded_unit(i, generation, "y") * (HEIGHT - 2 * MARGIN)
fill = DEEP if seeded_unit(i, generation, "depth") < 0.3 else CYAN
cxv = f"{chaos_x:.1f};{lx:.1f};{lx:.1f};{chaos_x:.1f}"
cyv = f"{chaos_y:.1f};{ly:.1f};{ly:.1f};{chaos_y:.1f}"
parts.append(
f'<circle r="3" fill="{fill}" cx="{chaos_x:.1f}" cy="{chaos_y:.1f}">'
f'<animate attributeName="cx" dur="{DUR}" repeatCount="indefinite" '
f'calcMode="spline" keyTimes="{KEY_TIMES}" keySplines="{KEY_SPLINES}" '
f'values="{cxv}"/>'
f'<animate attributeName="cy" dur="{DUR}" repeatCount="indefinite" '
f'calcMode="spline" keyTimes="{KEY_TIMES}" keySplines="{KEY_SPLINES}" '
f'values="{cyv}"/>'
f'</circle>'
)
font = 'font-family="ui-monospace,SFMono-Regular,Menlo,monospace"'
parts.append(
f'<text x="16" y="26" {font} font-size="14" fill="{CYAN}">'
f'S = {s_label} k·bits</text>'
)
parts.append(
f'<text x="{WIDTH - 16}" y="26" text-anchor="end" {font} '
f'font-size="14" fill="{GREEN}">dS/dt &lt; 0</text>'
)
parts.append(
f'<text x="{WIDTH - 16}" y="{HEIGHT - 14}" text-anchor="end" {font} '
f'font-size="11" fill="{MUTED}">bits sorted by visitors: {bits}</text>'
)
parts.append("</svg>")
svg = "\n".join(parts) + "\n"
os.makedirs(os.path.dirname(OUT_PATH), exist_ok=True)
with open(OUT_PATH, "w") as fh:
fh.write(svg)
size = os.path.getsize(OUT_PATH)
print(f"wrote {OUT_PATH} ({size} bytes, S={s_label}, bits={bits}, gen={generation})")
if size > 200 * 1024:
print("error: SVG exceeds 200 KB budget", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()

210
engine/nightly.py Normal file
View file

@ -0,0 +1,210 @@
#!/usr/bin/env python3
"""Nightly telemetry refresh for the profile README.
Updates the marker-fenced sections of README.md:
FEED 4 newest Strange Quarks articles (RSS if populated, else the
server-rendered blog HTML)
STATS telemetry row with live star/repo totals
FEATURED star counts on the featured project cards
and bumps the entropy field's chaos generation so the field differs daily.
Every section is fail-safe: if a fetch or parse fails, that section is left
untouched and the script still exits 0. Stdlib only.
"""
import datetime
import html as htmllib
import json
import os
import re
import subprocess
import sys
import urllib.request
import xml.etree.ElementTree as ET
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
README = os.path.join(ROOT, "README.md")
STATE_PATH = os.path.join(ROOT, "state", "demon.json")
SITE = "https://stevenmilanese.com"
FEED_URL = f"{SITE}/feed.xml"
BLOG_URL = f"{SITE}/blog"
FEATURED_REPOS = [
("anthropic-certs", "Verified Anthropic certifications — Claude, API, Claude Code CLI, MCP."),
("slTrain", "A steam locomotive for your terminal, smoke trail included."),
("meowchi-releases", "A desktop pet that evolves when you actually get work done."),
("mpl", "Mathematics Programming Language — write the equation, run the equation."),
]
def fetch(url, accept=None):
req = urllib.request.Request(url, headers={"User-Agent": "developtheweb-nightly/1.0"})
if accept:
req.add_header("Accept", accept)
token = os.environ.get("GITHUB_TOKEN")
if token and url.startswith("https://api.github.com"):
req.add_header("Authorization", f"Bearer {token}")
with urllib.request.urlopen(req, timeout=30) as resp:
return resp.read().decode("utf-8", errors="replace")
def gh_api(path):
return json.loads(fetch(f"https://api.github.com{path}", accept="application/vnd.github+json"))
def replace_section(text, marker, body):
start, end = f"<!-- {marker}:START -->", f"<!-- {marker}:END -->"
if start not in text or end not in text:
raise ValueError(f"missing {marker} markers")
pre = text.split(start)[0]
post = text.split(end)[1]
return f"{pre}{start}\n{body}\n{end}{post}"
def articles_from_rss():
root = ET.fromstring(fetch(FEED_URL))
items = []
for item in root.iter("item"):
title = (item.findtext("title") or "").strip()
link = (item.findtext("link") or "").strip()
pub = (item.findtext("pubDate") or "").strip()
date = None
try:
date = datetime.datetime.strptime(pub[:16].strip(), "%a, %d %b %Y")
except ValueError:
pass
if title and link:
items.append({"title": title, "url": link, "date": date, "meta": ""})
return items
def articles_from_html():
page = fetch(BLOG_URL)
skip = ("/blog/tag/", "/blog/author/")
anchors = [
m for m in re.finditer(r'<a[^>]+href="(/blog/[a-z0-9][a-z0-9-]*)"', page)
if not m.group(1).startswith(skip)
]
seen, articles = set(), []
for idx, m in enumerate(anchors):
slug = m.group(1)
if slug in seen:
continue
seen.add(slug)
stop = len(page)
for nxt in anchors[idx + 1:]:
if nxt.group(1) != slug:
stop = nxt.start()
break
window = page[m.start():stop]
title_m = re.search(r'alt="([^"]+)"', window)
stripped = re.sub(r"<[^>]+>", " ", window)
stripped = htmllib.unescape(re.sub(r"<!--.*?-->", "", stripped))
date_m = re.search(r"([A-Z][a-z]+ \d{1,2}, \d{4})", stripped)
mins_m = re.search(r"(\d+)\s*min", stripped)
views_m = re.search(r"([\d,]+)\s*views", stripped)
if not (title_m and date_m):
continue
date = datetime.datetime.strptime(date_m.group(1), "%B %d, %Y")
meta = f"{mins_m.group(1)} min read" if mins_m else (
f"{views_m.group(1)} views" if views_m else ""
)
articles.append({
"title": htmllib.unescape(title_m.group(1)),
"url": f"{SITE}{slug}",
"date": date,
"meta": meta,
})
return articles
def update_feed(text):
articles = []
try:
articles = articles_from_rss()
except Exception as exc:
print(f"feed: rss unusable ({exc}); falling back to html")
if not articles:
articles = articles_from_html()
dated = [a for a in articles if a["date"]]
dated.sort(key=lambda a: a["date"], reverse=True)
newest = dated[:4]
if len(newest) < 4:
raise ValueError(f"only {len(newest)} parseable articles")
rows = ["| Article | |", "|:---|---:|"]
for a in newest:
title = a["title"].replace("|", "\\|")
when = a["date"].strftime("%b %d, %Y").replace(" 0", " ")
meta = f"{when} · {a['meta']}" if a["meta"] else when
rows.append(f"| [{title}]({a['url']}) | {meta} |")
return replace_section(text, "FEED", "\n".join(rows))
def update_stats(text):
repos = gh_api("/users/developtheweb/repos?per_page=100&type=owner")
public = [r for r in repos if not r["private"]]
stars = sum(r["stargazers_count"] for r in public)
line = (
"<div align=\"center\">\n\n"
"`10¹⁰⁶ yr until heat death — the deadline` · "
"`2.9 zJ of order per bit sorted (kT ln 2, 300 K)` · "
f"`★ {stars} stars across {len(public)} public repos`\n\n"
"</div>"
)
return replace_section(text, "STATS", line)
def update_featured(text):
cards = []
for name, blurb in FEATURED_REPOS:
repo = gh_api(f"/repos/developtheweb/{name}")
cards.append(
f'<td width="50%" valign="top">\n'
f'<h3 align="center"><a href="{repo["html_url"]}">{name}</a></h3>\n'
f'<p align="center"><code>★ {repo["stargazers_count"]}</code></p>\n'
f'<p align="center">{blurb}</p>\n'
f'</td>'
)
table = (
'<div align="center">\n<table>\n'
f'<tr>\n{cards[0]}\n{cards[1]}\n</tr>\n'
f'<tr>\n{cards[2]}\n{cards[3]}\n</tr>\n'
'</table>\n</div>'
)
return replace_section(text, "FEATURED", table)
def bump_entropy():
with open(STATE_PATH) as fh:
state = json.load(fh)
state["generation"] += 1
with open(STATE_PATH, "w") as fh:
json.dump(state, fh, indent=2)
fh.write("\n")
subprocess.run(
[sys.executable, os.path.join(ROOT, "engine", "generate_entropy_svg.py")],
check=True,
)
def main():
with open(README) as fh:
text = fh.read()
for label, fn in (("FEED", update_feed), ("STATS", update_stats), ("FEATURED", update_featured)):
try:
text = fn(text)
print(f"{label}: updated")
except Exception as exc:
print(f"{label}: left untouched ({exc})")
with open(README, "w") as fh:
fh.write(text)
try:
bump_entropy()
print("ENTROPY: regenerated")
except Exception as exc:
print(f"ENTROPY: left untouched ({exc})")
if __name__ == "__main__":
main()

6
state/demon.json Normal file
View file

@ -0,0 +1,6 @@
{
"bits_sorted": 0,
"generation": 1,
"demons": 0,
"last_sorted_at": null
}