replicas-computer 0.3.18 → 0.3.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/assets/desktop/start-services.sh +10 -2
- package/assets/desktop/themes/dark.env +0 -1
- package/assets/desktop/themes/light.env +0 -1
- package/assets/desktop/wallpapers/fjord-dark.jpg +0 -0
- package/assets/desktop/wallpapers/fjord-light.jpg +0 -0
- package/assets/desktop/wallpapers/glowing-peak-dark.jpg +0 -0
- package/assets/desktop/wallpapers/glowing-peak-light.jpg +0 -0
- package/assets/desktop/wallpapers/misty-meadow-dark.jpg +0 -0
- package/assets/desktop/wallpapers/misty-meadow-light.jpg +0 -0
- package/dist/index.js +55 -22
- package/package.json +1 -1
- package/assets/desktop/brand-wallpaper-light.svg +0 -12
- package/assets/desktop/brand-wallpaper.svg +0 -12
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ The versioned computer-use runtime for Replicas workspace images.
|
|
|
15
15
|
- `src/viewer.ts` owns the optional noVNC fallback.
|
|
16
16
|
- `assets/desktop/start-services.sh` owns the X11 and stream process lifecycle.
|
|
17
17
|
- `xsettingsd` broadcasts theme changes to running GTK apps and Chrome. Chrome follows the dashboard theme without reopening tabs; launch it without a `GTK_THEME` override.
|
|
18
|
-
- `assets/desktop/` owns the desktop theme: `
|
|
18
|
+
- `assets/desktop/` owns the desktop theme: `wallpapers/` (a light and dark JPEG per scene; each new desktop picks a different scene), `tint2rc` dock, `openbox-theme/`, `gtk-settings.ini`, the `replicas-terminal` wrapper, `themes/` palettes that `start-services.sh` renders into those templates (`--theme light|dark` switches a running desktop), and the bundled fonts (static TTF instances of General Sans and Geist Mono; variable and WOFF2 builds render with wrong metrics in Pango and VTE).
|
|
19
19
|
|
|
20
20
|
The viewer and agent command paths are independent. `start-services.sh` runs Xvfb, the compositor, PulseAudio and the stream server (and so the encoders it spawns) at nice −10 when `sudo` is available, so CPU load from the apps on the desktop slows those apps instead of stalling the picture of them. One on-demand encoder pair is shared by all viewers, stops when the last viewer disconnects, and restarts without reloading the page. A viewer out of sight (the dashboard keeps one connected while the Desktop tab is hidden) reports `standby`, detected with an `IntersectionObserver` because a hidden iframe keeps its last layout size; while every viewer is in standby the encoder runs at 5 fps on the 1.5 Mbps rung, and the first viewer to become visible returns it to full rate in place.
|
|
21
21
|
|
|
@@ -37,7 +37,7 @@ The viewer exposes `?view=fit|native|pixel` (letterboxed, one source pixel per C
|
|
|
37
37
|
|
|
38
38
|
WebRTC receiver timings use one-second counter differences: `decodeMs` is decode time per decoded frame; `receiverProcessingMs` runs from the first received packet to the decoded frame and already includes buffering and decoding. Neither measures physical display latency. Unsupported counters, counter resets and windows without decoded frames leave these fields absent. The timings appear in diagnostics, `__replicasDesktop` and per-viewer telemetry. See the [WebRTC stats definitions](https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats-totalprocessingdelay).
|
|
39
39
|
|
|
40
|
-
The server records every decision that changes the picture (viewer connects and transport fallbacks with their reason, WebRTC state changes, quality rung moves with the signals that voted for them, encoder swaps, preset changes and keyframe requests) and writes each to the stream log (`/tmp/replicas-computer/stream.log`). `GET /telemetry` returns the `/health` snapshot plus the last 200 events and five minutes of one-second samples (encoder rung, CRF, cap, keyframe interval, preset, fps and kbps; CPU; per-viewer transport, ICE path, pacer counters, socket backlog and the viewer's own reported stats). Fetch it inside the sandbox with `curl -s localhost:6080/telemetry` or through the authenticated preview URL; the dashboard's stream settings menu has **Open stream telemetry**. `REPLICAS_DESKTOP_STREAM_TELEMETRY=1` also writes every sample to the stream log for sessions longer than the in-memory history.
|
|
40
|
+
The server records every decision that changes the picture (viewer connects and transport fallbacks with their reason, WebRTC state changes, quality rung moves with the signals that voted for them, encoder swaps, preset changes and keyframe requests) and writes each to the stream log (`/tmp/replicas-computer/stream.log`). `GET /telemetry` returns the `/health` snapshot plus the last 200 events and five minutes of one-second samples (encoder rung, CRF, cap, keyframe interval, preset, fps and kbps; CPU; per-viewer transport, ICE path, pacer counters, socket backlog and the viewer's own reported stats). Fetch it inside the sandbox with `curl -s localhost:6080/telemetry` or through the authenticated preview URL; the dashboard's stream settings menu has **Open stream telemetry**. `GET /snapshot` returns one 768px JPEG of the current screen; the chat's computer-use tile loads it as a preview of the desktop. `REPLICAS_DESKTOP_STREAM_TELEMETRY=1` also writes every sample to the stream log for sessions longer than the in-memory history.
|
|
41
41
|
|
|
42
42
|
| Variable | Default | Meaning |
|
|
43
43
|
|---|---|---|
|
|
@@ -276,8 +276,9 @@ clear_bridge_pid_if_unhealthy() {
|
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
paint_wallpaper() {
|
|
279
|
-
local wallpaper="${REPLICAS_DESKTOP_WALLPAPER:-$REPLICAS_DESKTOP_TEMPLATES/$WALLPAPER}"
|
|
280
|
-
local rendered_wallpaper="$STATE_DIR/wallpaper-$
|
|
279
|
+
local wallpaper="${REPLICAS_DESKTOP_WALLPAPER:-$REPLICAS_DESKTOP_TEMPLATES/wallpapers/$WALLPAPER-$THEME.jpg}"
|
|
280
|
+
local rendered_wallpaper="$STATE_DIR/wallpaper-$(basename "${wallpaper%.*}")-${WIDTH}x${HEIGHT}.png"
|
|
281
|
+
echo "$wallpaper" > "$STATE_DIR/wallpaper-path"
|
|
281
282
|
if command -v ffmpeg >/dev/null 2>&1 && [ -f "$wallpaper" ] && { [ ! -f "$rendered_wallpaper" ] || [ "$wallpaper" -nt "$rendered_wallpaper" ]; }; then
|
|
282
283
|
ffmpeg -y -loglevel error \
|
|
283
284
|
-i "$wallpaper" \
|
|
@@ -306,6 +307,13 @@ THEME="${REQUESTED_THEME:-${PREVIOUS_THEME:-${REPLICAS_DESKTOP_THEME:-dark}}}"
|
|
|
306
307
|
. "$REPLICAS_DESKTOP_TEMPLATES/themes/$THEME.env"
|
|
307
308
|
echo "$THEME" > "$STATE_DIR/theme"
|
|
308
309
|
|
|
310
|
+
WALLPAPER="$(cat "$STATE_DIR/wallpaper" 2>/dev/null)"
|
|
311
|
+
if ! pgrep -f "Xvfb :$DISPLAY_NUM " >/dev/null 2>&1 || [ ! -f "$REPLICAS_DESKTOP_TEMPLATES/wallpapers/$WALLPAPER-$THEME.jpg" ]; then
|
|
312
|
+
mapfile -t scenes < <(ls "$REPLICAS_DESKTOP_TEMPLATES/wallpapers" 2>/dev/null | sed -n 's/-dark\.jpg$//p' | grep -vx "$WALLPAPER")
|
|
313
|
+
[ "${#scenes[@]}" -gt 0 ] && WALLPAPER="${scenes[RANDOM % ${#scenes[@]}]}"
|
|
314
|
+
echo "$WALLPAPER" > "$STATE_DIR/wallpaper"
|
|
315
|
+
fi
|
|
316
|
+
|
|
309
317
|
render_template() {
|
|
310
318
|
local expr="s|/usr/local/share/replicas/desktop|$REPLICAS_DESKTOP_TEMPLATES|g" key
|
|
311
319
|
for key in $(grep -o '^[A-Z_]*' "$REPLICAS_DESKTOP_TEMPLATES/themes/$THEME.env"); do
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/index.js
CHANGED
|
@@ -191,7 +191,7 @@ import { dirname as dirname4 } from "path";
|
|
|
191
191
|
// src/commands/capture.ts
|
|
192
192
|
import { spawnSync as spawnSync2 } from "child_process";
|
|
193
193
|
import { createHash } from "crypto";
|
|
194
|
-
import { closeSync, copyFileSync, existsSync as existsSync2, mkdirSync as mkdirSync2, openSync, readFileSync as readFileSync2, readSync, rmSync, writeFileSync } from "fs";
|
|
194
|
+
import { closeSync, copyFileSync, existsSync as existsSync2, mkdirSync as mkdirSync2, openSync, readdirSync, readFileSync as readFileSync2, readSync, rmSync, writeFileSync } from "fs";
|
|
195
195
|
import { dirname as dirname2 } from "path";
|
|
196
196
|
var PNG_SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
197
197
|
function readPngDimensions(filePath) {
|
|
@@ -207,18 +207,16 @@ function readPngDimensions(filePath) {
|
|
|
207
207
|
closeSync(fd);
|
|
208
208
|
}
|
|
209
209
|
}
|
|
210
|
-
function
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
const
|
|
216
|
-
if (!
|
|
217
|
-
fail(
|
|
218
|
-
`Brand wallpaper SVG missing at ${path}. The workspace image is out of date \u2014 \`replicas-computer setup\` must install brand-wallpaper.svg at $REPLICAS_DESKTOP_TEMPLATES.`
|
|
219
|
-
);
|
|
210
|
+
function currentWallpaper() {
|
|
211
|
+
const recorded = `${STATE_DIR}/wallpaper-path`;
|
|
212
|
+
const path = existsSync2(recorded) ? readFileSync2(recorded, "utf8").trim() : "";
|
|
213
|
+
if (path && existsSync2(path)) return path;
|
|
214
|
+
const dir = `${process.env.REPLICAS_DESKTOP_TEMPLATES || "/usr/local/share/replicas/desktop"}/wallpapers`;
|
|
215
|
+
const fallback = existsSync2(dir) ? readdirSync(dir).find((name) => name.endsWith("-dark.jpg")) : void 0;
|
|
216
|
+
if (!fallback) {
|
|
217
|
+
fail(`Desktop wallpapers missing at ${dir}. The workspace image is out of date \u2014 \`replicas-computer setup\` must install them.`);
|
|
220
218
|
}
|
|
221
|
-
return
|
|
219
|
+
return `${dir}/${fallback}`;
|
|
222
220
|
}
|
|
223
221
|
var BRAND_PAD_FRACTION = 0.06;
|
|
224
222
|
var SCREENSHOT_CORNER_FRACTION = 0.022;
|
|
@@ -284,7 +282,6 @@ async function computerScreenshotCommand(path, options = {}) {
|
|
|
284
282
|
mkdirSync2(dirname2(target), { recursive: true });
|
|
285
283
|
const stamp = `${process.pid}-${Date.now()}`;
|
|
286
284
|
const rawPath = `/tmp/replicas-screenshot-${stamp}.raw.png`;
|
|
287
|
-
const svgPath = `/tmp/replicas-screenshot-${stamp}.brand.svg`;
|
|
288
285
|
const maskPath = `/tmp/replicas-screenshot-${stamp}.mask.svg`;
|
|
289
286
|
const shadowPath = `/tmp/replicas-screenshot-${stamp}.shadow.svg`;
|
|
290
287
|
const gridPath = `/tmp/replicas-screenshot-${stamp}.grid.svg`;
|
|
@@ -313,7 +310,6 @@ async function computerScreenshotCommand(path, options = {}) {
|
|
|
313
310
|
const shadowMargin = shadowSigma * 3;
|
|
314
311
|
const shadowW = width2 + shadowMargin * 2;
|
|
315
312
|
const shadowH = height2 + shadowMargin * 2;
|
|
316
|
-
writeFileSync(svgPath, loadBrandSvg(canvasW, canvasH));
|
|
317
313
|
writeFileSync(
|
|
318
314
|
maskPath,
|
|
319
315
|
SCREENSHOT_MASK_TEMPLATE.replace(/__W__/g, String(width2)).replace(/__H__/g, String(height2)).replace(/__R__/g, String(cornerR))
|
|
@@ -330,7 +326,7 @@ async function computerScreenshotCommand(path, options = {}) {
|
|
|
330
326
|
"-loglevel",
|
|
331
327
|
"error",
|
|
332
328
|
"-i",
|
|
333
|
-
|
|
329
|
+
currentWallpaper(),
|
|
334
330
|
"-i",
|
|
335
331
|
rawPath,
|
|
336
332
|
"-i",
|
|
@@ -338,7 +334,7 @@ async function computerScreenshotCommand(path, options = {}) {
|
|
|
338
334
|
"-i",
|
|
339
335
|
shadowPath,
|
|
340
336
|
"-filter_complex",
|
|
341
|
-
`[2:v]format=rgba,alphaextract[mask];[3:v]format=rgba,colorchannelmixer=rr=0:gg=0:bb=0:aa=${SHADOW_ALPHA},gblur=sigma=${shadowSigma}[shadow];[1:v]format=rgba[scr];[scr][mask]alphamerge[rounded];[0:v]format=rgba[bg];[bg][shadow]overlay=${padX - shadowMargin}:${padY - shadowMargin + shadowOffsetY}:format=auto[bg_shadow];[bg_shadow][rounded]overlay=${padX}:${padY}:format=auto`,
|
|
337
|
+
`[2:v]format=rgba,alphaextract[mask];[3:v]format=rgba,colorchannelmixer=rr=0:gg=0:bb=0:aa=${SHADOW_ALPHA},gblur=sigma=${shadowSigma}[shadow];[1:v]format=rgba[scr];[scr][mask]alphamerge[rounded];[0:v]scale=${canvasW}:${canvasH}:force_original_aspect_ratio=increase,crop=${canvasW}:${canvasH},gblur=sigma=${shadowSigma * 2},eq=brightness=-0.12,format=rgba[bg];[bg][shadow]overlay=${padX - shadowMargin}:${padY - shadowMargin + shadowOffsetY}:format=auto[bg_shadow];[bg_shadow][rounded]overlay=${padX}:${padY}:format=auto`,
|
|
342
338
|
"-frames:v",
|
|
343
339
|
"1",
|
|
344
340
|
"-update",
|
|
@@ -352,7 +348,6 @@ async function computerScreenshotCommand(path, options = {}) {
|
|
|
352
348
|
}
|
|
353
349
|
} finally {
|
|
354
350
|
rmSync(rawPath, { force: true });
|
|
355
|
-
rmSync(svgPath, { force: true });
|
|
356
351
|
rmSync(maskPath, { force: true });
|
|
357
352
|
rmSync(shadowPath, { force: true });
|
|
358
353
|
rmSync(gridPath, { force: true });
|
|
@@ -2937,7 +2932,7 @@ async function computerStatusCommand() {
|
|
|
2937
2932
|
}
|
|
2938
2933
|
|
|
2939
2934
|
// src/version.ts
|
|
2940
|
-
var COMPUTER_USE_VERSION = "0.3.
|
|
2935
|
+
var COMPUTER_USE_VERSION = "0.3.20";
|
|
2941
2936
|
var COMPUTER_USE_PROTOCOL_VERSION = 1;
|
|
2942
2937
|
|
|
2943
2938
|
// src/program.ts
|
|
@@ -3179,7 +3174,7 @@ async function runComputerClient(argv) {
|
|
|
3179
3174
|
// src/media-server.ts
|
|
3180
3175
|
import { spawn as spawn5 } from "child_process";
|
|
3181
3176
|
import { createHash as createHash3 } from "crypto";
|
|
3182
|
-
import { createReadStream, existsSync as existsSync7, readdirSync, readFileSync as readFileSync7, statSync as statSync2 } from "fs";
|
|
3177
|
+
import { createReadStream, existsSync as existsSync7, readdirSync as readdirSync2, readFileSync as readFileSync7, statSync as statSync2 } from "fs";
|
|
3183
3178
|
import { createServer as createServer2 } from "http";
|
|
3184
3179
|
import { availableParallelism as availableParallelism2, loadavg } from "os";
|
|
3185
3180
|
import { dirname as dirname7, extname, resolve as resolve3 } from "path";
|
|
@@ -5417,6 +5412,44 @@ async function runMediaServer() {
|
|
|
5417
5412
|
}));
|
|
5418
5413
|
return;
|
|
5419
5414
|
}
|
|
5415
|
+
if (url.pathname === "/snapshot") {
|
|
5416
|
+
const capture = spawn5("ffmpeg", [
|
|
5417
|
+
"-hide_banner",
|
|
5418
|
+
"-loglevel",
|
|
5419
|
+
"error",
|
|
5420
|
+
"-f",
|
|
5421
|
+
"x11grab",
|
|
5422
|
+
"-draw_mouse",
|
|
5423
|
+
"0",
|
|
5424
|
+
"-video_size",
|
|
5425
|
+
`${width}x${height}`,
|
|
5426
|
+
"-i",
|
|
5427
|
+
`${display}.0`,
|
|
5428
|
+
"-frames:v",
|
|
5429
|
+
"1",
|
|
5430
|
+
"-vf",
|
|
5431
|
+
"scale=768:-2",
|
|
5432
|
+
"-q:v",
|
|
5433
|
+
"4",
|
|
5434
|
+
"-f",
|
|
5435
|
+
"mjpeg",
|
|
5436
|
+
"pipe:1"
|
|
5437
|
+
], { env: { ...process.env, DISPLAY: display }, stdio: ["ignore", "pipe", "ignore"] });
|
|
5438
|
+
const chunks = [];
|
|
5439
|
+
capture.stdout.on("data", (chunk) => chunks.push(chunk));
|
|
5440
|
+
capture.on("error", () => void 0);
|
|
5441
|
+
capture.on("close", (code) => {
|
|
5442
|
+
response.setHeader("cache-control", "no-store");
|
|
5443
|
+
if (code !== 0 || chunks.length === 0) {
|
|
5444
|
+
response.statusCode = 503;
|
|
5445
|
+
response.end("Snapshot unavailable");
|
|
5446
|
+
return;
|
|
5447
|
+
}
|
|
5448
|
+
response.setHeader("content-type", "image/jpeg");
|
|
5449
|
+
response.end(Buffer.concat(chunks));
|
|
5450
|
+
});
|
|
5451
|
+
return;
|
|
5452
|
+
}
|
|
5420
5453
|
const requested = url.pathname === "/" ? "stream-index.html" : url.pathname.slice(1);
|
|
5421
5454
|
const path = resolve3(webroot, requested);
|
|
5422
5455
|
if (!path.startsWith(resolve3(webroot) + "/") || !existsSync7(path) || !statSync2(path).isFile()) {
|
|
@@ -5431,7 +5464,7 @@ async function runMediaServer() {
|
|
|
5431
5464
|
if (webrtc) void currentIceServers();
|
|
5432
5465
|
response.setHeader("cache-control", "no-store");
|
|
5433
5466
|
const digest = createHash3("sha1");
|
|
5434
|
-
for (const name of
|
|
5467
|
+
for (const name of readdirSync2(webroot).filter((file) => /\.(js|css)$/.test(file)).sort()) digest.update(readFileSync7(resolve3(webroot, name)));
|
|
5435
5468
|
response.end(readFileSync7(path, "utf8").replaceAll("__VERSION__", `${COMPUTER_USE_VERSION}-${digest.digest("hex").slice(0, 8)}`));
|
|
5436
5469
|
return;
|
|
5437
5470
|
}
|
|
@@ -5544,7 +5577,7 @@ async function runMediaServer() {
|
|
|
5544
5577
|
|
|
5545
5578
|
// src/setup.ts
|
|
5546
5579
|
import { spawnSync as spawnSync6 } from "child_process";
|
|
5547
|
-
import { accessSync, chmodSync as chmodSync2, constants, cpSync, existsSync as existsSync8, mkdirSync as mkdirSync6, readdirSync as
|
|
5580
|
+
import { accessSync, chmodSync as chmodSync2, constants, cpSync, existsSync as existsSync8, mkdirSync as mkdirSync6, readdirSync as readdirSync3, writeFileSync as writeFileSync5 } from "fs";
|
|
5548
5581
|
import { dirname as dirname8, resolve as resolve4 } from "path";
|
|
5549
5582
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
5550
5583
|
var dependencies = [
|
|
@@ -5667,7 +5700,7 @@ async function setupComputer(options = {}) {
|
|
|
5667
5700
|
cpSync(assets, "/usr/local/share/replicas/desktop", { recursive: true, force: true });
|
|
5668
5701
|
const fontRoot = "/usr/local/share/fonts/replicas";
|
|
5669
5702
|
mkdirSync6(fontRoot, { recursive: true });
|
|
5670
|
-
for (const file of
|
|
5703
|
+
for (const file of readdirSync3(assets).filter((name) => name.endsWith(".ttf"))) cpSync(resolve4(assets, file), resolve4(fontRoot, file), { force: true });
|
|
5671
5704
|
spawnSync6("fc-cache", ["-f", fontRoot], { stdio: "ignore" });
|
|
5672
5705
|
const viewerRoot = "/usr/local/share/replicas/desktop/novnc";
|
|
5673
5706
|
mkdirSync6(viewerRoot, { recursive: true });
|
package/package.json
CHANGED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<svg width="1920" height="1080" viewBox="0 0 1920 1080" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="cell" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#2fc487" stop-opacity="0.3"/><stop offset="1" stop-color="#2fc487" stop-opacity="0.14"/></linearGradient>
|
|
4
|
-
<pattern id="grid" width="64" height="64" y="28" patternUnits="userSpaceOnUse"><path d="M0.5 0V64M0 0.5H64" stroke="#162118" stroke-opacity="0.1"/></pattern>
|
|
5
|
-
<filter id="cell-glow" x="-25%" y="-25%" width="150%" height="150%"><feDropShadow dx="0" dy="0" stdDeviation="10" flood-color="#2fc487" flood-opacity="0.18"/></filter>
|
|
6
|
-
</defs>
|
|
7
|
-
<rect width="1920" height="1080" fill="#f4f5f1"/>
|
|
8
|
-
<rect width="1920" height="1080" fill="url(#grid)"/>
|
|
9
|
-
<g fill="url(#cell)" stroke="#2fc487" filter="url(#cell-glow)"><rect x="768.5" y="220.5" width="64" height="64"/><rect x="768.5" y="284.5" width="64" height="64"/><rect x="832.5" y="220.5" width="64" height="64"/><rect x="832.5" y="284.5" width="64" height="64"/><rect x="896.5" y="220.5" width="64" height="64"/><rect x="896.5" y="284.5" width="64" height="64"/><rect x="960.5" y="220.5" width="64" height="64"/><rect x="960.5" y="284.5" width="64" height="64"/><rect x="1024.5" y="348.5" width="64" height="64"/><rect x="1024.5" y="412.5" width="64" height="64"/><rect x="1088.5" y="348.5" width="64" height="64"/><rect x="1088.5" y="412.5" width="64" height="64"/><rect x="768.5" y="476.5" width="64" height="64"/><rect x="768.5" y="540.5" width="64" height="64"/><rect x="832.5" y="476.5" width="64" height="64"/><rect x="832.5" y="540.5" width="64" height="64"/><rect x="896.5" y="476.5" width="64" height="64"/><rect x="896.5" y="540.5" width="64" height="64"/><rect x="960.5" y="476.5" width="64" height="64"/><rect x="960.5" y="540.5" width="64" height="64"/><rect x="768.5" y="604.5" width="64" height="64"/><rect x="768.5" y="668.5" width="64" height="64"/><rect x="832.5" y="604.5" width="64" height="64"/><rect x="832.5" y="668.5" width="64" height="64"/><rect x="1024.5" y="604.5" width="64" height="64"/><rect x="1024.5" y="668.5" width="64" height="64"/><rect x="1088.5" y="604.5" width="64" height="64"/><rect x="1088.5" y="668.5" width="64" height="64"/><rect x="320.5" y="156.5" width="64" height="64"/><rect x="384.5" y="220.5" width="64" height="64"/><rect x="256.5" y="284.5" width="64" height="64"/><rect x="320.5" y="284.5" width="64" height="64"/><rect x="384.5" y="284.5" width="64" height="64"/><rect x="1536.5" y="220.5" width="64" height="64"/><rect x="1472.5" y="284.5" width="64" height="64"/><rect x="1600.5" y="348.5" width="64" height="64"/><rect x="1536.5" y="348.5" width="64" height="64"/><rect x="1472.5" y="348.5" width="64" height="64"/><rect x="448.5" y="860.5" width="64" height="64"/><rect x="512.5" y="796.5" width="64" height="64"/><rect x="384.5" y="732.5" width="64" height="64"/><rect x="448.5" y="732.5" width="64" height="64"/><rect x="512.5" y="732.5" width="64" height="64"/><rect x="1344.5" y="796.5" width="64" height="64"/><rect x="1408.5" y="796.5" width="64" height="64"/><rect x="1472.5" y="796.5" width="64" height="64"/><rect x="1664.5" y="540.5" width="64" height="64"/><rect x="1728.5" y="540.5" width="64" height="64"/><rect x="1664.5" y="604.5" width="64" height="64"/><rect x="1728.5" y="604.5" width="64" height="64"/></g>
|
|
10
|
-
<g font-family="Geist Mono, monospace" font-size="5" font-weight="600" fill="#2f9d57"><text x="774" y="233">AGENT-73</text><text x="774" y="276">CODING</text><text x="774" y="297">AGENT-45</text><text x="774" y="340">DEPLOYING</text><text x="838" y="233">AGENT-10</text><text x="838" y="276">LINTING</text><text x="838" y="297">AGENT-82</text><text x="838" y="340">MERGING</text><text x="902" y="233">AGENT-47</text><text x="902" y="276">REFACTORING</text><text x="902" y="297">AGENT-19</text><text x="902" y="340">CODING</text><text x="966" y="233">AGENT-84</text><text x="966" y="276">RUNNING TESTS</text><text x="966" y="297">AGENT-56</text><text x="966" y="340">LINTING</text><text x="1030" y="361">AGENT-65</text><text x="1030" y="404">CODING</text><text x="1030" y="425">AGENT-37</text><text x="1030" y="468">DEPLOYING</text><text x="1094" y="361">AGENT-02</text><text x="1094" y="404">LINTING</text><text x="1094" y="425">AGENT-74</text><text x="1094" y="468">MERGING</text><text x="774" y="489">AGENT-61</text><text x="774" y="532">DEPLOYING</text><text x="774" y="553">AGENT-33</text><text x="774" y="596">REFACTORING</text><text x="838" y="489">AGENT-98</text><text x="838" y="532">MERGING</text><text x="838" y="553">AGENT-70</text><text x="838" y="596">RUNNING TESTS</text><text x="902" y="489">AGENT-35</text><text x="902" y="532">CODING</text><text x="902" y="553">AGENT-07</text><text x="902" y="596">DEPLOYING</text><text x="966" y="489">AGENT-72</text><text x="966" y="532">LINTING</text><text x="966" y="553">AGENT-44</text><text x="966" y="596">MERGING</text><text x="774" y="617">AGENT-05</text><text x="774" y="660">CODING</text><text x="774" y="681">AGENT-77</text><text x="774" y="724">DEPLOYING</text><text x="838" y="617">AGENT-42</text><text x="838" y="660">LINTING</text><text x="838" y="681">AGENT-14</text><text x="838" y="724">MERGING</text><text x="1030" y="617">AGENT-53</text><text x="1030" y="660">DEPLOYING</text><text x="1030" y="681">AGENT-25</text><text x="1030" y="724">REFACTORING</text><text x="1094" y="617">AGENT-90</text><text x="1094" y="660">MERGING</text><text x="1094" y="681">AGENT-62</text><text x="1094" y="724">RUNNING TESTS</text><text x="326" y="169">AGENT-42</text><text x="326" y="212">LINTING</text><text x="390" y="233">AGENT-51</text><text x="390" y="276">CODING</text><text x="262" y="297">AGENT-49</text><text x="262" y="340">REFACTORING</text><text x="326" y="297">AGENT-86</text><text x="326" y="340">RUNNING TESTS</text><text x="390" y="297">AGENT-23</text><text x="390" y="340">DEPLOYING</text><text x="1542" y="233">AGENT-17</text><text x="1542" y="276">CODING</text><text x="1478" y="297">AGENT-52</text><text x="1478" y="340">RUNNING TESTS</text><text x="1606" y="361">AGENT-98</text><text x="1606" y="404">RUNNING TESTS</text><text x="1542" y="361">AGENT-61</text><text x="1542" y="404">REFACTORING</text><text x="1478" y="361">AGENT-24</text><text x="1478" y="404">LINTING</text><text x="454" y="873">AGENT-08</text><text x="454" y="916">MERGING</text><text x="518" y="809">AGENT-73</text><text x="518" y="852">REFACTORING</text><text x="390" y="745">AGENT-27</text><text x="390" y="788">REFACTORING</text><text x="454" y="745">AGENT-64</text><text x="454" y="788">RUNNING TESTS</text><text x="518" y="745">AGENT-01</text><text x="518" y="788">DEPLOYING</text><text x="1350" y="809">AGENT-54</text><text x="1350" y="852">RUNNING TESTS</text><text x="1414" y="809">AGENT-91</text><text x="1414" y="852">DEPLOYING</text><text x="1478" y="809">AGENT-28</text><text x="1478" y="852">MERGING</text><text x="1670" y="553">AGENT-51</text><text x="1670" y="596">DEPLOYING</text><text x="1734" y="553">AGENT-88</text><text x="1734" y="596">MERGING</text><text x="1670" y="617">AGENT-23</text><text x="1670" y="660">REFACTORING</text><text x="1734" y="617">AGENT-60</text><text x="1734" y="660">RUNNING TESTS</text></g>
|
|
11
|
-
<path transform="translate(893.05 842)" fill="#162118" fill-opacity="0.9" d="M5.3 0H3.3V-28.7H13.2Q17.5 -28.7 20 -26.5Q22.6 -24.3 22.6 -20.2Q22.6 -16.9 20.5 -14.6Q18.4 -12.4 14.9 -12L23.3 0H20.9L12.8 -11.8H5.3ZM5.3 -27.1V-13.4H13Q16.5 -13.4 18.5 -15.2Q20.6 -17 20.6 -20.2Q20.6 -23.5 18.5 -25.3Q16.5 -27.1 13 -27.1Z M33.8 0.4Q31 0.4 28.8 -0.9Q26.6 -2.3 25.4 -4.9Q24.2 -7.4 24.2 -10.7Q24.2 -13.7 25.5 -16.2Q26.7 -18.6 28.8 -20Q30.9 -21.4 33.6 -21.4Q35.8 -21.4 37.5 -20.6Q39.2 -19.7 40.5 -18.2Q41.7 -16.7 42.3 -14.7Q42.9 -12.6 42.8 -10.1H25.2V-11.5H40.9Q40.7 -15.4 38.8 -17.7Q36.8 -19.9 33.6 -19.9Q31.4 -19.9 29.7 -18.7Q28 -17.6 27 -15.5Q26.1 -13.5 26.1 -10.7Q26.1 -7.8 27 -5.6Q27.9 -3.4 29.7 -2.3Q31.4 -1.1 33.8 -1.1Q36.7 -1.1 38.6 -2.7Q40.6 -4.3 41.1 -7.1H42.9Q42.3 -3.6 39.8 -1.6Q37.4 0.4 33.8 0.4Z M64.2 -10.5Q64.2 -7.2 63.1 -4.8Q61.9 -2.3 59.9 -1Q57.8 0.4 55 0.4Q52.5 0.4 50.5 -1Q48.5 -2.4 47.4 -4.8V7.7H45.5V-21H47.3V-15.9Q48.3 -18.5 50.4 -19.9Q52.5 -21.4 55 -21.4Q57.8 -21.4 59.9 -20Q61.9 -18.7 63.1 -16.2Q64.2 -13.8 64.2 -10.5ZM62.3 -10.5Q62.3 -14.8 60.3 -17.3Q58.3 -19.8 54.8 -19.8Q52.7 -19.8 51 -18.7Q49.3 -17.6 48.3 -15.5Q47.3 -13.5 47.3 -10.5Q47.3 -7.7 48.3 -5.6Q49.2 -3.5 50.9 -2.3Q52.6 -1.2 54.8 -1.2Q58.3 -1.2 60.3 -3.6Q62.3 -6.1 62.3 -10.5Z M68.7 0H66.8V-28.7H68.7Z M74.8 0H72.9V-21H74.8ZM75.6 -25.8Q75.6 -25.1 75.2 -24.6Q74.7 -24.1 73.9 -24.1Q73.1 -24.1 72.6 -24.6Q72.1 -25.1 72.1 -25.8Q72.1 -26.6 72.6 -27Q73.1 -27.5 73.9 -27.5Q74.7 -27.5 75.2 -27Q75.6 -26.6 75.6 -25.8Z M86.5 0.4Q83.8 0.4 81.8 -0.9Q79.7 -2.3 78.6 -4.8Q77.4 -7.3 77.4 -10.5Q77.4 -13.7 78.6 -16.2Q79.7 -18.6 81.8 -20Q83.9 -21.4 86.5 -21.4Q88.9 -21.4 90.7 -20.4Q92.6 -19.4 93.8 -17.6Q95 -15.7 95.5 -13.2H93.6Q93 -16.3 91.2 -18.1Q89.3 -19.8 86.5 -19.8Q84.4 -19.8 82.8 -18.6Q81.1 -17.4 80.2 -15.4Q79.3 -13.3 79.3 -10.5Q79.3 -7.7 80.2 -5.6Q81.1 -3.5 82.8 -2.3Q84.4 -1.1 86.5 -1.1Q89.3 -1.1 91.2 -2.9Q93.1 -4.7 93.6 -7.8H95.5Q95.1 -5.2 93.8 -3.4Q92.6 -1.6 90.8 -0.6Q88.9 0.4 86.5 0.4Z M111.1 0V-4.2Q110.3 -2.1 108.3 -0.9Q106.4 0.4 103.9 0.4Q100.6 0.4 98.7 -1.3Q96.7 -2.9 96.7 -5.7Q96.7 -8.8 99.2 -10.4Q101.6 -11.9 106.4 -11.9Q107.4 -11.9 108.3 -11.9Q109.3 -11.8 111 -11.7V-13.6Q111 -16.6 109.5 -18.2Q108.1 -19.9 105.4 -19.9Q102.6 -19.9 100.9 -18.2Q99.3 -16.5 99.2 -13.7H97.5Q97.5 -16 98.5 -17.7Q99.5 -19.4 101.3 -20.4Q103.1 -21.4 105.4 -21.4Q108.9 -21.4 110.9 -19.4Q112.8 -17.4 112.8 -13.8V0ZM98.6 -5.8Q98.6 -3.7 100.1 -2.4Q101.6 -1 104 -1Q107.2 -1 109.1 -3.1Q111 -5.1 111 -8.4V-10.4Q109.5 -10.5 108.5 -10.5Q107.4 -10.6 106.5 -10.6Q102.5 -10.6 100.5 -9.4Q98.6 -8.2 98.6 -5.8Z M131.9 -5.5Q131.9 -2.8 129.8 -1.2Q127.7 0.4 123.9 0.4Q120.3 0.4 118 -1.4Q115.8 -3.2 115.5 -6.4H117.3Q117.4 -3.9 119.2 -2.5Q121 -1.1 124 -1.1Q126.9 -1.1 128.5 -2.2Q130 -3.3 130 -5.3Q130 -7.1 128.9 -8Q127.8 -8.9 125.2 -9.4L122.4 -10Q119.3 -10.6 117.8 -12Q116.3 -13.4 116.3 -15.6Q116.3 -17.3 117.2 -18.6Q118.2 -19.9 119.8 -20.6Q121.5 -21.4 123.7 -21.4Q126 -21.4 127.7 -20.6Q129.5 -19.8 130.5 -18.3Q131.5 -16.8 131.7 -14.8H129.9Q129.7 -17.2 128 -18.6Q126.4 -19.9 123.7 -19.9Q121.2 -19.9 119.6 -18.8Q118.1 -17.7 118.1 -15.8Q118.1 -14 119.2 -13.1Q120.4 -12.1 123 -11.6L125.9 -11Q129 -10.4 130.5 -9.1Q131.9 -7.8 131.9 -5.5Z"/>
|
|
12
|
-
</svg>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<svg width="1920" height="1080" viewBox="0 0 1920 1080" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="cell" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#3eeba3" stop-opacity="0.24"/><stop offset="1" stop-color="#3eeba3" stop-opacity="0.12"/></linearGradient>
|
|
4
|
-
<pattern id="grid" width="64" height="64" y="28" patternUnits="userSpaceOnUse"><path d="M0.5 0V64M0 0.5H64" stroke="#ffffff" stroke-opacity="0.07"/></pattern>
|
|
5
|
-
<filter id="cell-glow" x="-25%" y="-25%" width="150%" height="150%"><feDropShadow dx="0" dy="0" stdDeviation="10" flood-color="#2a8f65" flood-opacity="0.06"/></filter>
|
|
6
|
-
</defs>
|
|
7
|
-
<rect width="1920" height="1080" fill="#121212"/>
|
|
8
|
-
<rect width="1920" height="1080" fill="url(#grid)"/>
|
|
9
|
-
<g fill="url(#cell)" stroke="#2a8f65" filter="url(#cell-glow)"><rect x="768.5" y="220.5" width="64" height="64"/><rect x="768.5" y="284.5" width="64" height="64"/><rect x="832.5" y="220.5" width="64" height="64"/><rect x="832.5" y="284.5" width="64" height="64"/><rect x="896.5" y="220.5" width="64" height="64"/><rect x="896.5" y="284.5" width="64" height="64"/><rect x="960.5" y="220.5" width="64" height="64"/><rect x="960.5" y="284.5" width="64" height="64"/><rect x="1024.5" y="348.5" width="64" height="64"/><rect x="1024.5" y="412.5" width="64" height="64"/><rect x="1088.5" y="348.5" width="64" height="64"/><rect x="1088.5" y="412.5" width="64" height="64"/><rect x="768.5" y="476.5" width="64" height="64"/><rect x="768.5" y="540.5" width="64" height="64"/><rect x="832.5" y="476.5" width="64" height="64"/><rect x="832.5" y="540.5" width="64" height="64"/><rect x="896.5" y="476.5" width="64" height="64"/><rect x="896.5" y="540.5" width="64" height="64"/><rect x="960.5" y="476.5" width="64" height="64"/><rect x="960.5" y="540.5" width="64" height="64"/><rect x="768.5" y="604.5" width="64" height="64"/><rect x="768.5" y="668.5" width="64" height="64"/><rect x="832.5" y="604.5" width="64" height="64"/><rect x="832.5" y="668.5" width="64" height="64"/><rect x="1024.5" y="604.5" width="64" height="64"/><rect x="1024.5" y="668.5" width="64" height="64"/><rect x="1088.5" y="604.5" width="64" height="64"/><rect x="1088.5" y="668.5" width="64" height="64"/><rect x="320.5" y="156.5" width="64" height="64"/><rect x="384.5" y="220.5" width="64" height="64"/><rect x="256.5" y="284.5" width="64" height="64"/><rect x="320.5" y="284.5" width="64" height="64"/><rect x="384.5" y="284.5" width="64" height="64"/><rect x="1536.5" y="220.5" width="64" height="64"/><rect x="1472.5" y="284.5" width="64" height="64"/><rect x="1600.5" y="348.5" width="64" height="64"/><rect x="1536.5" y="348.5" width="64" height="64"/><rect x="1472.5" y="348.5" width="64" height="64"/><rect x="448.5" y="860.5" width="64" height="64"/><rect x="512.5" y="796.5" width="64" height="64"/><rect x="384.5" y="732.5" width="64" height="64"/><rect x="448.5" y="732.5" width="64" height="64"/><rect x="512.5" y="732.5" width="64" height="64"/><rect x="1344.5" y="796.5" width="64" height="64"/><rect x="1408.5" y="796.5" width="64" height="64"/><rect x="1472.5" y="796.5" width="64" height="64"/><rect x="1664.5" y="540.5" width="64" height="64"/><rect x="1728.5" y="540.5" width="64" height="64"/><rect x="1664.5" y="604.5" width="64" height="64"/><rect x="1728.5" y="604.5" width="64" height="64"/></g>
|
|
10
|
-
<g font-family="Geist Mono, monospace" font-size="5" font-weight="600" fill="#48ae80"><text x="774" y="233">AGENT-73</text><text x="774" y="276">CODING</text><text x="774" y="297">AGENT-45</text><text x="774" y="340">DEPLOYING</text><text x="838" y="233">AGENT-10</text><text x="838" y="276">LINTING</text><text x="838" y="297">AGENT-82</text><text x="838" y="340">MERGING</text><text x="902" y="233">AGENT-47</text><text x="902" y="276">REFACTORING</text><text x="902" y="297">AGENT-19</text><text x="902" y="340">CODING</text><text x="966" y="233">AGENT-84</text><text x="966" y="276">RUNNING TESTS</text><text x="966" y="297">AGENT-56</text><text x="966" y="340">LINTING</text><text x="1030" y="361">AGENT-65</text><text x="1030" y="404">CODING</text><text x="1030" y="425">AGENT-37</text><text x="1030" y="468">DEPLOYING</text><text x="1094" y="361">AGENT-02</text><text x="1094" y="404">LINTING</text><text x="1094" y="425">AGENT-74</text><text x="1094" y="468">MERGING</text><text x="774" y="489">AGENT-61</text><text x="774" y="532">DEPLOYING</text><text x="774" y="553">AGENT-33</text><text x="774" y="596">REFACTORING</text><text x="838" y="489">AGENT-98</text><text x="838" y="532">MERGING</text><text x="838" y="553">AGENT-70</text><text x="838" y="596">RUNNING TESTS</text><text x="902" y="489">AGENT-35</text><text x="902" y="532">CODING</text><text x="902" y="553">AGENT-07</text><text x="902" y="596">DEPLOYING</text><text x="966" y="489">AGENT-72</text><text x="966" y="532">LINTING</text><text x="966" y="553">AGENT-44</text><text x="966" y="596">MERGING</text><text x="774" y="617">AGENT-05</text><text x="774" y="660">CODING</text><text x="774" y="681">AGENT-77</text><text x="774" y="724">DEPLOYING</text><text x="838" y="617">AGENT-42</text><text x="838" y="660">LINTING</text><text x="838" y="681">AGENT-14</text><text x="838" y="724">MERGING</text><text x="1030" y="617">AGENT-53</text><text x="1030" y="660">DEPLOYING</text><text x="1030" y="681">AGENT-25</text><text x="1030" y="724">REFACTORING</text><text x="1094" y="617">AGENT-90</text><text x="1094" y="660">MERGING</text><text x="1094" y="681">AGENT-62</text><text x="1094" y="724">RUNNING TESTS</text><text x="326" y="169">AGENT-42</text><text x="326" y="212">LINTING</text><text x="390" y="233">AGENT-51</text><text x="390" y="276">CODING</text><text x="262" y="297">AGENT-49</text><text x="262" y="340">REFACTORING</text><text x="326" y="297">AGENT-86</text><text x="326" y="340">RUNNING TESTS</text><text x="390" y="297">AGENT-23</text><text x="390" y="340">DEPLOYING</text><text x="1542" y="233">AGENT-17</text><text x="1542" y="276">CODING</text><text x="1478" y="297">AGENT-52</text><text x="1478" y="340">RUNNING TESTS</text><text x="1606" y="361">AGENT-98</text><text x="1606" y="404">RUNNING TESTS</text><text x="1542" y="361">AGENT-61</text><text x="1542" y="404">REFACTORING</text><text x="1478" y="361">AGENT-24</text><text x="1478" y="404">LINTING</text><text x="454" y="873">AGENT-08</text><text x="454" y="916">MERGING</text><text x="518" y="809">AGENT-73</text><text x="518" y="852">REFACTORING</text><text x="390" y="745">AGENT-27</text><text x="390" y="788">REFACTORING</text><text x="454" y="745">AGENT-64</text><text x="454" y="788">RUNNING TESTS</text><text x="518" y="745">AGENT-01</text><text x="518" y="788">DEPLOYING</text><text x="1350" y="809">AGENT-54</text><text x="1350" y="852">RUNNING TESTS</text><text x="1414" y="809">AGENT-91</text><text x="1414" y="852">DEPLOYING</text><text x="1478" y="809">AGENT-28</text><text x="1478" y="852">MERGING</text><text x="1670" y="553">AGENT-51</text><text x="1670" y="596">DEPLOYING</text><text x="1734" y="553">AGENT-88</text><text x="1734" y="596">MERGING</text><text x="1670" y="617">AGENT-23</text><text x="1670" y="660">REFACTORING</text><text x="1734" y="617">AGENT-60</text><text x="1734" y="660">RUNNING TESTS</text></g>
|
|
11
|
-
<path transform="translate(893.05 842)" fill="#ffffff" fill-opacity="0.85" d="M5.3 0H3.3V-28.7H13.2Q17.5 -28.7 20 -26.5Q22.6 -24.3 22.6 -20.2Q22.6 -16.9 20.5 -14.6Q18.4 -12.4 14.9 -12L23.3 0H20.9L12.8 -11.8H5.3ZM5.3 -27.1V-13.4H13Q16.5 -13.4 18.5 -15.2Q20.6 -17 20.6 -20.2Q20.6 -23.5 18.5 -25.3Q16.5 -27.1 13 -27.1Z M33.8 0.4Q31 0.4 28.8 -0.9Q26.6 -2.3 25.4 -4.9Q24.2 -7.4 24.2 -10.7Q24.2 -13.7 25.5 -16.2Q26.7 -18.6 28.8 -20Q30.9 -21.4 33.6 -21.4Q35.8 -21.4 37.5 -20.6Q39.2 -19.7 40.5 -18.2Q41.7 -16.7 42.3 -14.7Q42.9 -12.6 42.8 -10.1H25.2V-11.5H40.9Q40.7 -15.4 38.8 -17.7Q36.8 -19.9 33.6 -19.9Q31.4 -19.9 29.7 -18.7Q28 -17.6 27 -15.5Q26.1 -13.5 26.1 -10.7Q26.1 -7.8 27 -5.6Q27.9 -3.4 29.7 -2.3Q31.4 -1.1 33.8 -1.1Q36.7 -1.1 38.6 -2.7Q40.6 -4.3 41.1 -7.1H42.9Q42.3 -3.6 39.8 -1.6Q37.4 0.4 33.8 0.4Z M64.2 -10.5Q64.2 -7.2 63.1 -4.8Q61.9 -2.3 59.9 -1Q57.8 0.4 55 0.4Q52.5 0.4 50.5 -1Q48.5 -2.4 47.4 -4.8V7.7H45.5V-21H47.3V-15.9Q48.3 -18.5 50.4 -19.9Q52.5 -21.4 55 -21.4Q57.8 -21.4 59.9 -20Q61.9 -18.7 63.1 -16.2Q64.2 -13.8 64.2 -10.5ZM62.3 -10.5Q62.3 -14.8 60.3 -17.3Q58.3 -19.8 54.8 -19.8Q52.7 -19.8 51 -18.7Q49.3 -17.6 48.3 -15.5Q47.3 -13.5 47.3 -10.5Q47.3 -7.7 48.3 -5.6Q49.2 -3.5 50.9 -2.3Q52.6 -1.2 54.8 -1.2Q58.3 -1.2 60.3 -3.6Q62.3 -6.1 62.3 -10.5Z M68.7 0H66.8V-28.7H68.7Z M74.8 0H72.9V-21H74.8ZM75.6 -25.8Q75.6 -25.1 75.2 -24.6Q74.7 -24.1 73.9 -24.1Q73.1 -24.1 72.6 -24.6Q72.1 -25.1 72.1 -25.8Q72.1 -26.6 72.6 -27Q73.1 -27.5 73.9 -27.5Q74.7 -27.5 75.2 -27Q75.6 -26.6 75.6 -25.8Z M86.5 0.4Q83.8 0.4 81.8 -0.9Q79.7 -2.3 78.6 -4.8Q77.4 -7.3 77.4 -10.5Q77.4 -13.7 78.6 -16.2Q79.7 -18.6 81.8 -20Q83.9 -21.4 86.5 -21.4Q88.9 -21.4 90.7 -20.4Q92.6 -19.4 93.8 -17.6Q95 -15.7 95.5 -13.2H93.6Q93 -16.3 91.2 -18.1Q89.3 -19.8 86.5 -19.8Q84.4 -19.8 82.8 -18.6Q81.1 -17.4 80.2 -15.4Q79.3 -13.3 79.3 -10.5Q79.3 -7.7 80.2 -5.6Q81.1 -3.5 82.8 -2.3Q84.4 -1.1 86.5 -1.1Q89.3 -1.1 91.2 -2.9Q93.1 -4.7 93.6 -7.8H95.5Q95.1 -5.2 93.8 -3.4Q92.6 -1.6 90.8 -0.6Q88.9 0.4 86.5 0.4Z M111.1 0V-4.2Q110.3 -2.1 108.3 -0.9Q106.4 0.4 103.9 0.4Q100.6 0.4 98.7 -1.3Q96.7 -2.9 96.7 -5.7Q96.7 -8.8 99.2 -10.4Q101.6 -11.9 106.4 -11.9Q107.4 -11.9 108.3 -11.9Q109.3 -11.8 111 -11.7V-13.6Q111 -16.6 109.5 -18.2Q108.1 -19.9 105.4 -19.9Q102.6 -19.9 100.9 -18.2Q99.3 -16.5 99.2 -13.7H97.5Q97.5 -16 98.5 -17.7Q99.5 -19.4 101.3 -20.4Q103.1 -21.4 105.4 -21.4Q108.9 -21.4 110.9 -19.4Q112.8 -17.4 112.8 -13.8V0ZM98.6 -5.8Q98.6 -3.7 100.1 -2.4Q101.6 -1 104 -1Q107.2 -1 109.1 -3.1Q111 -5.1 111 -8.4V-10.4Q109.5 -10.5 108.5 -10.5Q107.4 -10.6 106.5 -10.6Q102.5 -10.6 100.5 -9.4Q98.6 -8.2 98.6 -5.8Z M131.9 -5.5Q131.9 -2.8 129.8 -1.2Q127.7 0.4 123.9 0.4Q120.3 0.4 118 -1.4Q115.8 -3.2 115.5 -6.4H117.3Q117.4 -3.9 119.2 -2.5Q121 -1.1 124 -1.1Q126.9 -1.1 128.5 -2.2Q130 -3.3 130 -5.3Q130 -7.1 128.9 -8Q127.8 -8.9 125.2 -9.4L122.4 -10Q119.3 -10.6 117.8 -12Q116.3 -13.4 116.3 -15.6Q116.3 -17.3 117.2 -18.6Q118.2 -19.9 119.8 -20.6Q121.5 -21.4 123.7 -21.4Q126 -21.4 127.7 -20.6Q129.5 -19.8 130.5 -18.3Q131.5 -16.8 131.7 -14.8H129.9Q129.7 -17.2 128 -18.6Q126.4 -19.9 123.7 -19.9Q121.2 -19.9 119.6 -18.8Q118.1 -17.7 118.1 -15.8Q118.1 -14 119.2 -13.1Q120.4 -12.1 123 -11.6L125.9 -11Q129 -10.4 130.5 -9.1Q131.9 -7.8 131.9 -5.5Z"/>
|
|
12
|
-
</svg>
|