Compare commits
No commits in common. "main" and "pre-moonshot" have entirely different histories.
main
...
pre-moonsh
11 changed files with 191 additions and 748 deletions
BIN
.DS_Store
vendored
Normal file
BIN
.DS_Store
vendored
Normal file
Binary file not shown.
62
.github/workflows/demon.yml
vendored
62
.github/workflows/demon.yml
vendored
|
|
@ -1,62 +0,0 @@
|
||||||
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
37
.github/workflows/nightly.yml
vendored
|
|
@ -1,37 +0,0 @@
|
||||||
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
|
|
||||||
4
.github/workflows/snake.yml
vendored
4
.github/workflows/snake.yml
vendored
|
|
@ -7,6 +7,10 @@ on:
|
||||||
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
generate:
|
generate:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -1,3 +0,0 @@
|
||||||
.DS_Store
|
|
||||||
__pycache__/
|
|
||||||
*.pyc
|
|
||||||
32
CLAUDE.md
32
CLAUDE.md
|
|
@ -4,33 +4,23 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
||||||
|
|
||||||
## Repository Overview
|
## Repository Overview
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Architecture
|
## Repository Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
README.md profile page; contains marker-fenced generated sections
|
/home/aurelius/git/developtheweb/
|
||||||
engine/generate_entropy_svg.py SMIL-animated assets/entropy.svg from state/demon.json (stdlib only)
|
└── README.md
|
||||||
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
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## README marker sections (machine-written — edit the generators, not the sections)
|
## Working with this Repository
|
||||||
|
|
||||||
- `<!-- FEED:START/END -->` — 4 newest Strange Quarks articles (RSS `/feed.xml` if populated, else parsed from https://stevenmilanese.com/blog HTML)
|
Since this is a profile repository with only a README.md file:
|
||||||
- `<!-- 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
|
|
||||||
|
|
||||||
`engine/nightly.py` is fail-safe per section: on fetch/parse failure it leaves that section untouched and exits 0.
|
- 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/`
|
||||||
|
|
||||||
## Conventions
|
## Note
|
||||||
|
|
||||||
- Conventional commit messages (`feat:`, `fix:`, `chore:`, `ci:`). No attribution footers of any kind.
|
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.
|
||||||
- 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).
|
|
||||||
265
README.md
265
README.md
|
|
@ -1,120 +1,191 @@
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
# Reversing the irreversible
|
<!-- Animated Wave -->
|
||||||
|
<img src="https://capsule-render.vercel.app/api?type=waving&color=gradient&customColorList=14,15,16,17,18,19&height=100§ion=header&fontSize=0" width="100%" />
|
||||||
|
|
||||||
*Rev. Steven Milanese — the second law is statistical, not sacred. The demon pays its bills in bits.*
|
<!-- Logo with Animation -->
|
||||||
|
<img src="https://stevenmilanese.com/StevenMilanese-full-logo.png" alt="Steven Milanese" width="400"/>
|
||||||
|
|
||||||
|
<!-- Animated Typing Header -->
|
||||||
|
[](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>
|
||||||
|
[](https://stevenmilanese.com)
|
||||||
|
[](https://www.linkedin.com/in/stevenmilanese/)
|
||||||
|
[](https://stevenmilanese.com/strange-quarks)
|
||||||
|
<br>
|
||||||
|
[](https://x.com/developtheweb)
|
||||||
|
[](https://t.me/CodeAndVerse)
|
||||||
|
[](mailto:dev@level.host)
|
||||||
|
<br>
|
||||||
|
[](https://orcid.org/0009-0008-0442-208X)
|
||||||
|
[](https://osf.io/3tsd4/)
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Animated Banner -->
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="assets/entropy.svg" width="100%" alt="Entropy-reversal field: particles converging from chaos into a (2,5) torus-knot lattice"/>
|
<img src="https://stevenmilanese.com/StevenMilanese-hero-stars.webp" alt="Hero Banner" width="100%"/>
|
||||||
|
|
||||||
[⚡ 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>
|
</div>
|
||||||
|
|
||||||
## About the Reverend
|
<!-- Quote Section -->
|
||||||
|
<div align="center">
|
||||||
|
<br>
|
||||||
|
<img src="https://quotes-github-readme.vercel.app/api?type=horizontal&theme=tokyonight"e=Transforming%20complexity%20into%20elegance%2C%20one%20algorithm%20at%20a%20time.&author=Steven%20Milanese" alt="Quote"/>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
```
|
## 🎯 About Me
|
||||||
Reverend ≔ Physicist ⊗ Minister ⊗ Systems_Alchemist
|
|
||||||
domain : ℝ³·¹ ⊗ CY₃(χ = ±6)
|
```python
|
||||||
axiom : complexity ⟼ elegance
|
class StevenMilanese:
|
||||||
method : ∀ p ∈ Inconceivable — solve(p) ∨ pose(better_p)
|
def __init__(self):
|
||||||
runtime : Arch Linux, btw
|
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}"
|
||||||
```
|
```
|
||||||
|
|
||||||
*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.*
|
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.
|
||||||
|
|
||||||
## The mission — goals inconceivable by design
|
## 🚀 Tech Arsenal
|
||||||
|
|
||||||
<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**
|
|
||||||
|
|
||||||
Calabi–Yau 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">
|
<div align="center">
|
||||||
|
|
||||||
`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`
|
### Languages & Frameworks
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
### Operating System & Environment
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
### Tools & Technologies
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- STATS:END -->
|
|
||||||
|
|
||||||
## Beneath the physics — the verified inventory
|
## 📊 GitHub Analytics
|
||||||
|
|
||||||
|
<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" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
## 🎨 Featured Projects
|
||||||
|
|
||||||
<!-- FEATURED:START -->
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td width="50%" valign="top">
|
<td width="50%">
|
||||||
<h3 align="center"><a href="https://github.com/developtheweb/anthropic-certs">anthropic-certs</a></h3>
|
<h3 align="center">stevenmilanese.com</h3>
|
||||||
<p align="center"><code>★ 11</code></p>
|
<div align="center">
|
||||||
<p align="center">Verified Anthropic certifications — Claude, API, Claude Code CLI, MCP.</p>
|
<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>
|
||||||
<td width="50%" valign="top">
|
<td width="50%">
|
||||||
<h3 align="center"><a href="https://github.com/developtheweb/slTrain">slTrain</a></h3>
|
<h3 align="center">Emergence Intelligence</h3>
|
||||||
<p align="center"><code>★ 4</code></p>
|
<div align="center">
|
||||||
<p align="center">A steam locomotive for your terminal, smoke trail included.</p>
|
<a href="https://stevenmilanese.com/#projects" target="_blank"><img src="https://stevenmilanese.com/projects/emergence-intelligence.webp" width="100%" alt="Emergence Intelligence"/></a>
|
||||||
</td>
|
<br><br>
|
||||||
</tr>
|
<p><strong>Advanced AI System</strong></p>
|
||||||
<tr>
|
<p>Cognitive architecture • Semantic processing • Episodic memory</p>
|
||||||
<td width="50%" valign="top">
|
<p>
|
||||||
<h3 align="center"><a href="https://github.com/developtheweb/meowchi-releases">meowchi-releases</a></h3>
|
<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 align="center"><code>★ 4</code></p>
|
</p>
|
||||||
<p align="center">A desktop pet that evolves when you actually get work done.</p>
|
</div>
|
||||||
</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>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!-- FEATURED:END -->
|
|
||||||
|
|
||||||
## Latest from Strange Quarks
|
## 📚 Latest Articles
|
||||||
|
|
||||||
<!-- FEED:START -->
|
<div align="center">
|
||||||
| Article | |
|
|
||||||
|:---|---:|
|
|
||||||
| [THE MAJORITY THAT VOTED FOR HEMLOCK - Plato's Republic, Exegesis and Judgment](https://stevenmilanese.com/blog/the-majority-that-voted-for-hemlock-platos-republic-exegesis-and-judgment) | Sep 15, 2026 · 204 min read |
|
|
||||||
| [What Survives the Reset](https://stevenmilanese.com/blog/what-survives-the-reset) | Aug 31, 2026 · 12 min read |
|
|
||||||
| [The Invisible Hand's Blind Spot: A Demand Externality in Competitive Automation](https://stevenmilanese.com/blog/the-invisible-hands-blind-spot-a-demand-externality-in-competitive-automation) | Aug 19, 2026 · 61 min read |
|
|
||||||
| [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 · 19 min read |
|
|
||||||
<!-- FEED:END -->
|
|
||||||
|
|
||||||
|
| 📝 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¢er=true&vCenter=true&width=435&lines=Let's+build+something+amazing!;Open+to+collaborations;Reach+out+anytime!" alt="Typing SVG" />
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
[](https://stevenmilanese.com)
|
||||||
|
[](https://www.linkedin.com/in/stevenmilanese/)
|
||||||
|
[](mailto:dev@level.host)
|
||||||
|
[](https://stevenmilanese.com/strange-quarks)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Snake Animation -->
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<br>
|
<br>
|
||||||
<picture>
|
<picture>
|
||||||
|
|
@ -126,17 +197,13 @@ Earth as information processor, argued in full on [Strange Quarks](https://steve
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<table width="100%">
|
<div align="center">
|
||||||
<tr>
|
<img src="https://stevenmilanese.com/StevenMilanese-ghost-logo.png" alt="Steven Milanese Logo" width="80"/>
|
||||||
<td align="left">
|
<br>
|
||||||
|
<img src="https://readme-typing-svg.demolab.com?font=Fira+Code&size=14&duration=3000&pause=1000&color=718096¢er=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>
|
||||||
|
|
||||||
*Founder, [MoonFactory](https://moonfactory.dev) — development and consulting.*
|
<!-- Wave Footer -->
|
||||||
|
<img src="https://capsule-render.vercel.app/api?type=waving&color=gradient&customColorList=14,15,16,17,18,19&height=80§ion=footer&fontSize=0" width="100%" />
|
||||||
</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>
|
|
||||||
|
|
|
||||||
|
|
@ -1,126 +0,0 @@
|
||||||
<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="424.3" cy="229.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="424.3;612.1;612.1;424.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.9;130.0;130.0;229.9"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="40.3" 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="40.3;609.3;609.3;40.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="46.4;141.8;141.8;46.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="42.5" cy="24.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="42.5;601.4;601.4;42.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="24.6;152.7;152.7;24.6"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="824.8" cy="53.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="824.8;588.9;588.9;824.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="53.4;162.2;162.2;53.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="455.4" cy="46.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="455.4;572.9;572.9;455.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="46.5;169.7;169.7;46.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="611.3" cy="137.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="611.3;554.8;554.8;611.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="137.4;175.0;175.0;137.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="639.8" cy="56.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="639.8;535.8;535.8;639.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="56.3;178.1;178.1;56.3"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="537.3" cy="42.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="537.3;517.3;517.3;537.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="42.4;179.3;179.3;42.4"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="511.9" cy="146.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="511.9;500.2;500.2;511.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="146.4;179.1;179.1;146.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="565.1" cy="153.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="565.1;485.4;485.4;565.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="153.0;178.1;178.1;153.0"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="520.5" cy="34.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="520.5;472.9;472.9;520.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="34.6;177.2;177.2;34.6"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="338.0" cy="221.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="338.0;462.6;462.6;338.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="221.5;176.9;176.9;221.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="813.5" cy="162.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="813.5;454.0;454.0;813.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="162.2;177.8;177.8;162.2"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="674.5" 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="674.5;446.2;446.2;674.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="156.1;180.2;180.2;156.1"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="849.3" cy="74.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="849.3;438.1;438.1;849.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="74.4;184.2;184.2;74.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="76.0" cy="137.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="76.0;429.0;429.0;76.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="137.4;189.5;189.5;137.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="476.2" cy="72.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="476.2;417.8;417.8;476.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="72.2;195.7;195.7;72.2"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="517.9" cy="80.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="517.9;404.3;404.3;517.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="80.5;202.1;202.1;80.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="536.0" cy="146.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="536.0;388.2;388.2;536.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="146.6;207.9;207.9;146.6"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="462.3" 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="462.3;369.9;369.9;462.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="104.2;212.3;212.3;104.2"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="802.6" cy="53.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="802.6;350.2;350.2;802.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="53.1;214.6;214.6;53.1"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="294.3" cy="70.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="294.3;330.1;330.1;294.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="70.4;214.4;214.4;70.4"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="595.6" cy="28.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="595.6;311.0;311.0;595.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.3;211.2;211.2;28.3"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="645.8" cy="196.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="645.8;294.2;294.2;645.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="196.5;205.2;205.2;196.5"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="107.7" cy="82.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="107.7;280.8;280.8;107.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="82.8;196.7;196.7;82.8"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="473.6" cy="115.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="473.6;271.9;271.9;473.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.7;186.2;186.2;115.7"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="529.6" cy="54.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="529.6;267.9;267.9;529.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.8;174.5;174.5;54.8"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="601.5" cy="216.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="601.5;269.0;269.0;601.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="216.9;162.2;162.2;216.9"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="239.5" cy="168.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="239.5;274.8;274.8;239.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="168.4;150.3;150.3;168.4"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="844.2" cy="198.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="844.2;284.5;284.5;844.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="198.9;139.4;139.4;198.9"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="288.8" cy="188.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="288.8;296.9;296.9;288.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="188.6;130.0;130.0;188.6"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="622.3" cy="33.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="622.3;310.8;310.8;622.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="33.8;122.3;122.3;33.8"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="608.4" cy="82.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="608.4;324.8;324.8;608.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="82.3;116.3;116.3;82.3"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="721.8" cy="62.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="721.8;337.7;337.7;721.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="62.2;111.6;111.6;62.2"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="266.7" cy="114.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="266.7;348.7;348.7;266.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="114.9;107.8;107.8;114.9"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="156.6" cy="51.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="156.6;357.3;357.3;156.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="51.4;104.4;104.4;51.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="112.2" cy="147.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="112.2;363.4;363.4;112.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="147.6;100.5;100.5;147.6"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="81.1" cy="203.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="81.1;367.5;367.5;81.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="203.4;95.7;95.7;203.4"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="682.5" cy="178.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.5;370.2;370.2;682.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="178.4;89.5;89.5;178.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="626.0" cy="169.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="626.0;372.6;372.6;626.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="169.3;81.9;81.9;169.3"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="402.9" cy="160.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="402.9;375.7;375.7;402.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="160.6;72.8;72.8;160.6"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="758.9" cy="24.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="758.9;380.6;380.6;758.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="24.2;62.7;62.7;24.2"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="85.0" cy="105.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="85.0;388.2;388.2;85.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="105.9;52.1;52.1;105.9"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="453.8" cy="122.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="453.8;398.8;398.8;453.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="122.3;41.9;41.9;122.3"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="476.2" cy="44.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="476.2;412.5;412.5;476.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="44.9;32.8;32.8;44.9"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="135.8" cy="20.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="135.8;429.0;429.0;135.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="20.3;25.7;25.7;20.3"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="53.6" cy="233.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="53.6;447.4;447.4;53.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="233.7;21.3;21.3;233.7"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="434.0" cy="55.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="434.0;466.7;466.7;434.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="55.7;20.0;20.0;55.7"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="209.9" cy="207.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="209.9;485.5;485.5;209.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="207.7;22.0;22.0;207.7"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="98.6" cy="237.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="98.6;502.7;502.7;98.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="237.8;27.3;27.3;237.8"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="176.7" cy="94.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="176.7;517.1;517.1;176.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="94.1;35.3;35.3;94.1"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="652.0" cy="229.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="652.0;527.8;527.8;652.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.7;45.6;45.6;229.7"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="521.9" cy="52.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="521.9;534.4;534.4;521.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="52.0;57.4;57.4;52.0"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="112.5" cy="212.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="112.5;536.9;536.9;112.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="212.0;69.7;69.7;212.0"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="321.9" cy="195.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="321.9;535.8;535.8;321.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="195.5;81.9;81.9;195.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="310.3" cy="196.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="310.3;531.9;531.9;310.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="196.3;93.2;93.2;196.3"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="689.8" cy="222.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="689.8;526.3;526.3;689.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="222.0;103.1;103.1;222.0"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="697.1" cy="193.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="697.1;520.2;520.2;697.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="193.7;111.6;111.6;193.7"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="468.1" cy="220.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="468.1;514.9;514.9;468.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="220.5;118.7;118.7;220.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="846.1" cy="61.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="846.1;511.2;511.2;846.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="61.1;124.6;124.6;61.1"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="501.8" cy="235.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="501.8;510.0;510.0;501.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="235.0;130.0;130.0;235.0"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="84.3" cy="159.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="84.3;511.2;511.2;84.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="159.3;135.4;135.4;159.3"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="764.4" cy="207.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="764.4;514.9;514.9;764.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="207.0;141.3;141.3;207.0"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="111.9" cy="113.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="111.9;520.2;520.2;111.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="113.5;148.4;148.4;113.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="326.7" cy="40.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="326.7;526.3;526.3;326.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="40.3;156.9;156.9;40.3"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="141.1" cy="137.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="141.1;531.9;531.9;141.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="137.0;166.8;166.8;137.0"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="144.0" cy="164.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="144.0;535.8;535.8;144.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="164.6;178.1;178.1;164.6"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="498.1" cy="38.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="498.1;536.9;536.9;498.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="38.3;190.3;190.3;38.3"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="321.3" cy="26.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="321.3;534.4;534.4;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="26.8;202.6;202.6;26.8"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="835.5" cy="115.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="835.5;527.8;527.8;835.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="115.2;214.4;214.4;115.2"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="510.0" cy="230.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="510.0;517.1;517.1;510.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="230.5;224.7;224.7;230.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="127.7" cy="33.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="127.7;502.7;502.7;127.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="33.7;232.7;232.7;33.7"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="569.1" cy="103.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.1;485.5;485.5;569.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="103.5;238.0;238.0;103.5"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="491.1" cy="42.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="491.1;466.7;466.7;491.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="42.4;240.0;240.0;42.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="389.6" cy="217.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="389.6;447.4;447.4;389.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="217.7;238.7;238.7;217.7"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="142.5" cy="154.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="142.5;429.0;429.0;142.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="154.5;234.3;234.3;154.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="551.4" cy="214.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="551.4;412.5;412.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="214.1;227.2;227.2;214.1"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="124.2" cy="171.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="124.2;398.8;398.8;124.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="171.4;218.1;218.1;171.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="323.5" cy="183.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="323.5;388.2;388.2;323.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="183.8;207.9;207.9;183.8"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="115.6" cy="78.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="115.6;380.6;380.6;115.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="78.2;197.3;197.3;78.2"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="690.0" cy="129.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="690.0;375.7;375.7;690.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="129.0;187.2;187.2;129.0"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="469.1" cy="95.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="469.1;372.6;372.6;469.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="95.5;178.1;178.1;95.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="106.9" cy="77.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="106.9;370.2;370.2;106.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="77.4;170.5;170.5;77.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="799.1" cy="62.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="799.1;367.5;367.5;799.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="62.3;164.3;164.3;62.3"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="750.0" cy="94.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="750.0;363.4;363.4;750.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="94.2;159.5;159.5;94.2"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="390.2" cy="200.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="390.2;357.3;357.3;390.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.0;155.6;155.6;200.0"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="696.5" cy="35.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="696.5;348.7;348.7;696.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="35.5;152.2;152.2;35.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="389.0" cy="158.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="389.0;337.7;337.7;389.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="158.2;148.4;148.4;158.2"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="529.6" cy="110.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="529.6;324.8;324.8;529.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="110.9;143.7;143.7;110.9"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="318.1" cy="75.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="318.1;310.8;310.8;318.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="75.7;137.7;137.7;75.7"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="424.0" cy="139.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="424.0;296.9;296.9;424.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.0;130.0;130.0;139.0"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="588.1" cy="185.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="588.1;284.5;284.5;588.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="185.5;120.6;120.6;185.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="388.0" cy="60.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="388.0;274.8;274.8;388.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.4;109.7;109.7;60.4"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="519.4" cy="220.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="519.4;269.0;269.0;519.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="220.0;97.8;97.8;220.0"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="524.3" cy="149.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="524.3;267.9;267.9;524.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="149.7;85.5;85.5;149.7"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="218.5" cy="27.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="218.5;271.9;271.9;218.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="27.2;73.8;73.8;27.2"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="451.9" cy="59.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="451.9;280.8;280.8;451.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="59.4;63.3;63.3;59.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="288.3" cy="132.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="288.3;294.2;294.2;288.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="132.8;54.8;54.8;132.8"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="382.8" cy="27.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="382.8;311.0;311.0;382.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="27.2;48.8;48.8;27.2"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="834.0" cy="189.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="834.0;330.1;330.1;834.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="189.1;45.6;45.6;189.1"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="55.9" cy="157.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="55.9;350.2;350.2;55.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="157.1;45.4;45.4;157.1"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="497.2" 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="497.2;369.9;369.9;497.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="84.1;47.7;47.7;84.1"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="780.8" cy="121.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="780.8;388.2;388.2;780.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="121.6;52.1;52.1;121.6"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="219.0" cy="62.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="219.0;404.3;404.3;219.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="62.1;57.9;57.9;62.1"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="253.0" cy="91.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="253.0;417.8;417.8;253.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="91.5;64.3;64.3;91.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="775.5" cy="204.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="775.5;429.0;429.0;775.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="204.8;70.5;70.5;204.8"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="668.1" cy="157.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="668.1;438.1;438.1;668.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="157.6;75.8;75.8;157.6"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="607.4" cy="113.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="607.4;446.2;446.2;607.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="113.4;79.8;79.8;113.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="499.6" 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="499.6;454.0;454.0;499.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="203.5;82.2;82.2;203.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="647.8" cy="47.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="647.8;462.6;462.6;647.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="47.2;83.1;83.1;47.2"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="699.2" cy="134.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="699.2;472.9;472.9;699.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="134.3;82.8;82.8;134.3"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="360.3" cy="36.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="360.3;485.4;485.4;360.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="36.0;81.9;81.9;36.0"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="480.1" cy="24.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="480.1;500.2;500.2;480.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="24.8;80.9;80.9;24.8"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="256.4" 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="256.4;517.3;517.3;256.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="205.4;80.7;80.7;205.4"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="588.1" cy="135.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="588.1;535.8;535.8;588.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="135.6;81.9;81.9;135.6"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="784.1" cy="54.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="784.1;554.8;554.8;784.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="54.3;85.0;85.0;54.3"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="588.6" cy="201.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="588.6;572.9;572.9;588.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="201.5;90.3;90.3;201.5"/></circle>
|
|
||||||
<circle r="3" fill="#4dd4e8" cx="575.8" cy="182.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="575.8;588.9;588.9;575.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="182.0;97.8;97.8;182.0"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="609.7" cy="104.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="609.7;601.4;601.4;609.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="104.8;107.3;107.3;104.8"/></circle>
|
|
||||||
<circle r="3" fill="#1d6f7d" cx="665.6" cy="97.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="665.6;609.3;609.3;665.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="97.5;118.2;118.2;97.5"/></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 < 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: 12</text>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 52 KiB |
|
|
@ -1,120 +0,0 @@
|
||||||
#!/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 < 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()
|
|
||||||
|
|
@ -1,264 +0,0 @@
|
||||||
#!/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"
|
|
||||||
# The real feed. /feed.xml was a guess that 404'd for weeks while the HTML
|
|
||||||
# fallback silently matched nothing, so the FEED table quietly froze; it now
|
|
||||||
# also 301s here, but point at the canonical URL rather than lean on that.
|
|
||||||
FEED_URL = f"{SITE}/rss.xml"
|
|
||||||
BLOG_URL = f"{SITE}/blog"
|
|
||||||
# The site publishes read-time in its own namespace — valid for strict parsers,
|
|
||||||
# unambiguous for this one.
|
|
||||||
MANUSCRIPT_NS = "https://stevenmilanese.com/ns/manuscript"
|
|
||||||
|
|
||||||
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():
|
|
||||||
"""Primary source: the site's real feed.
|
|
||||||
|
|
||||||
The feed carries read-time in the site's own namespace, so the meta column
|
|
||||||
comes from the publisher rather than being scraped back out of a page.
|
|
||||||
"""
|
|
||||||
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
|
|
||||||
mins = (item.findtext(f"{{{MANUSCRIPT_NS}}}readingMinutes") or "").strip()
|
|
||||||
meta = f"{mins} min read" if mins.isdigit() else ""
|
|
||||||
if title and link:
|
|
||||||
items.append({"title": title, "url": link, "date": date, "meta": meta})
|
|
||||||
return items
|
|
||||||
|
|
||||||
|
|
||||||
def articles_from_html():
|
|
||||||
"""Fallback: parse the blog index.
|
|
||||||
|
|
||||||
Written against the Manuscript's markup, which is regular enough not to
|
|
||||||
need heuristics — each entry is a `row` div holding one anchor and one
|
|
||||||
`meta` span:
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<a href="/blog/<slug>">Title</a>
|
|
||||||
<span class="meta"> JUL 28, 2025 · 19 MIN </span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
The previous version looked for a thumbnail `alt=` attribute and a
|
|
||||||
Title-Case date. The redesign has neither — no feature images on the index
|
|
||||||
and uppercase abbreviated months — so it matched nothing and silently
|
|
||||||
returned an empty list for weeks.
|
|
||||||
"""
|
|
||||||
page = fetch(BLOG_URL)
|
|
||||||
skip = ("/blog/tag/", "/blog/author/")
|
|
||||||
articles, seen = [], set()
|
|
||||||
|
|
||||||
row_re = re.compile(
|
|
||||||
r'<a[^>]+href="(/blog/[a-z0-9][a-z0-9-]*)"[^>]*>(.*?)</a>'
|
|
||||||
r'.{0,400}?<span[^>]*class="meta"[^>]*>(.*?)</span>',
|
|
||||||
re.S,
|
|
||||||
)
|
|
||||||
for m in row_re.finditer(page):
|
|
||||||
slug, raw_title, raw_meta = m.group(1), m.group(2), m.group(3)
|
|
||||||
if slug.startswith(skip) or slug in seen:
|
|
||||||
continue
|
|
||||||
|
|
||||||
title = htmllib.unescape(re.sub(r"<[^>]+>", "", raw_title)).strip()
|
|
||||||
meta_text = htmllib.unescape(re.sub(r"<[^>]+>", " ", raw_meta))
|
|
||||||
meta_text = re.sub(r"\s+", " ", meta_text).strip()
|
|
||||||
|
|
||||||
# "JUL 28, 2025" — uppercase, abbreviated month.
|
|
||||||
date_m = re.search(r"([A-Za-z]{3,}) (\d{1,2}), (\d{4})", meta_text)
|
|
||||||
if not (title and date_m):
|
|
||||||
continue
|
|
||||||
month, day, year = date_m.groups()
|
|
||||||
date = None
|
|
||||||
for fmt in ("%b %d %Y", "%B %d %Y"):
|
|
||||||
try:
|
|
||||||
date = datetime.datetime.strptime(f"{month.title()} {day} {year}", fmt)
|
|
||||||
break
|
|
||||||
except ValueError:
|
|
||||||
continue
|
|
||||||
if date is None:
|
|
||||||
continue
|
|
||||||
|
|
||||||
mins_m = re.search(r"(\d+)\s*MIN", meta_text, re.I)
|
|
||||||
seen.add(slug)
|
|
||||||
articles.append({
|
|
||||||
"title": title,
|
|
||||||
"url": f"{SITE}{slug}",
|
|
||||||
"date": date,
|
|
||||||
"meta": f"{mins_m.group(1)} min read" if mins_m else "",
|
|
||||||
})
|
|
||||||
return articles
|
|
||||||
|
|
||||||
|
|
||||||
def update_feed(text):
|
|
||||||
articles = []
|
|
||||||
try:
|
|
||||||
articles = articles_from_rss()
|
|
||||||
except Exception as exc:
|
|
||||||
print(f"::warning title=nightly FEED rss::rss unusable ({exc}); falling back to html")
|
|
||||||
if not articles:
|
|
||||||
print("::warning title=nightly FEED fallback::rss yielded nothing; scraping /blog")
|
|
||||||
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 warn(label, exc):
|
|
||||||
"""Fail-safe, but never quiet.
|
|
||||||
|
|
||||||
Every section still degrades to 'leave it alone and exit 0' — a broken
|
|
||||||
fetch must not wedge the profile. What changed is visibility: a section
|
|
||||||
that stops updating now announces itself as a GitHub Actions warning
|
|
||||||
annotation, which surfaces in the run summary instead of scrolling past in
|
|
||||||
a log nobody opens. The FEED table sat frozen for 37 days precisely
|
|
||||||
because a silent skip and a successful run looked identical.
|
|
||||||
"""
|
|
||||||
print(f"::warning title=nightly {label} skipped::{label} left untouched — {exc}")
|
|
||||||
print(f"{label}: left untouched ({exc})", file=sys.stderr)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
with open(README) as fh:
|
|
||||||
text = fh.read()
|
|
||||||
failures = 0
|
|
||||||
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:
|
|
||||||
failures += 1
|
|
||||||
warn(label, exc)
|
|
||||||
with open(README, "w") as fh:
|
|
||||||
fh.write(text)
|
|
||||||
try:
|
|
||||||
bump_entropy()
|
|
||||||
print("ENTROPY: regenerated")
|
|
||||||
except Exception as exc:
|
|
||||||
failures += 1
|
|
||||||
warn("ENTROPY", exc)
|
|
||||||
if failures:
|
|
||||||
print(f"::warning title=nightly incomplete::{failures} of 4 sections did not update")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
{
|
|
||||||
"bits_sorted": 12,
|
|
||||||
"generation": 54,
|
|
||||||
"demons": 1,
|
|
||||||
"last_sorted_at": "2026-07-08T02:02:03+00:00"
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue