From 524b84792fdc10a8356db99c009bb5d4e7027c8a Mon Sep 17 00:00:00 2001 From: Hifza Zafar <152292315+hifzabuildsai@users.noreply.github.com> Date: Fri, 23 Oct 2026 13:06:27 +0500 Subject: [PATCH] docs(readme): add Roman Urdu edition (#6499) * docs(readme): add Roman Urdu edition Register ur-Latn with a pending website catalog and preserve English command examples. Script-tag handling follows morluto's shared helper proposed in PR #2043 (c46f606c899e27b2e51c16500493413daf57ddad). * test(website): cover completed script-tag page metadata --- README.md | 2 +- docs/readme/README_ar.md | 2 +- docs/readme/README_de.md | 2 +- docs/readme/README_el.md | 2 +- docs/readme/README_es.md | 2 +- docs/readme/README_fa.md | 2 +- docs/readme/README_fr.md | 2 +- docs/readme/README_id.md | 2 +- docs/readme/README_it.md | 2 +- docs/readme/README_ja.md | 2 +- docs/readme/README_ko.md | 2 +- docs/readme/README_ml.md | 2 +- docs/readme/README_pl.md | 2 +- docs/readme/README_pt-BR.md | 2 +- docs/readme/README_ru.md | 2 +- docs/readme/README_th.md | 2 +- docs/readme/README_tr.md | 2 +- docs/readme/README_uk.md | 2 +- docs/readme/README_ur-Latn.md | 435 + docs/readme/README_vi.md | 2 +- docs/readme/README_zh-TW.md | 2 +- docs/readme/README_zh.md | 2 +- scripts/test-website.py | 66 + scripts/verify-website.py | 3 +- scripts/website_i18n.py | 10 +- website/locales/README.md | 5 + website/locales/languages.json | 6 + website/locales/messages.pot | 3776 ++--- website/locales/ur-Latn/messages.po | 12931 ++++++++++++++++ website/public/blog/index.html | 4 +- .../reverse-engineering-models/index.html | 4 +- .../blog/touhou-reconstruction/index.html | 4 +- website/public/contributors/index.html | 4 +- website/public/examples/dino-lab/index.html | 4 +- website/public/faq/index.html | 4 +- website/public/first-investigation/index.html | 4 +- website/public/get-started/index.html | 4 +- website/public/guides/browser/index.html | 4 +- website/public/guides/index.html | 4 +- website/public/guides/javascript/index.html | 4 +- website/public/guides/native/index.html | 4 +- website/public/index.html | 4 +- website/public/showcase/aegis/index.html | 4 +- website/public/showcase/ctf/index.html | 4 +- website/public/showcase/dx-ball/index.html | 4 +- website/public/showcase/index.html | 4 +- website/public/showcase/notion/index.html | 4 +- website/public/showcase/th04/index.html | 4 +- 48 files changed, 15420 insertions(+), 1930 deletions(-) create mode 100644 docs/readme/README_ur-Latn.md create mode 100644 website/locales/ur-Latn/messages.po diff --git a/README.md b/README.md index 9cd93f6326..e6e718e3ab 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
**English** · [简体中文](docs/readme/README_zh.md) · [繁體中文](docs/readme/README_zh-TW.md) · [日本語](docs/readme/README_ja.md) · [한국어](docs/readme/README_ko.md) · [Türkçe](docs/readme/README_tr.md) · [Русский](docs/readme/README_ru.md) · [Tiếng Việt](docs/readme/README_vi.md) · [ไทย](docs/readme/README_th.md) · [Deutsch](docs/readme/README_de.md) · [Español](docs/readme/README_es.md) · [Français](docs/readme/README_fr.md) · [Українська](docs/readme/README_uk.md) · [Polski](docs/readme/README_pl.md) · [Português (Brasil)](docs/readme/README_pt-BR.md) · [العربية](docs/readme/README_ar.md) · [فارسی](docs/readme/README_fa.md) · [Bahasa Indonesia](docs/readme/README_id.md) · [Italiano](docs/readme/README_it.md) -· [Ελληνικά](docs/readme/README_el.md) · [മലയാളം](docs/readme/README_ml.md) +· [Ελληνικά](docs/readme/README_el.md) · [മലയാളം](docs/readme/README_ml.md) · [Roman Urdu](docs/readme/README_ur-Latn.md) # REA: Reverse Engineer Anything diff --git a/docs/readme/README_ar.md b/docs/readme/README_ar.md index 80bf3ad136..3493176431 100644 --- a/docs/readme/README_ar.md +++ b/docs/readme/README_ar.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · **العربية** · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: هندسة عكسية لأي شيء diff --git a/docs/readme/README_de.md b/docs/readme/README_de.md index dad2206608..cddf803140 100644 --- a/docs/readme/README_de.md +++ b/docs/readme/README_de.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · **Deutsch** · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Alles reverse-engineeren diff --git a/docs/readme/README_el.md b/docs/readme/README_el.md index d9e326e815..4eeff1aef1 100644 --- a/docs/readme/README_el.md +++ b/docs/readme/README_el.md @@ -1,6 +1,6 @@
-[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) · **Ελληνικά** · [മലയാളം](README_ml.md) +[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) · **Ελληνικά** · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Reverse Engineer Anything diff --git a/docs/readme/README_es.md b/docs/readme/README_es.md index 43c10d8205..745b0d2535 100644 --- a/docs/readme/README_es.md +++ b/docs/readme/README_es.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · **Español** · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Ingeniería inversa de cualquier cosa diff --git a/docs/readme/README_fa.md b/docs/readme/README_fa.md index 1260185aea..1199bcc56b 100644 --- a/docs/readme/README_fa.md +++ b/docs/readme/README_fa.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · **فارسی** · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: مهندسی معکوس هر چیزی diff --git a/docs/readme/README_fr.md b/docs/readme/README_fr.md index 7cae9ac284..d99bab5199 100644 --- a/docs/readme/README_fr.md +++ b/docs/readme/README_fr.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · **Français** · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA : rétro-ingénierie de tout diff --git a/docs/readme/README_id.md b/docs/readme/README_id.md index 62e4bf5d86..f795170373 100644 --- a/docs/readme/README_id.md +++ b/docs/readme/README_id.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · **Bahasa Indonesia** · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Rekayasa Balik Apa Pun diff --git a/docs/readme/README_it.md b/docs/readme/README_it.md index a6f4737a1a..270dbe9676 100644 --- a/docs/readme/README_it.md +++ b/docs/readme/README_it.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · **Italiano** -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Reverse Engineer Anything diff --git a/docs/readme/README_ja.md b/docs/readme/README_ja.md index fa875c89f3..5a61666521 100644 --- a/docs/readme/README_ja.md +++ b/docs/readme/README_ja.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · **日本語** · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA:あらゆるものをリバースエンジニアリング diff --git a/docs/readme/README_ko.md b/docs/readme/README_ko.md index e614098205..3e1d1ec0a4 100644 --- a/docs/readme/README_ko.md +++ b/docs/readme/README_ko.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · **한국어** · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: 무엇이든 리버스 엔지니어링 diff --git a/docs/readme/README_ml.md b/docs/readme/README_ml.md index 429d22da10..6180d2b78f 100644 --- a/docs/readme/README_ml.md +++ b/docs/readme/README_ml.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · **മലയാളം** +· [Ελληνικά](README_el.md) · **മലയാളം** · [Roman Urdu](README_ur-Latn.md) # REA: എന്തും Reverse Engineer ചെയ്യുക diff --git a/docs/readme/README_pl.md b/docs/readme/README_pl.md index 5b1d00ba9c..6a198102d4 100644 --- a/docs/readme/README_pl.md +++ b/docs/readme/README_pl.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · **Polski** · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Reverse Engineer Anything diff --git a/docs/readme/README_pt-BR.md b/docs/readme/README_pt-BR.md index ae05b40045..64cdbd3bc1 100644 --- a/docs/readme/README_pt-BR.md +++ b/docs/readme/README_pt-BR.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · **Português (Brasil)** · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Faça engenharia reversa de qualquer coisa diff --git a/docs/readme/README_ru.md b/docs/readme/README_ru.md index 4f10f1ec29..13da705c81 100644 --- a/docs/readme/README_ru.md +++ b/docs/readme/README_ru.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · **Русский** · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Реверс-инжиниринг чего угодно diff --git a/docs/readme/README_th.md b/docs/readme/README_th.md index 7503a79579..4ac0ac404f 100644 --- a/docs/readme/README_th.md +++ b/docs/readme/README_th.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · **ไทย** · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Reverse Engineer Anything diff --git a/docs/readme/README_tr.md b/docs/readme/README_tr.md index ceea02a0eb..bdf93580ba 100644 --- a/docs/readme/README_tr.md +++ b/docs/readme/README_tr.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · **Türkçe** · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Her şeyi tersine mühendislikle inceleyin diff --git a/docs/readme/README_uk.md b/docs/readme/README_uk.md index 40e3199768..841289fe4d 100644 --- a/docs/readme/README_uk.md +++ b/docs/readme/README_uk.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · **Українська** · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Реверс-інжиніринг будь-чого diff --git a/docs/readme/README_ur-Latn.md b/docs/readme/README_ur-Latn.md new file mode 100644 index 0000000000..22d83adf03 --- /dev/null +++ b/docs/readme/README_ur-Latn.md @@ -0,0 +1,435 @@ +
+ +[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · **Roman Urdu** + +# REA: Reverse Engineer Anything + +### Binaries, applications aur runtime behavior ki reverse engineering ke liye ek MCP. + +**Koi feature pasand aaya? Samjhein ke woh kaise kaam karta hai, binary level tak.** + +[![npm version](https://img.shields.io/npm/v/rea-agents?style=flat-square&color=cb3837)](https://www.npmjs.com/package/rea-agents) +[![MCP tool catalog](https://img.shields.io/badge/MCP-tool_catalog-5c4ee5?style=flat-square)](../mcp-contracts.md#generated-catalog) +[![Node.js requirements](https://img.shields.io/badge/Node.js-requirements-339933?style=flat-square&logo=nodedotjs&logoColor=white)](#kya-kuch-analyze-kar-sakte-hain) +[![skills.sh](https://skills.sh/b/morluto/rea?style=flat-square)](https://skills.sh/morluto/rea/reverse-engineer-anything) +[![MIT license](https://img.shields.io/badge/license-MIT-f4c430?style=flat-square)](../../LICENSE) +[![Discord](https://img.shields.io/discord/1556595354999332884?logo=discord&logoColor=white&label=Discord&color=5865F2)](https://discord.gg/GkcryMnJDM) + +morluto%2Frea | Trendshift + +**[Website](https://rea.tools/) · [Guides](https://rea.tools/guides/) · [Showcases](https://rea.tools/showcase/)** + +[Jaldi shuru karein](#jaldi-shuru-karein) · [REA kaise kaam karta hai](#rea-kaise-kaam-karta-hai) · [Kya kuch analyze kar sakte hain](#kya-kuch-analyze-kar-sakte-hain) · [Amli misaalein](#amli-misaalein) · [FAQ](#faq) · [Documentation](#documentation) + +npx rea-agents setup + +
+ +> [!IMPORTANT] +> REA [morluto/rea](https://github.com/morluto/rea), +> [rea.tools](https://rea.tools/) ya [rea-agents npm package](https://www.npmjs.com/package/rea-agents) se hasil karein. +> Installation aur release ke links inhi official sources se kholein. Sirf milta-julta +> repository naam ya copy kiya hua README kisi download ko official sabit nahi karta. + +
+ +
+ +REA ek native binary inspect karte hue Hopper ke andar apna analysis bridge shuru kar raha hai + +

+ + + + + +
+ + Discord
+ Reverse Engineering Community mein shamil hon +

+ Discord · Sawal jawab · Apna kaam dikhayein +
+ +
+ +
+ +--- + +Kisi app mein aisa feature dekha jo aap apne product mein chahte hain? Apne agent se kahein ke REA ke zariye uski jaanch kare. Woh app ka source code mile baghair bhi use inspect kar sakta hai, feature kaam kaise karta hai samjha sakta hai, saboot dikha sakta hai aur aapke project ke liye uska ek version bana sakta hai. + +REA aapke agent ko native binaries, JavaScript aur Electron apps, .NET assemblies aur websites inspect karne wale tools se jorta hai. Yehi tools terminal se bhi use kar sakte hain. Analysis local machine par hota hai, aur har natije ke saath uske saboot aur limitations bhi milti hain. + +Setup REA ko aapke agent ke saath register karta hai aur uske mutabiq workflow instructions install karta hai. Native analysis ke liye pehle se installed Hopper, Ghidra ya IDA use ho sakta hai; aapki approval par setup Hopper bhi install kar sakta hai. Static JavaScript analysis ke liye native analysis engine ki zaroorat nahi. + +> Setup instructions, tasveeron ke saath guides aur asli case studies ke liye **[REA ki website dekhein](https://rea.tools/)**. + +## Jaldi shuru karein + +Linux par Ghidra, JADX, firmware tools shuru karne aur static JavaScript/Electron +analysis ke liye REA ke `PATH` par procps-compatible `ps` hona chahiye, taake +process ownership check ho sake. Masla hal karne ke steps `docs/installation.md` +ke "Linux owned-process prerequisite" section mein hain. + +### Apna agent setup karein + +Node.js aur npm installed hon to yeh command chalayein: + +```bash +npx rea-agents setup +``` + +Apne agents select karein, proposed changes dekhein aur approve karein. Setup +REA ka MCP server aur matching workflow instructions add karta hai, aur existing +configuration ke backups banata hai. Iske baad apna agent restart karein. + +Setup Claude Code, Codex, Cursor, Gemini CLI, Grok Build aur +[doosre agents](../installation.md#supported-agents) support karta hai. Provider +configuration aur manual MCP registration ke liye +[installation aur setup](../installation.md) dekhein. + +Context overhead kam rakhne ke liye MCP default mein compact input schemas use +karta hai. Agar tamam advertised fields ki guidance aur nested validation details +chahiye hon to apni MCP registration mein `REA_MCP_INPUT_SCHEMA_PROFILE=full` +set karein. Dono profiles mein tamam tools aur canonical server validation +maujood rehte hain. MCP contracts guide ka "Compact input schema profile" +section dekhein. + +### Apne agent se kahein + +```text +Samjho ke Notes app mein search kaise kaam karti hai, mujhe saboot dikhao aur +mere project ke liye aisa hi feature banao. +``` + +Notes ki jagah apni target app aur jis feature ko samajhna hai uska naam likhein. + +### Terminal se use karein + +Extract ki hui JavaScript/Electron app directory ya ASAR inspect karein: + +```bash +npx -y rea-agents@latest analyze-javascript-application /absolute/path/to/app --json +``` + +Natije mein modules, imports, Electron boundaries aur unke saboot milte hain. +Path ko apne target se badlein, jaise Windows par `"D:/apps/example"`. + +Rozmarra use ke liye `rea` command install karne ke liye: + +```bash +npm install --global rea-agents +rea --help +``` + +Native analysis se pehle provider configure karein. Native commands, provider +selection, snapshots aur scripting ke liye +[CLI aur Evidence guide](../cli.md) dekhein. + +### REA update karein + +REA mein tezi se changes aate hain aur naye releases mein aksar bug fixes hoti +hain. Apni installation updated rakhein. + +Agar CLI `npm install --global` ya `bun add --global` se install ki hai: + +```bash +rea update +``` + +`rea --update` isi verified workflow ka alias hai aur wohi global output flags +accept karta hai. Doosre command controls ke saath use karte waqt `rea update` +likhein. + +Updater commands stdout aur stderr mila kar zyada se zyada 4 MiB retain karti +hain. Command khatam hone ke baad is had se bade metadata replies reject ho +jate hain; verbose installs bounded diagnostics ke saath jari rehti hain. +Insaan ke liye progress output terminal ki backpressure ka khayal rakhta hai +aur bheji hui writes mukammal hone ka intezar karta hai. + +Bun global updates ke liye Bun 1.2.17 ya naya version chahiye. Purana Bun ho +to `rea update` chalane se pehle Bun manually upgrade karein. + +Agent registrations aur skill refresh karne ke liye update ke output mein +di hui setup command chalayein. + +Agar aap `npx` use karte hain to agent setup is tarah update karein: + +```bash +npx rea-agents@latest setup +``` + +Setup changes review karein aur agent restart karein. Ek dafa chalane wali CLI +commands ke liye `npx rea-agents@latest` ke baad command likhein. Bun ke saath +`npx rea-agents@latest` ki jagah `bunx rea-agents@latest` use karein. + +## REA kaise kaam karta hai + +Aapka agent MCP ke zariye REA ko call karta hai, taake target inspect kare aur +relevant code trace kare. REA apni findings saboot ke saath wapas deta hai. +Agent unki bunyaad par agle sawal poochta hai, behavior samjhata hai ya +implementation likh kar test karta hai. CLI commands bhi yehi workflows use +karti hain. + +![REA ki jaanch ka flow: agent local target ke bare mein sawal karta hai, REA analysis tools se use inspect aur trace karta hai, phir agent wapas milne wale code, references aur unknowns se samjhata, implement aur test karta hai.](../../website/public/assets/figures/rea-investigation-flow.svg) + +[Puri size mein figure kholein](../../website/public/assets/figures/rea-investigation-flow.svg). + + + +## Kya kuch analyze kar sakte hain + +REA ke liye Node.js 22.x (>=22.19), 24.x (>=24.11) ya 26+, aur npm chahiye. +Mazeed tools aur host support target par depend karte hain: + +| Target | REA kya wapas deta hai | Zarooriyat aur guide | +| ----------------------- | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| Desktop installations | Runtime candidates, supporting files, component markers aur agle probes | Built-in bounded directory/header inspection; [desktop applications](../desktop-applications.md) | +| Native binaries | Pseudocode, assembly, strings, symbols, calls aur references | Hopper, Ghidra ya IDA; [native analysis](../native-investigation.md) | +| Offline ELF layout | Sections, segments, original symbols/relocations aur static mitigation candidates | Linux x64 par aapka diya hua pwntools; [binary diagnostics](../binary-diagnostics.md) | +| Go binaries | Embedded compiler version, modules, replacements aur build settings | Built-in static ELF/PE/thin Mach-O inspection; Go install karna zaroori nahi | +| GPU code objects | CUDA/HIP targets, selected kernel parameters aur resources, retained PTX text | Built-in static ELF/PE/fatbin/CUBIN/PTX inspection; [GPU code objects](../gpu-code-objects.md) | +| Model artifacts | GGUF / safetensors metadata, tensor declarations aur unse nikale hue totals | Built-in header inspection; optional full-file hash; [model files](../model-artifacts.md) | +| IL2CPP metadata | Unity global-metadata.dat assembly images, type aur method names aur index ranges | Versions 24, 27, 29, 31 aur 39 ki built-in static decoding; Unity zaroori nahi | +| Godot PCK | Archive inventory aur extraction, original header/directory facts aur selected content identities | Built-in static formats 2, 3 aur 4; Godot zaroori nahi | +| Rust binaries | Embedded cargo-auditable crate names, versions, sources aur dependency edges | Built-in static ELF/PE/thin Mach-O inspection; [Rust binaries](../rust-binaries.md) | +| PE certificates | Authenticode WIN_CERTIFICATE entries aur PKCS#7 signer/X.509 identity fields | Built-in static PE inspection; [PE certificates](../pe-certificates.md) | +| ELF notes | PT_NOTE/SHT_NOTE owners, types, GNU build-id aur ABI-tag fields | Built-in static ELF inspection; [ELF notes](../elf-notes.md) | +| Erlang BEAM | IFF chunks, atoms, exports, imports, lambdas aur Code header | Built-in static BEAM inspection; [Erlang BEAM](../erlang-beam.md) | +| WASM artifact | Validation, sections, exact import/export WAT forms aur decoded WAT | Aapka diya hua WABT 1.0.42; `inspect_wasm_artifact` | +| EVM bytecode | Dispatch selectors, byte offsets, inferred arguments aur mutability | Linux x64 par local raw/hex carrier; [offline EVM guide](../evm-bytecode.md) | +| SQLite databases | Tables, columns, indexes, views, triggers aur selected ordinary-table rows | Local database/WAL snapshot; native SQLite limits ke saath Node.js 24.x >=24.15 ya 26+ | +| Recorded Linux crashes | Raw notes, har recorded thread ke registers/signals aur optional mapping candidates | Linux x64 par aapka diya hua pwntools; optional GDB/pwndbg; [recorded crashes](../recorded-crashes.md) | +| JavaScript / Electron | Modules, imports, source maps, routes, IPC aur native add-on relationships | Node.js aur npm; Linux: procps-compatible `ps`; [application analysis](../javascript-application-workflows.md) | +| Websites | Page structure, scripts, network observations aur requested screenshots | Chrome-family browser; [browser analysis](../browser-observation.md) | +| Saved network captures | Requests, responses, exposed payloads aur source locations | HAR ya Fiddler Everywhere SAZ; native mitmproxy ke liye Linux par mitmdump; [capture guide](../web-network-captures.md) | +| .NET assemblies | Metadata, CIL instructions, declared native dependencies aur build comparisons | Koi additional tool nahi (sirf static analysis); [managed-code guide](../managed-code-analysis.md) | +| Android APKs | Manifest declarations, classes, decompiled methods aur references | Linux/macOS/Windows x64 par headless JADX aur full JDK; [Android guide](../android-analysis.md) | +| APK signatures | v1/v2/v3/v3.1 signers, certificate fingerprints, key rotation aur digest self-consistency | Koi additional tool nahi (sirf static analysis); `inspect_apk_signature` | +| Android devices | Devices, packages, processes, logs, dumps, screen captures aur APK/file transfers | Aapka diya hua adb (emulator ya hardware); [ADB guide](../adb-device-analysis.md) | +| JEB projects | Engine-backed project units, artifact digests aur type/method pseudo-code | Aapka shuru kiya hua JEB client jo MCP serve kar raha ho, REA_JEB_MCP_URL se select karein; [JEB guide](../jeb-analysis.md) | +| Android resources | Decoded manifest, string tables, locales aur version facts | Aapka diya hua Apktool launcher; [resource guide](../apktool-resource-analysis.md) | +| Flutter apps | Dart snapshot hash, per-ABI library digests aur engine build provenance | Koi additional tool nahi (static APK parsing); [Flutter guide](../flutter-analysis.md) | +| Firmware | Regions, extraction results aur native-analysis handoffs | Linux par Binwalk / Unblob; [firmware guide](../firmware-analysis.md) | +| Recorded packets | Selected fields, repeated values, filters aur decode-as rules | Linux: TShark 4.x + prlimit; [capture guide](../packet-captures.md) | +| Packet summaries | Endpoints, DNS, TLS SNI, protocol distribution aur HTTP requests | Aapke diye hue tshark aur capinfos (Linux par verified); [pcap guide](../pcap-analysis.md) | +| Recorded logic signals | Decoder annotations, sample ranges aur diagnostics | Linux: sigrok-cli 0.7.2 + prlimit; [signal recordings](../signal-recordings.md) | +| Packages aur resources | File inventories, digests, plists, Apple bundle structure aur extracted resources | [Artifact aur JavaScript guide](../javascript-artifact-reconstruction.md), [Apple applications](../apple-application-analysis.md) | +| Process behavior | Terminal output, interactions, exit aur filesystem observations aur runs ka comparison | Native PTY ke saath Linux/macOS; [process capture](../process-capture.md) | +| PyInstaller executables | CArchive members, Python version, entry scripts aur extracted bytecode | Koi additional tool nahi (sirf static analysis); [Python packaged applications](../python-packaged-applications.md) | + +Static JavaScript aur .NET inspection di hui files ko application chalaye baghair +parhti hai. Runtime capture aapki user permissions se selected target ko chalata +hai ya uske saath interact karta hai; har runtime guide apne effects batati hai. + +Offline native-binary inspection ke liye REA aapke diye hue GNU objdump aur +Rizin bhi support karta hai. Provider setup, CLI commands aur Evidence ki +limitations ke liye [reverse-engineering tools guide](../reverse-engineering-tools.md) +dekhein. REA in dono providers ko install ya update nahi karta. + + + +Native formats aur host support har provider ke liye alag ho sakte hain. +[Hopper aur Ghidra setup](../installation.md#hopper), +[IDA guide](../ida-provider.md) (optional native MCP bridge samet), +[Kuna decompiler guide](../kuna-provider.md) aur +[experimental Windows Ghidra support](../windows-ghidra-p0.md) dekhein. +Ghidra [16-bit DOS analysis](../ghidra-dos.md) bhi support karta hai. +Badi binaries ke liye `REA_GHIDRA_STARTUP_TIMEOUT_MS` ya +`REA_HOPPER_STARTUP_TIMEOUT_MS` se provider ki startup deadline barhayein. +Provider select karne ke liye [CLI guide](../cli.md#choose-a-provider) dekhein. +Latest npm release ke baad add hone wale features ki +[release availability](../installation.md#released-package-and-main) check karein. + +## Amli misaalein + +[![DX-Ball sound-pan, Notion clipboard-bridge aur TH04 bullet-ring case studies ki tasveerein](../assets/rea-showcases.png)](https://rea.tools/showcase/) + +### DX-Ball: sound-pan calculation dobara banayein + +Sound call se uske position-to-pan helper tak jayein, instructions inspect +karein aur adhoore pseudocode ko C mein badlein. Dobara banaya gaya code 3,205 +original-x86 cases pass karta hai aur compiled function ke tamam 63 bytes +dobara hasil karta hai. + +[Case study parhein](https://rea.tools/showcase/dx-ball/) · +[Reconstruction repository](https://github.com/N0zoM1z0/dx-ball) + +### Notion: Electron clipboard bridge trace karein + +Renderer ki clipboard API dhoondein, preload aur IPC ke raste main process tak +uska flow follow karein aur rich clipboard format inspect karein. + +[Case study parhein](https://rea.tools/showcase/notion/) + +### TH04: DOS bullet-ring calculation recover karein + +Original PC-98 game ki 16-bit instructions inspect karein, fixed aur aimed angle +calculations recover karein aur dobara banaye gaye C++ ko purane compiler ke +output se compare karein. + +[Case study parhein](https://rea.tools/showcase/th04/) · +[Reconstruction repository](https://github.com/N0zoM1z0/th04) + +Agar aapne REA se koi dilchasp kaam kiya hai to hum dekhna chahenge. Apna case +[issue](https://github.com/morluto/rea/issues) ya +[pull request](https://github.com/morluto/rea/pulls) mein share karein. Target, +apna sawal, REA ne kaise madad ki aur kya mila, yeh sab batayein. + +## FAQ + +
+Kaun se agents REA use kar sakte hain? + +Har woh agent jo local MCP servers support karta ho. Setup +[supported agents](../installation.md#supported-agents) configure karta hai; +doosre clients [manual MCP registration](../installation.md#mcp-registry) +use kar sakte hain. + +
+ +
+Kya mujhe Hopper, Ghidra ya IDA chahiye? + +Deep native analysis in mein se ek use karta hai. Static JavaScript aur .NET +inspection native analysis engine ke baghair kaam karti hai. Approval ke baad +setup Hopper install kar sakta hai; Ghidra aur IDA ke liye aapki existing +installations use hoti hain. [Provider setup](../installation.md#hopper) dekhein. + +
+ +
+Kya pehle Hopper shuru karna hoga? + +Jab kisi operation ko Hopper chahiye hota hai to REA use shuru karta hai. +macOS par pehli dafa khulne wala dialog demo mode select karne ya license +activate karne ko keh sakta hai. Pehle CLI/MCP operation ya unattended job se +pehle usi user session mein yeh prompt complete karein. Zaroorat ho to Hopper +manually kholein. +[Hopper startup aur troubleshooting](../installation.md#launcher-paths-and-troubleshooting) +dekhein. + +
+ +
+skills.sh se skill install karne se kya hota hai? + +Skill aapke agent ko jaanch karne ki instructions deti hai. REA ka MCP server +register karne aur matching instructions install karne ke liye +`npx rea-agents setup` use karein, phir agent restart karein. +[Sirf skill ki installation](../installation.md#skill-only-installation) dekhein. + +
+ +
+REA kis tarah ka code wapas deta hai? + +Native analysis pseudocode aur assembly wapas deta hai. JavaScript/Electron +analysis modules aur unke relationships recover karta hai. Aapka agent in +findings se implementation likhta aur test karta hai; +[amli misaalein](#amli-misaalein) iska tareeqa dikhati hain. + +
+ +
+Kya REA meri app upload karta hai? + +REA targets ko local machine par analyze karta hai. Aapke agent ko tool results +milte hain, aur uske model provider ki apni data policy hoti hai. + +
+ +
+Bug mile to kya karun? + +Pehle update karein; ho sakta hai recent release mein masla hal ho chuka ho. + +Agar CLI `npm install --global` ya `bun add --global` se install ki hai: + +```bash +rea update +``` + +`npx` se agent setup ke liye: + +```bash +npx rea-agents@latest setup +``` + +Agar agent use kar rahe hain to [setup refresh](#rea-update-karein) complete +karke agent restart karein. Wohi task dobara try karein. Masla phir bhi ho to +REA version, target type, reproduce karne ke steps aur error output ke saath +[issue kholein](https://github.com/morluto/rea/issues). + +
+ +## Documentation + +Website ki [amli guides](https://rea.tools/guides/) se shuru karein. +Exact options, prerequisites aur result contracts ke liye: + +- [Installation aur setup](../installation.md): agent registration, provider configuration, updates aur uninstall. +- [Readiness aur troubleshooting](../installation.md#check-readiness-for-your-task): ek agent ya analysis engine ka masla diagnose karein. +- [CLI aur Evidence](../cli.md): commands, provider selection, snapshots, import/export aur exit statuses. +- [MCP contracts](../mcp-contracts.md) aur [agent prompts](../mcp-prompts.md): tool results, sessions aur guided investigations. +- [Tool catalog](../mcp-contracts.md#generated-catalog): tools, providers aur CLI commands ki generated inventory. +- [Roadmap](../roadmap.md): planned work aur capability trackers. + +Security vulnerabilities [SECURITY.md](../../SECURITY.md) ke zariye report karein. + +## Stars ki history + +🎉 **300,000 GitHub stars — shukriya!** + +REA use karne, bugs report karne, features suggest karne, builds test karne aur +fixes contribute karne wale sab logon ka shukriya. + + + + + + REA ke GitHub stars ki history + + + +## Zimmedarana istemal + +Responsible-use guidance ke liye [DISCLAIMER.md](../../DISCLAIMER.md) dekhein. + +Ghair qanooni ya ghair ijazati istemal ke bare mein project ki position REA ke +tamam versions, distribution channels aur platforms par lagu hoti hai; har copy +par uske applicable licenses barqarar rehte hain. + +REA qanooni research, taleem, interoperability, software preservation aur aise +software ke analysis ke liye hai jo aapka apna ho ya jise examine karne ki aapko +ijazat ho. + +## Hissa dalein + +REA mein aapki madad ka khairmaqdam hai! Bug report karne ya feature suggest +karne ke liye [issue kholein](https://github.com/morluto/rea/issues), ya code aur +docs behtar karne ke liye [pull request bhejein](https://github.com/morluto/rea/pulls). + +Development setup aur checks ke liye [CONTRIBUTING.md](../../CONTRIBUTING.md), +verification lanes ke liye [testing](../testing.md) aur project structure ke +liye [architecture map](../architecture.mermaid) dekhein. + +## License + +[MIT](../../LICENSE) + +REA ka apna likha hua code MIT ke tehat licensed hai. Third-party material +ke apne licenses aur copyright notices barqarar rehte hain. Dependency +inventory, preserved license texts aur external tools ki terms ke liye +[Third-party notices](../../THIRD_PARTY_NOTICES.md) dekhein. + +IDA Pro / Hex-Rays decompilers, Hopper aur JEB samet **commercial tools qanooni +tareeqe se hasil karna aur unke applicable licenses ke mutabiq use karne ki +ijazat rakhna zaroori hai**. REA koi tool license, key ya activation ka haq +nahi deta. Trials aur demos vendor ki terms ke tehat rehte hain, jin mein user, +feature, automation aur output sharing ki pabandiyan bhi shamil hain. Cracked +copies, chori ki hui keys, ghair ijazati key sharing aur license restrictions +bypass karne ki ijazat nahi. Yeh guidance MIT ya third-party licenses ko +tabdeel nahi karti. diff --git a/docs/readme/README_vi.md b/docs/readme/README_vi.md index a0bbdc52be..3bbb2c2949 100644 --- a/docs/readme/README_vi.md +++ b/docs/readme/README_vi.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · **Tiếng Việt** · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA: Kỹ thuật dịch ngược cho mọi thứ diff --git a/docs/readme/README_zh-TW.md b/docs/readme/README_zh-TW.md index 008efeb943..612a9c3822 100644 --- a/docs/readme/README_zh-TW.md +++ b/docs/readme/README_zh-TW.md @@ -1,7 +1,7 @@
[English](../../README.md) · [简体中文](README_zh.md) · **繁體中文** · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA:逆向一切 diff --git a/docs/readme/README_zh.md b/docs/readme/README_zh.md index 7538878a24..6c902810f3 100644 --- a/docs/readme/README_zh.md +++ b/docs/readme/README_zh.md @@ -1,7 +1,7 @@
[English](../../README.md) · **简体中文** · [繁體中文](README_zh-TW.md) · [日本語](README_ja.md) · [한국어](README_ko.md) · [Türkçe](README_tr.md) · [Русский](README_ru.md) · [Tiếng Việt](README_vi.md) · [ไทย](README_th.md) · [Deutsch](README_de.md) · [Español](README_es.md) · [Français](README_fr.md) · [Українська](README_uk.md) · [Polski](README_pl.md) · [Português (Brasil)](README_pt-BR.md) · [العربية](README_ar.md) · [فارسی](README_fa.md) · [Bahasa Indonesia](README_id.md) · [Italiano](README_it.md) -· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) +· [Ελληνικά](README_el.md) · [മലയാളം](README_ml.md) · [Roman Urdu](README_ur-Latn.md) # REA:逆向一切 diff --git a/scripts/test-website.py b/scripts/test-website.py index c6f091cde8..97d57386f4 100644 --- a/scripts/test-website.py +++ b/scripts/test-website.py @@ -541,6 +541,72 @@ class WebsiteMaintenanceChecks(unittest.TestCase): class WebsiteTranslationChecks(unittest.TestCase): """Exercise source edits, translated evidence and language editions at their consumers.""" + def test_language_inventory_preserves_script_identity(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + (root / "website/locales").mkdir(parents=True) + for code in ("ur", "ur-PK", "ur-Latn", "ur-Latn-PK", "hi-Latn"): + inventory = [ + {"code": "en", "name": "English", "readme": "README.md", "dir": "ltr"}, + {"code": code, "name": "Fixture", "readme": f"docs/readme/README_{code}.md", "dir": "ltr"}, + ] + path = root / "website/locales/languages.json" + path.write_text(json.dumps(inventory)) + with self.subTest(code=code): + self.assertEqual(languages(root), inventory) + for code in ("ur-latn", "ur-LATN", "ur-PK-Latn", "ur/Latn"): + inventory[1]["code"] = code + path.write_text(json.dumps(inventory)) + with self.subTest(code=code), self.assertRaisesRegex(ValueError, "Invalid or duplicate language"): + languages(root) + + def test_completed_script_tag_pages_pass_search_metadata(self): + with tempfile.TemporaryDirectory() as directory: + site = Path(directory) + (site / "assets").mkdir() + shutil.copyfile(ROOT / "website/_site/assets/social-card.png", site / "assets/social-card.png") + shutil.copyfile(ROOT / "website/public/robots.txt", site / "robots.txt") + pages = {} + for code in ("ur-Latn", "ur-Latn-PK"): + path = site / code / "index.html" + path.parent.mkdir() + url = f"https://rea.tools/{code}/" + source = dedent(f'''\ + + + + REA ka ta'aruf + + + + + + + + + + + + + + + + + + + +

REA ka ta'aruf

+ + ''') + path.write_text(source, encoding="utf-8") + page = VERIFY.HtmlReferences() + page.feed(source) + self.assertFalse(page.translation_fallback) + self.assertFalse(page.noindex()) + pages[path] = page + PREPARE.prepare_sitemap(site) + self.assertEqual(VERIFY.check_search_metadata(site, pages), (2, [])) + @contextlib.contextmanager def translated_project(self): with tempfile.TemporaryDirectory() as directory: diff --git a/scripts/verify-website.py b/scripts/verify-website.py index 10af305dcd..58d9ee9e5c 100644 --- a/scripts/verify-website.py +++ b/scripts/verify-website.py @@ -11,6 +11,7 @@ import xml.etree.ElementTree as ET from zipfile import BadZipFile, ZipFile from website import NOTES_FIXTURES, SITE_ORIGIN, authored_markdown, page_url, sync_pages +from website_i18n import is_language_code LEGACY_ORIGIN = "morluto.github.io" SITE_TEXT_URL = re.compile( @@ -179,7 +180,7 @@ def check_search_metadata(site, pages): if not title: errors.append(f"{label}: needs exactly one nonempty head title") first = path.relative_to(site).parts[0] - expected_language = first if re.fullmatch(r"[a-z]{2}(?:-[A-Z]{2})?", first) else "en" + expected_language = first if is_language_code(first) else "en" if page.translation_fallback: if page.lang != "en" or not page.noindex(): errors.append(f"{label}: English translation fallback needs lang=en and noindex") diff --git a/scripts/website_i18n.py b/scripts/website_i18n.py index bfcf4bb17a..0a5876d853 100644 --- a/scripts/website_i18n.py +++ b/scripts/website_i18n.py @@ -25,6 +25,14 @@ LITERALS = {"REA", "Reverse Engineer Anything", "REA · Reverse Engineer Anythin FALLBACK_NOTICE = "Translation is being updated. Read this page in English for now." +LANGUAGE_CODE = re.compile(r"[a-z]{2}(?:-[A-Z][a-z]{3})?(?:-[A-Z]{2})?") + + +def is_language_code(value): + """Recognize canonical language, optional script and region inventory codes.""" + return LANGUAGE_CODE.fullmatch(value) is not None + + def readme_edition_paths(root): """Return repo-relative README editions: root English plus docs/readme translations.""" editions = set() @@ -57,7 +65,7 @@ def languages(root): raise ValueError("Each language needs code, name, readme and dir") if not all(isinstance(value, str) and value for value in item.values()): raise ValueError("Language fields must be nonempty strings") - if not re.fullmatch(r"[a-z]{2}(?:-[A-Z]{2})?", item["code"]) or item["code"] in codes: + if not is_language_code(item["code"]) or item["code"] in codes: raise ValueError(f"Invalid or duplicate language: {item['code']}") if item["dir"] not in ("ltr", "rtl"): raise ValueError(f"Invalid text direction: {item['code']}") diff --git a/website/locales/README.md b/website/locales/README.md index bedcd6dc81..048920e79d 100644 --- a/website/locales/README.md +++ b/website/locales/README.md @@ -130,6 +130,11 @@ website messages remain untranslated and use the labeled, nonindexable English fallback described above; the README translation does not establish website translation coverage. +Roman Urdu (`ur-Latn`) has a translated README written in Latin script, with +English technical terms retained. Its text direction is left to right. The +website catalog is pending and uses the same labeled, nonindexable English +fallback; the README does not establish a translated website. + The first catalogs started with machine-assisted drafts. They include editorial corrections to navigation, prompts and technical terminology. Traditional Chinese started from the Simplified Chinese draft and is maintained independently. diff --git a/website/locales/languages.json b/website/locales/languages.json index 9dea72ac57..739221c543 100644 --- a/website/locales/languages.json +++ b/website/locales/languages.json @@ -124,5 +124,11 @@ "name": "മലയാളം", "readme": "docs/readme/README_ml.md", "dir": "ltr" + }, + { + "code": "ur-Latn", + "name": "Roman Urdu", + "readme": "docs/readme/README_ur-Latn.md", + "dir": "ltr" } ] diff --git a/website/locales/messages.pot b/website/locales/messages.pot index df71377a95..10ad1a2b96 100644 --- a/website/locales/messages.pot +++ b/website/locales/messages.pot @@ -6,49 +6,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: website/public/blog/index.html:107 +#: website/public/blog/index.html:109 msgctxt "page:blog/index.html" msgid "Skip to content" msgstr "" -#: website/public/blog/index.html:117 -#: website/public/blog/reverse-engineering-models/index.html:117 -#: website/public/blog/touhou-reconstruction/index.html:117 -#: website/public/contributors/index.html:118 -#: website/public/examples/dino-lab/index.html:118 website/public/faq/index.html:117 -#: website/public/first-investigation/index.html:117 -#: website/public/get-started/index.html:117 -#: website/public/guides/browser/index.html:117 website/public/guides/index.html:117 -#: website/public/guides/javascript/index.html:117 -#: website/public/guides/native/index.html:117 website/public/index.html:119 -#: website/public/showcase/aegis/index.html:118 -#: website/public/showcase/ctf/index.html:117 -#: website/public/showcase/dx-ball/index.html:117 website/public/showcase/index.html:117 -#: website/public/showcase/notion/index.html:117 -#: website/public/showcase/th04/index.html:117 -msgctxt "shared" -msgid "Get started" -msgstr "" - -#: website/public/blog/index.html:118 -#: website/public/blog/reverse-engineering-models/index.html:118 -#: website/public/blog/touhou-reconstruction/index.html:118 -#: website/public/contributors/index.html:119 -#: website/public/examples/dino-lab/index.html:119 website/public/faq/index.html:118 -#: website/public/first-investigation/index.html:118 -#: website/public/get-started/index.html:118 -#: website/public/guides/browser/index.html:118 website/public/guides/index.html:118 -#: website/public/guides/javascript/index.html:118 -#: website/public/guides/native/index.html:118 website/public/index.html:120 -#: website/public/showcase/aegis/index.html:119 -#: website/public/showcase/ctf/index.html:118 -#: website/public/showcase/dx-ball/index.html:118 website/public/showcase/index.html:118 -#: website/public/showcase/notion/index.html:118 -#: website/public/showcase/th04/index.html:118 -msgctxt "shared" -msgid "Showcases" -msgstr "" - #: website/public/blog/index.html:119 #: website/public/blog/reverse-engineering-models/index.html:119 #: website/public/blog/touhou-reconstruction/index.html:119 @@ -65,7 +27,7 @@ msgstr "" #: website/public/showcase/notion/index.html:119 #: website/public/showcase/th04/index.html:119 msgctxt "shared" -msgid "Blog" +msgid "Get started" msgstr "" #: website/public/blog/index.html:120 @@ -84,149 +46,149 @@ msgstr "" #: website/public/showcase/notion/index.html:120 #: website/public/showcase/th04/index.html:120 msgctxt "shared" +msgid "Showcases" +msgstr "" + +#: website/public/blog/index.html:121 +#: website/public/blog/reverse-engineering-models/index.html:121 +#: website/public/blog/touhou-reconstruction/index.html:121 +#: website/public/contributors/index.html:122 +#: website/public/examples/dino-lab/index.html:122 website/public/faq/index.html:121 +#: website/public/first-investigation/index.html:121 +#: website/public/get-started/index.html:121 +#: website/public/guides/browser/index.html:121 website/public/guides/index.html:121 +#: website/public/guides/javascript/index.html:121 +#: website/public/guides/native/index.html:121 website/public/index.html:123 +#: website/public/showcase/aegis/index.html:122 +#: website/public/showcase/ctf/index.html:121 +#: website/public/showcase/dx-ball/index.html:121 website/public/showcase/index.html:121 +#: website/public/showcase/notion/index.html:121 +#: website/public/showcase/th04/index.html:121 +msgctxt "shared" +msgid "Blog" +msgstr "" + +#: website/public/blog/index.html:122 +#: website/public/blog/reverse-engineering-models/index.html:122 +#: website/public/blog/touhou-reconstruction/index.html:122 +#: website/public/contributors/index.html:123 +#: website/public/examples/dino-lab/index.html:123 website/public/faq/index.html:122 +#: website/public/first-investigation/index.html:122 +#: website/public/get-started/index.html:122 +#: website/public/guides/browser/index.html:122 website/public/guides/index.html:122 +#: website/public/guides/javascript/index.html:122 +#: website/public/guides/native/index.html:122 website/public/index.html:124 +#: website/public/showcase/aegis/index.html:123 +#: website/public/showcase/ctf/index.html:122 +#: website/public/showcase/dx-ball/index.html:122 website/public/showcase/index.html:122 +#: website/public/showcase/notion/index.html:122 +#: website/public/showcase/th04/index.html:122 +msgctxt "shared" msgid "Guides" msgstr "" -#: website/public/blog/index.html:122 website/public/blog/index.html:241 -#: website/public/blog/reverse-engineering-models/index.html:122 -#: website/public/blog/reverse-engineering-models/index.html:880 -#: website/public/blog/touhou-reconstruction/index.html:122 -#: website/public/blog/touhou-reconstruction/index.html:1077 -#: website/public/contributors/index.html:123 -#: website/public/contributors/index.html:1128 -#: website/public/examples/dino-lab/index.html:123 -#: website/public/examples/dino-lab/index.html:472 website/public/faq/index.html:122 -#: website/public/faq/index.html:570 website/public/first-investigation/index.html:122 -#: website/public/first-investigation/index.html:531 -#: website/public/get-started/index.html:122 website/public/get-started/index.html:1814 -#: website/public/guides/browser/index.html:122 -#: website/public/guides/browser/index.html:504 website/public/guides/index.html:122 -#: website/public/guides/index.html:279 website/public/guides/javascript/index.html:122 -#: website/public/guides/javascript/index.html:500 -#: website/public/guides/native/index.html:122 -#: website/public/guides/native/index.html:506 website/public/index.html:124 -#: website/public/index.html:1219 website/public/showcase/aegis/index.html:123 -#: website/public/showcase/aegis/index.html:805 -#: website/public/showcase/ctf/index.html:122 website/public/showcase/ctf/index.html:774 -#: website/public/showcase/dx-ball/index.html:122 -#: website/public/showcase/dx-ball/index.html:782 website/public/showcase/index.html:122 -#: website/public/showcase/index.html:314 website/public/showcase/notion/index.html:122 -#: website/public/showcase/notion/index.html:628 -#: website/public/showcase/th04/index.html:122 -#: website/public/showcase/th04/index.html:797 +#: website/public/blog/index.html:124 website/public/blog/index.html:243 +#: website/public/blog/reverse-engineering-models/index.html:124 +#: website/public/blog/reverse-engineering-models/index.html:882 +#: website/public/blog/touhou-reconstruction/index.html:124 +#: website/public/blog/touhou-reconstruction/index.html:1079 +#: website/public/contributors/index.html:125 +#: website/public/contributors/index.html:1130 +#: website/public/examples/dino-lab/index.html:125 +#: website/public/examples/dino-lab/index.html:474 website/public/faq/index.html:124 +#: website/public/faq/index.html:572 website/public/first-investigation/index.html:124 +#: website/public/first-investigation/index.html:533 +#: website/public/get-started/index.html:124 website/public/get-started/index.html:1816 +#: website/public/guides/browser/index.html:124 +#: website/public/guides/browser/index.html:506 website/public/guides/index.html:124 +#: website/public/guides/index.html:281 website/public/guides/javascript/index.html:124 +#: website/public/guides/javascript/index.html:502 +#: website/public/guides/native/index.html:124 +#: website/public/guides/native/index.html:508 website/public/index.html:126 +#: website/public/index.html:1221 website/public/showcase/aegis/index.html:125 +#: website/public/showcase/aegis/index.html:807 +#: website/public/showcase/ctf/index.html:124 website/public/showcase/ctf/index.html:776 +#: website/public/showcase/dx-ball/index.html:124 +#: website/public/showcase/dx-ball/index.html:784 website/public/showcase/index.html:124 +#: website/public/showcase/index.html:316 website/public/showcase/notion/index.html:124 +#: website/public/showcase/notion/index.html:630 +#: website/public/showcase/th04/index.html:124 +#: website/public/showcase/th04/index.html:799 msgctxt "shared" msgid "Contributors" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/index.html:199 +#: website/public/blog/index.html:201 #, python-brace-format msgctxt "page:blog/index.html" msgid "{ph0}Home{ph1} / Blog" msgstr "" -#: website/public/blog/index.html:200 +#: website/public/blog/index.html:202 msgctxt "page:blog/index.html" msgid "Blog." msgstr "" -#: website/public/blog/index.html:201 +#: website/public/blog/index.html:203 msgctxt "page:blog/index.html" msgid "Thoughts on reverse engineering." msgstr "" #. {ph0}:
-#: website/public/blog/index.html:205 +#: website/public/blog/index.html:207 #, python-brace-format msgctxt "page:blog/index.html" msgid "Model specialization{ph0}Essay" msgstr "" -#: website/public/blog/index.html:207 +#: website/public/blog/index.html:209 msgctxt "page:blog/index.html" msgid "Does reverse engineering need a bigger model?" msgstr "" -#: website/public/blog/index.html:208 +#: website/public/blog/index.html:210 msgctxt "page:blog/index.html" msgid "" "What Touhou reconstruction suggests about general models, specialist models and " "learning from compiler feedback." msgstr "" -#: website/public/blog/index.html:212 website/public/blog/index.html:227 +#: website/public/blog/index.html:214 website/public/blog/index.html:229 msgctxt "page:blog/index.html" msgid "Read the article" msgstr "" -#: website/public/blog/index.html:215 +#: website/public/blog/index.html:217 msgctxt "page:blog/index.html" msgid "By N0zoM1z0 · 13 October 2026" msgstr "" #. {ph0}:
-#: website/public/blog/index.html:219 +#: website/public/blog/index.html:221 #, python-brace-format msgctxt "page:blog/index.html" msgid "Game reconstruction{ph0}Essay" msgstr "" -#: website/public/blog/index.html:221 +#: website/public/blog/index.html:223 msgctxt "page:blog/index.html" msgid "The industrial revolution in reverse engineering" msgstr "" -#: website/public/blog/index.html:222 +#: website/public/blog/index.html:224 msgctxt "page:blog/index.html" msgid "" "What manual RE and reconstructing TH08, TH095 and TH04 taught me about agents, " "verification and knowledge that compounds across projects." msgstr "" -#: website/public/blog/index.html:230 +#: website/public/blog/index.html:232 msgctxt "page:blog/index.html" msgid "By N0zoM1z0 · 10 October 2026" msgstr "" -#: website/public/blog/index.html:242 -#: website/public/blog/reverse-engineering-models/index.html:881 -#: website/public/blog/touhou-reconstruction/index.html:1078 -#: website/public/contributors/index.html:1129 -#: website/public/examples/dino-lab/index.html:473 website/public/faq/index.html:571 -#: website/public/first-investigation/index.html:532 -#: website/public/get-started/index.html:1815 -#: website/public/guides/browser/index.html:505 website/public/guides/index.html:280 -#: website/public/guides/javascript/index.html:501 -#: website/public/guides/native/index.html:507 website/public/index.html:1220 -#: website/public/showcase/aegis/index.html:806 -#: website/public/showcase/ctf/index.html:775 -#: website/public/showcase/dx-ball/index.html:783 website/public/showcase/index.html:315 -#: website/public/showcase/notion/index.html:629 -#: website/public/showcase/th04/index.html:798 -msgctxt "shared" -msgid "Source" -msgstr "" - -#: website/public/blog/index.html:243 -#: website/public/blog/reverse-engineering-models/index.html:882 -#: website/public/blog/touhou-reconstruction/index.html:1079 -#: website/public/contributors/index.html:1130 -#: website/public/examples/dino-lab/index.html:474 website/public/faq/index.html:572 -#: website/public/first-investigation/index.html:533 -#: website/public/get-started/index.html:1816 -#: website/public/guides/browser/index.html:506 website/public/guides/index.html:281 -#: website/public/guides/javascript/index.html:502 -#: website/public/guides/native/index.html:508 website/public/index.html:1221 -#: website/public/showcase/aegis/index.html:807 -#: website/public/showcase/ctf/index.html:776 -#: website/public/showcase/dx-ball/index.html:784 website/public/showcase/index.html:316 -#: website/public/showcase/notion/index.html:630 -#: website/public/showcase/th04/index.html:799 -msgctxt "shared" -msgid "MIT license" -msgstr "" - #: website/public/blog/index.html:244 #: website/public/blog/reverse-engineering-models/index.html:883 #: website/public/blog/touhou-reconstruction/index.html:1080 @@ -243,7 +205,7 @@ msgstr "" #: website/public/showcase/notion/index.html:631 #: website/public/showcase/th04/index.html:800 msgctxt "shared" -msgid "Join the community" +msgid "Source" msgstr "" #: website/public/blog/index.html:245 @@ -262,26 +224,64 @@ msgstr "" #: website/public/showcase/notion/index.html:632 #: website/public/showcase/th04/index.html:801 msgctxt "shared" +msgid "MIT license" +msgstr "" + +#: website/public/blog/index.html:246 +#: website/public/blog/reverse-engineering-models/index.html:885 +#: website/public/blog/touhou-reconstruction/index.html:1082 +#: website/public/contributors/index.html:1133 +#: website/public/examples/dino-lab/index.html:477 website/public/faq/index.html:575 +#: website/public/first-investigation/index.html:536 +#: website/public/get-started/index.html:1819 +#: website/public/guides/browser/index.html:509 website/public/guides/index.html:284 +#: website/public/guides/javascript/index.html:505 +#: website/public/guides/native/index.html:511 website/public/index.html:1224 +#: website/public/showcase/aegis/index.html:810 +#: website/public/showcase/ctf/index.html:779 +#: website/public/showcase/dx-ball/index.html:787 website/public/showcase/index.html:319 +#: website/public/showcase/notion/index.html:633 +#: website/public/showcase/th04/index.html:802 +msgctxt "shared" +msgid "Join the community" +msgstr "" + +#: website/public/blog/index.html:247 +#: website/public/blog/reverse-engineering-models/index.html:886 +#: website/public/blog/touhou-reconstruction/index.html:1083 +#: website/public/contributors/index.html:1134 +#: website/public/examples/dino-lab/index.html:478 website/public/faq/index.html:576 +#: website/public/first-investigation/index.html:537 +#: website/public/get-started/index.html:1820 +#: website/public/guides/browser/index.html:510 website/public/guides/index.html:285 +#: website/public/guides/javascript/index.html:506 +#: website/public/guides/native/index.html:512 website/public/index.html:1225 +#: website/public/showcase/aegis/index.html:811 +#: website/public/showcase/ctf/index.html:780 +#: website/public/showcase/dx-ball/index.html:788 website/public/showcase/index.html:320 +#: website/public/showcase/notion/index.html:634 +#: website/public/showcase/th04/index.html:803 +msgctxt "shared" msgid "Follow us on X" msgstr "" #. {ph0}: -#: website/public/blog/index.html:250 -#: website/public/blog/reverse-engineering-models/index.html:889 -#: website/public/blog/touhou-reconstruction/index.html:1086 -#: website/public/contributors/index.html:1137 -#: website/public/examples/dino-lab/index.html:481 website/public/faq/index.html:579 -#: website/public/first-investigation/index.html:540 -#: website/public/get-started/index.html:1823 -#: website/public/guides/browser/index.html:513 website/public/guides/index.html:288 -#: website/public/guides/javascript/index.html:509 -#: website/public/guides/native/index.html:515 website/public/index.html:1228 -#: website/public/showcase/aegis/index.html:814 -#: website/public/showcase/ctf/index.html:783 -#: website/public/showcase/dx-ball/index.html:791 website/public/showcase/index.html:323 -#: website/public/showcase/notion/index.html:637 -#: website/public/showcase/th04/index.html:806 +#: website/public/blog/index.html:252 +#: website/public/blog/reverse-engineering-models/index.html:891 +#: website/public/blog/touhou-reconstruction/index.html:1088 +#: website/public/contributors/index.html:1139 +#: website/public/examples/dino-lab/index.html:483 website/public/faq/index.html:581 +#: website/public/first-investigation/index.html:542 +#: website/public/get-started/index.html:1825 +#: website/public/guides/browser/index.html:515 website/public/guides/index.html:290 +#: website/public/guides/javascript/index.html:511 +#: website/public/guides/native/index.html:517 website/public/index.html:1230 +#: website/public/showcase/aegis/index.html:816 +#: website/public/showcase/ctf/index.html:785 +#: website/public/showcase/dx-ball/index.html:793 website/public/showcase/index.html:325 +#: website/public/showcase/notion/index.html:639 +#: website/public/showcase/th04/index.html:808 #, python-brace-format msgctxt "shared" msgid "{ph0}↑{ph1} Top" @@ -299,136 +299,136 @@ msgid "" "agents." msgstr "" -#: website/public/blog/index.html:79 website/public/blog/index.html:92 -#: website/public/blog/reverse-engineering-models/index.html:79 -#: website/public/blog/reverse-engineering-models/index.html:92 -#: website/public/blog/touhou-reconstruction/index.html:79 -#: website/public/blog/touhou-reconstruction/index.html:92 -#: website/public/contributors/index.html:79 website/public/contributors/index.html:92 -#: website/public/examples/dino-lab/index.html:79 -#: website/public/examples/dino-lab/index.html:92 website/public/faq/index.html:79 -#: website/public/faq/index.html:92 website/public/first-investigation/index.html:79 -#: website/public/first-investigation/index.html:92 -#: website/public/get-started/index.html:79 website/public/get-started/index.html:92 -#: website/public/guides/browser/index.html:79 -#: website/public/guides/browser/index.html:92 website/public/guides/index.html:79 -#: website/public/guides/index.html:92 website/public/guides/javascript/index.html:79 -#: website/public/guides/javascript/index.html:92 -#: website/public/guides/native/index.html:79 website/public/guides/native/index.html:92 -#: website/public/index.html:79 website/public/index.html:92 -#: website/public/showcase/aegis/index.html:79 -#: website/public/showcase/aegis/index.html:92 website/public/showcase/ctf/index.html:79 -#: website/public/showcase/ctf/index.html:92 -#: website/public/showcase/dx-ball/index.html:79 -#: website/public/showcase/dx-ball/index.html:92 website/public/showcase/index.html:79 -#: website/public/showcase/index.html:92 website/public/showcase/notion/index.html:79 -#: website/public/showcase/notion/index.html:92 -#: website/public/showcase/th04/index.html:79 website/public/showcase/th04/index.html:92 +#: website/public/blog/index.html:81 website/public/blog/index.html:94 +#: website/public/blog/reverse-engineering-models/index.html:81 +#: website/public/blog/reverse-engineering-models/index.html:94 +#: website/public/blog/touhou-reconstruction/index.html:81 +#: website/public/blog/touhou-reconstruction/index.html:94 +#: website/public/contributors/index.html:81 website/public/contributors/index.html:94 +#: website/public/examples/dino-lab/index.html:81 +#: website/public/examples/dino-lab/index.html:94 website/public/faq/index.html:81 +#: website/public/faq/index.html:94 website/public/first-investigation/index.html:81 +#: website/public/first-investigation/index.html:94 +#: website/public/get-started/index.html:81 website/public/get-started/index.html:94 +#: website/public/guides/browser/index.html:81 +#: website/public/guides/browser/index.html:94 website/public/guides/index.html:81 +#: website/public/guides/index.html:94 website/public/guides/javascript/index.html:81 +#: website/public/guides/javascript/index.html:94 +#: website/public/guides/native/index.html:81 website/public/guides/native/index.html:94 +#: website/public/index.html:81 website/public/index.html:94 +#: website/public/showcase/aegis/index.html:81 +#: website/public/showcase/aegis/index.html:94 website/public/showcase/ctf/index.html:81 +#: website/public/showcase/ctf/index.html:94 +#: website/public/showcase/dx-ball/index.html:81 +#: website/public/showcase/dx-ball/index.html:94 website/public/showcase/index.html:81 +#: website/public/showcase/index.html:94 website/public/showcase/notion/index.html:81 +#: website/public/showcase/notion/index.html:94 +#: website/public/showcase/th04/index.html:81 website/public/showcase/th04/index.html:94 msgctxt "shared" msgid "REA — Find out how software works. Reverse engineering with your coding agent." msgstr "" -#: website/public/blog/index.html:112 -#: website/public/blog/reverse-engineering-models/index.html:112 -#: website/public/blog/touhou-reconstruction/index.html:112 -#: website/public/contributors/index.html:113 -#: website/public/examples/dino-lab/index.html:113 website/public/faq/index.html:112 -#: website/public/first-investigation/index.html:112 -#: website/public/get-started/index.html:112 -#: website/public/guides/browser/index.html:112 website/public/guides/index.html:112 -#: website/public/guides/javascript/index.html:112 -#: website/public/guides/native/index.html:112 website/public/index.html:114 -#: website/public/showcase/aegis/index.html:113 -#: website/public/showcase/ctf/index.html:112 -#: website/public/showcase/dx-ball/index.html:112 website/public/showcase/index.html:112 -#: website/public/showcase/notion/index.html:112 -#: website/public/showcase/th04/index.html:112 +#: website/public/blog/index.html:114 +#: website/public/blog/reverse-engineering-models/index.html:114 +#: website/public/blog/touhou-reconstruction/index.html:114 +#: website/public/contributors/index.html:115 +#: website/public/examples/dino-lab/index.html:115 website/public/faq/index.html:114 +#: website/public/first-investigation/index.html:114 +#: website/public/get-started/index.html:114 +#: website/public/guides/browser/index.html:114 website/public/guides/index.html:114 +#: website/public/guides/javascript/index.html:114 +#: website/public/guides/native/index.html:114 website/public/index.html:116 +#: website/public/showcase/aegis/index.html:115 +#: website/public/showcase/ctf/index.html:114 +#: website/public/showcase/dx-ball/index.html:114 website/public/showcase/index.html:114 +#: website/public/showcase/notion/index.html:114 +#: website/public/showcase/th04/index.html:114 msgctxt "shared" msgid "REA home" msgstr "" -#: website/public/blog/index.html:116 -#: website/public/blog/reverse-engineering-models/index.html:116 -#: website/public/blog/touhou-reconstruction/index.html:116 -#: website/public/contributors/index.html:117 -#: website/public/examples/dino-lab/index.html:117 website/public/faq/index.html:116 -#: website/public/first-investigation/index.html:116 -#: website/public/get-started/index.html:116 -#: website/public/guides/browser/index.html:116 website/public/guides/index.html:116 -#: website/public/guides/javascript/index.html:116 -#: website/public/guides/native/index.html:116 website/public/index.html:118 -#: website/public/showcase/aegis/index.html:117 -#: website/public/showcase/ctf/index.html:116 -#: website/public/showcase/dx-ball/index.html:116 website/public/showcase/index.html:116 -#: website/public/showcase/notion/index.html:116 -#: website/public/showcase/th04/index.html:116 +#: website/public/blog/index.html:118 +#: website/public/blog/reverse-engineering-models/index.html:118 +#: website/public/blog/touhou-reconstruction/index.html:118 +#: website/public/contributors/index.html:119 +#: website/public/examples/dino-lab/index.html:119 website/public/faq/index.html:118 +#: website/public/first-investigation/index.html:118 +#: website/public/get-started/index.html:118 +#: website/public/guides/browser/index.html:118 website/public/guides/index.html:118 +#: website/public/guides/javascript/index.html:118 +#: website/public/guides/native/index.html:118 website/public/index.html:120 +#: website/public/showcase/aegis/index.html:119 +#: website/public/showcase/ctf/index.html:118 +#: website/public/showcase/dx-ball/index.html:118 website/public/showcase/index.html:118 +#: website/public/showcase/notion/index.html:118 +#: website/public/showcase/th04/index.html:118 msgctxt "shared" msgid "Main navigation" msgstr "" -#: website/public/blog/index.html:135 -#: website/public/blog/reverse-engineering-models/index.html:135 -#: website/public/blog/touhou-reconstruction/index.html:135 -#: website/public/contributors/index.html:136 -#: website/public/examples/dino-lab/index.html:136 website/public/faq/index.html:135 -#: website/public/first-investigation/index.html:135 -#: website/public/get-started/index.html:135 -#: website/public/guides/browser/index.html:135 website/public/guides/index.html:135 -#: website/public/guides/javascript/index.html:135 -#: website/public/guides/native/index.html:135 website/public/index.html:137 -#: website/public/showcase/aegis/index.html:136 -#: website/public/showcase/ctf/index.html:135 -#: website/public/showcase/dx-ball/index.html:135 website/public/showcase/index.html:135 -#: website/public/showcase/notion/index.html:135 -#: website/public/showcase/th04/index.html:135 +#: website/public/blog/index.html:137 +#: website/public/blog/reverse-engineering-models/index.html:137 +#: website/public/blog/touhou-reconstruction/index.html:137 +#: website/public/contributors/index.html:138 +#: website/public/examples/dino-lab/index.html:138 website/public/faq/index.html:137 +#: website/public/first-investigation/index.html:137 +#: website/public/get-started/index.html:137 +#: website/public/guides/browser/index.html:137 website/public/guides/index.html:137 +#: website/public/guides/javascript/index.html:137 +#: website/public/guides/native/index.html:137 website/public/index.html:139 +#: website/public/showcase/aegis/index.html:138 +#: website/public/showcase/ctf/index.html:137 +#: website/public/showcase/dx-ball/index.html:137 website/public/showcase/index.html:137 +#: website/public/showcase/notion/index.html:137 +#: website/public/showcase/th04/index.html:137 msgctxt "shared" msgid "REA on GitHub" msgstr "" -#: website/public/blog/index.html:155 -#: website/public/blog/reverse-engineering-models/index.html:155 -#: website/public/blog/touhou-reconstruction/index.html:155 -#: website/public/contributors/index.html:156 -#: website/public/examples/dino-lab/index.html:156 website/public/faq/index.html:155 -#: website/public/first-investigation/index.html:155 -#: website/public/get-started/index.html:155 -#: website/public/guides/browser/index.html:155 website/public/guides/index.html:155 -#: website/public/guides/javascript/index.html:155 -#: website/public/guides/native/index.html:155 website/public/index.html:157 -#: website/public/showcase/aegis/index.html:156 -#: website/public/showcase/ctf/index.html:155 -#: website/public/showcase/dx-ball/index.html:155 website/public/showcase/index.html:155 -#: website/public/showcase/notion/index.html:155 -#: website/public/showcase/th04/index.html:155 +#: website/public/blog/index.html:157 +#: website/public/blog/reverse-engineering-models/index.html:157 +#: website/public/blog/touhou-reconstruction/index.html:157 +#: website/public/contributors/index.html:158 +#: website/public/examples/dino-lab/index.html:158 website/public/faq/index.html:157 +#: website/public/first-investigation/index.html:157 +#: website/public/get-started/index.html:157 +#: website/public/guides/browser/index.html:157 website/public/guides/index.html:157 +#: website/public/guides/javascript/index.html:157 +#: website/public/guides/native/index.html:157 website/public/index.html:159 +#: website/public/showcase/aegis/index.html:158 +#: website/public/showcase/ctf/index.html:157 +#: website/public/showcase/dx-ball/index.html:157 website/public/showcase/index.html:157 +#: website/public/showcase/notion/index.html:157 +#: website/public/showcase/th04/index.html:157 msgctxt "shared" msgid "Join REA on Discord" msgstr "" -#: website/public/blog/index.html:174 -#: website/public/blog/reverse-engineering-models/index.html:174 -#: website/public/blog/touhou-reconstruction/index.html:174 -#: website/public/contributors/index.html:175 -#: website/public/examples/dino-lab/index.html:175 website/public/faq/index.html:174 -#: website/public/first-investigation/index.html:174 -#: website/public/get-started/index.html:174 -#: website/public/guides/browser/index.html:174 website/public/guides/index.html:174 -#: website/public/guides/javascript/index.html:174 -#: website/public/guides/native/index.html:174 website/public/index.html:176 -#: website/public/showcase/aegis/index.html:175 -#: website/public/showcase/ctf/index.html:174 -#: website/public/showcase/dx-ball/index.html:174 website/public/showcase/index.html:174 -#: website/public/showcase/notion/index.html:174 -#: website/public/showcase/th04/index.html:174 +#: website/public/blog/index.html:176 +#: website/public/blog/reverse-engineering-models/index.html:176 +#: website/public/blog/touhou-reconstruction/index.html:176 +#: website/public/contributors/index.html:177 +#: website/public/examples/dino-lab/index.html:177 website/public/faq/index.html:176 +#: website/public/first-investigation/index.html:176 +#: website/public/get-started/index.html:176 +#: website/public/guides/browser/index.html:176 website/public/guides/index.html:176 +#: website/public/guides/javascript/index.html:176 +#: website/public/guides/native/index.html:176 website/public/index.html:178 +#: website/public/showcase/aegis/index.html:177 +#: website/public/showcase/ctf/index.html:176 +#: website/public/showcase/dx-ball/index.html:176 website/public/showcase/index.html:176 +#: website/public/showcase/notion/index.html:176 +#: website/public/showcase/th04/index.html:176 msgctxt "shared" msgid "Follow REA on X" msgstr "" -#: website/public/blog/index.html:250 +#: website/public/blog/index.html:252 msgctxt "page:blog/index.html" msgid "Back to top" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:107 +#: website/public/blog/reverse-engineering-models/index.html:109 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Skip to content" msgstr "" @@ -437,35 +437,35 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/blog/reverse-engineering-models/index.html:199 +#: website/public/blog/reverse-engineering-models/index.html:201 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}Home{ph1} / {ph2}Blog{ph3} / Models and RE" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:202 +#: website/public/blog/reverse-engineering-models/index.html:204 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Essay" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:203 +#: website/public/blog/reverse-engineering-models/index.html:205 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Does reverse engineering need a bigger model?" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:204 +#: website/public/blog/reverse-engineering-models/index.html:206 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "By N0zoM1z0 · 13 October 2026" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:206 +#: website/public/blog/reverse-engineering-models/index.html:208 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Takeaway" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:208 +#: website/public/blog/reverse-engineering-models/index.html:210 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -475,7 +475,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:216 +#: website/public/blog/reverse-engineering-models/index.html:218 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -485,7 +485,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:223 +#: website/public/blog/reverse-engineering-models/index.html:225 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -495,7 +495,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:228 +#: website/public/blog/reverse-engineering-models/index.html:230 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -505,7 +505,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:235 +#: website/public/blog/reverse-engineering-models/index.html:237 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -513,14 +513,14 @@ msgid "" "want from the whole agent." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:246 +#: website/public/blog/reverse-engineering-models/index.html:248 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "In this article" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:248 +#: website/public/blog/reverse-engineering-models/index.html:250 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}What better models changed{ph1}" @@ -528,7 +528,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:249 +#: website/public/blog/reverse-engineering-models/index.html:251 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}Why specialize?{ph1}" @@ -536,7 +536,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:250 +#: website/public/blog/reverse-engineering-models/index.html:252 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}Where experience lives{ph1}" @@ -544,7 +544,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:251 +#: website/public/blog/reverse-engineering-models/index.html:253 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}Learning the next experiment{ph1}" @@ -552,7 +552,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:252 +#: website/public/blog/reverse-engineering-models/index.html:254 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}RE and reinforcement learning{ph1}" @@ -560,7 +560,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:253 +#: website/public/blog/reverse-engineering-models/index.html:255 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}When the oracle is wrong{ph1}" @@ -568,7 +568,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:254 +#: website/public/blog/reverse-engineering-models/index.html:256 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}A comparison worth running{ph1}" @@ -576,18 +576,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:255 +#: website/public/blog/reverse-engineering-models/index.html:257 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "{ph0}What kind of agent?{ph1}" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:263 +#: website/public/blog/reverse-engineering-models/index.html:265 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "What better models changed" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:264 +#: website/public/blog/reverse-engineering-models/index.html:266 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Since August 2026, I have been exploring how much reverse engineering an agent can " @@ -596,7 +596,7 @@ msgid "" "repositories have kept a record of what each session managed to recover." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:272 +#: website/public/blog/reverse-engineering-models/index.html:274 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Much of that work aims at exact reconstruction: we compile the maintained source under" @@ -605,12 +605,12 @@ msgid "" "made that progress possible." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:279 +#: website/public/blog/reverse-engineering-models/index.html:281 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "The temporary values had to stay alive together" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:280 +#: website/public/blog/reverse-engineering-models/index.html:282 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Much of a TH09 attack function's logic had already been reconstructed, but the " @@ -627,7 +627,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th09/commit/52929ed7c299f1a5f29cc13964e22510145fd616" #. > #. {ph3}: -#: website/public/blog/reverse-engineering-models/index.html:287 +#: website/public/blog/reverse-engineering-models/index.html:289 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -636,7 +636,7 @@ msgid "" "useful hypothesis about how long those temporary values needed to stay alive." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:301 +#: website/public/blog/reverse-engineering-models/index.html:303 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The function produced temporary results and copied them into animation positions. In " @@ -647,7 +647,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:308 +#: website/public/blog/reverse-engineering-models/index.html:310 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -656,7 +656,7 @@ msgid "" "experiments, {ph0}a clean rebuild confirmed that the full function matched{ph1}." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:317 +#: website/public/blog/reverse-engineering-models/index.html:319 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "What interests me is how the discovery and the tests worked together. The lifetime " @@ -664,7 +664,7 @@ msgid "" "hypothesis into a source arrangement that matched." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:323 +#: website/public/blog/reverse-engineering-models/index.html:325 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "A different control-flow graph" msgstr "" @@ -673,7 +673,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th09/commit/f8d12d72aaf02212ee1b585a8f3f86d7ed000269" #. > #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:324 +#: website/public/blog/reverse-engineering-models/index.html:326 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -691,7 +691,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th09/commit/5f825b28a862f8e1a6d4aea2f78a42f04c09a1c0" #. > #. {ph3}: -#: website/public/blog/reverse-engineering-models/index.html:335 +#: website/public/blog/reverse-engineering-models/index.html:337 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -703,7 +703,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:347 +#: website/public/blog/reverse-engineering-models/index.html:349 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -713,7 +713,7 @@ msgid "" "surrounding work." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:356 +#: website/public/blog/reverse-engineering-models/index.html:358 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "At the same time, the later sessions started with earlier source and recorded " @@ -722,7 +722,7 @@ msgid "" "the effect of the model from the experience it inherited." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:363 +#: website/public/blog/reverse-engineering-models/index.html:365 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "This is where the question becomes interesting to me. Some of the progress came from " @@ -731,12 +731,12 @@ msgid "" "much could a model learn through repeated experience with that compiler and code?" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:373 +#: website/public/blog/reverse-engineering-models/index.html:375 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Why might a specialist do well?" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:374 +#: website/public/blog/reverse-engineering-models/index.html:376 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Touhou gives us a concrete reason to expect that experience to help. Much of the game " @@ -745,7 +745,7 @@ msgid "" "helper arrangements have supplied hypotheses across games." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:381 +#: website/public/blog/reverse-engineering-models/index.html:383 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Those source patterns become more specific when we include the compiler. Under a " @@ -760,7 +760,7 @@ msgstr "" #. > #. {ph3}: Supervisor::LoadDat #. {ph4}: -#: website/public/blog/reverse-engineering-models/index.html:387 +#: website/public/blog/reverse-engineering-models/index.html:389 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -771,14 +771,14 @@ msgid "" "{ph3}{ph4}." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:401 +#: website/public/blog/reverse-engineering-models/index.html:403 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Reusing that pattern for the file-size variable produced the required layout without " "adding storage. The full function then matched." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:406 +#: website/public/blog/reverse-engineering-models/index.html:408 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "This is the sort of narrow detail a general model may not know when it arrives. A " @@ -786,7 +786,7 @@ msgid "" "source variations are worth testing first." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:412 +#: website/public/blog/reverse-engineering-models/index.html:414 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The opportunity is especially clear in final matching problems where we already " @@ -800,7 +800,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th04/commit/6dce0a79d5b931f0e2a08475b90e0c33d2321b98" #. > #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:420 +#: website/public/blog/reverse-engineering-models/index.html:422 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -812,14 +812,14 @@ msgid "" " part of what a specialist would need to learn." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:436 +#: website/public/blog/reverse-engineering-models/index.html:438 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Where should that experience live?" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:437 +#: website/public/blog/reverse-engineering-models/index.html:439 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -829,7 +829,7 @@ msgid "" " along with the source and failed experiments that made them useful." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:446 +#: website/public/blog/reverse-engineering-models/index.html:448 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "By retrieving that record, an agent can start with a known result and inspect how we " @@ -841,7 +841,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th09/commit/1eb843383941d00065622a9e353146c4bb96979e" #. > #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:452 +#: website/public/blog/reverse-engineering-models/index.html:454 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -853,7 +853,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:463 +#: website/public/blog/reverse-engineering-models/index.html:465 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -864,7 +864,7 @@ msgid "" "only the beginning of that process." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:473 +#: website/public/blog/reverse-engineering-models/index.html:475 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "For that reason, I would include a smaller general model with good retrieval in any " @@ -872,12 +872,12 @@ msgid "" "training adds: better candidate generation, better decisions after feedback, or both." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:481 +#: website/public/blog/reverse-engineering-models/index.html:483 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Learning the next useful experiment" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:482 +#: website/public/blog/reverse-engineering-models/index.html:484 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Those decisions after feedback are what I would most like to study. In agentic " @@ -886,7 +886,7 @@ msgid "" "suggest a more useful next experiment." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:489 +#: website/public/blog/reverse-engineering-models/index.html:491 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Consider the temporary-results example again. Its final source shows the arrangement " @@ -894,66 +894,66 @@ msgid "" "following experiments helped identify what still needed to change." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:502 +#: website/public/blog/reverse-engineering-models/index.html:504 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Experiment" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:503 +#: website/public/blog/reverse-engineering-models/index.html:505 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "What its result taught us" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:508 +#: website/public/blog/reverse-engineering-models/index.html:510 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Try a different way to copy the results" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:509 +#: website/public/blog/reverse-engineering-models/index.html:511 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "The copy code changes, but the function still differs." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:514 +#: website/public/blog/reverse-engineering-models/index.html:516 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Use the returned values directly" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:515 +#: website/public/blog/reverse-engineering-models/index.html:517 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Copying follows the original pattern, but temporary storage still differs." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:521 +#: website/public/blog/reverse-engineering-models/index.html:523 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Keep the temporary results alive together" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:522 +#: website/public/blog/reverse-engineering-models/index.html:524 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "They get separate storage, but one still overlaps a value used later for collision " "checks." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:528 +#: website/public/blog/reverse-engineering-models/index.html:530 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Keep the collision-check value separate" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:529 +#: website/public/blog/reverse-engineering-models/index.html:531 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "A clean rebuild confirms the complete match." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:534 +#: website/public/blog/reverse-engineering-models/index.html:536 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Selected experiments from the attack-function reconstruction above, grouped by what " "they taught us." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:538 +#: website/public/blog/reverse-engineering-models/index.html:540 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "A training record that keeps this sequence can teach more than the final source alone." @@ -964,7 +964,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:545 +#: website/public/blog/reverse-engineering-models/index.html:547 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -974,7 +974,7 @@ msgid "" "source representation or inspect the evidence again." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:554 +#: website/public/blog/reverse-engineering-models/index.html:556 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Learning to make those choices requires autonomy. Sometimes the useful next step is " @@ -983,12 +983,12 @@ msgid "" "the model to learn." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:563 +#: website/public/blog/reverse-engineering-models/index.html:565 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Why RE is interesting for reinforcement learning" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:564 +#: website/public/blog/reverse-engineering-models/index.html:566 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Bounded reconstruction gives us a practical environment for studying these choices. " @@ -997,7 +997,7 @@ msgid "" "that observation to choose its next step." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:571 +#: website/public/blog/reverse-engineering-models/index.html:573 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Reinforcement learning could train that decision-making process through the feedback " @@ -1009,7 +1009,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/blog/reverse-engineering-models/index.html:577 +#: website/public/blog/reverse-engineering-models/index.html:579 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1024,7 +1024,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th08/commit/af9cb1d3e839b15a78b47ac1701506083cc82847" #. > #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:589 +#: website/public/blog/reverse-engineering-models/index.html:591 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1035,7 +1035,7 @@ msgid "" " what to measure." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:600 +#: website/public/blog/reverse-engineering-models/index.html:602 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "This suggests another role for a broadly capable model: helping make the problem " @@ -1043,12 +1043,12 @@ msgid "" "learned search policy can get with it." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:608 +#: website/public/blog/reverse-engineering-models/index.html:610 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "When the oracle is wrong" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:609 +#: website/public/blog/reverse-engineering-models/index.html:611 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Once we train against that check, its coverage becomes part of what the model learns. " @@ -1056,7 +1056,7 @@ msgid "" "still need to understand what that answer covers." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:615 +#: website/public/blog/reverse-engineering-models/index.html:617 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "TH08 showed how much can hide outside that coverage. Some reconstructed functions " @@ -1072,7 +1072,7 @@ msgstr "" #. {ph1}: #. {ph2}: 1.0f #. {ph3}: 32.0f -#: website/public/blog/reverse-engineering-models/index.html:624 +#: website/public/blog/reverse-engineering-models/index.html:626 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1083,7 +1083,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:634 +#: website/public/blog/reverse-engineering-models/index.html:636 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1095,7 +1095,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:644 +#: website/public/blog/reverse-engineering-models/index.html:646 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1106,7 +1106,7 @@ msgid "" "checks." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:654 +#: website/public/blog/reverse-engineering-models/index.html:656 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Before using either kind of check as a reward, I would test it with deliberate " @@ -1118,7 +1118,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:662 +#: website/public/blog/reverse-engineering-models/index.html:664 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1127,12 +1127,12 @@ msgid "" "understanding that feedback becomes more important too." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:672 +#: website/public/blog/reverse-engineering-models/index.html:674 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "A comparison worth running" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:673 +#: website/public/blog/reverse-engineering-models/index.html:675 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "With those checks in place, I would start the comparison on a fixed VC7.1 task family." @@ -1142,7 +1142,7 @@ msgid "" "what training adds." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:681 +#: website/public/blog/reverse-engineering-models/index.html:683 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "To make those comparisons informative, each model would receive the same target " @@ -1151,7 +1151,7 @@ msgid "" "reliable search strategy from a lucky candidate." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:688 +#: website/public/blog/reverse-engineering-models/index.html:690 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "I would then separate two starting conditions: reconstructing a function from its " @@ -1160,7 +1160,7 @@ msgid "" "needed to reach it. Measuring them separately would reveal that division of work." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:696 +#: website/public/blog/reverse-engineering-models/index.html:698 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Both tasks need genuinely held-out examples. Because related Touhou games share engine" @@ -1169,7 +1169,7 @@ msgid "" "answers out of both training and retrieval." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:703 +#: website/public/blog/reverse-engineering-models/index.html:705 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "On those examples, the outcome would be complete, independently validated matches. " @@ -1179,7 +1179,7 @@ msgid "" "own accounting too." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:711 +#: website/public/blog/reverse-engineering-models/index.html:713 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "Both views matter because a cheaper proposal can become an expensive workflow if it " @@ -1191,7 +1191,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th09/commit/ab72fd77728293fc0beacfc656ca701b0e266016" #. > #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:717 +#: website/public/blog/reverse-engineering-models/index.html:719 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1203,7 +1203,7 @@ msgid "" "I would validate any reward for \"getting closer\" against the full acceptance check." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:732 +#: website/public/blog/reverse-engineering-models/index.html:734 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "I would be interested in the pattern across these results. If a specialist does well " @@ -1212,12 +1212,12 @@ msgid "" "would help us decide where each kind of model is most useful." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:741 +#: website/public/blog/reverse-engineering-models/index.html:743 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "What kind of agent does this suggest?" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:742 +#: website/public/blog/reverse-engineering-models/index.html:744 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "If the models turn out to help at different stages, a useful arrangement might be a " @@ -1227,7 +1227,7 @@ msgid "" "itself." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:750 +#: website/public/blog/reverse-engineering-models/index.html:752 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "In that arrangement, specialization becomes a tool the agent can choose as the " @@ -1235,7 +1235,7 @@ msgid "" "earlier breakthroughs possible." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:755 +#: website/public/blog/reverse-engineering-models/index.html:757 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "This follows naturally from the industrial shift I described in the previous essay. " @@ -1244,7 +1244,7 @@ msgid "" " repeated experience with a particular craft." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:762 +#: website/public/blog/reverse-engineering-models/index.html:764 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "For now, the strongest general model has earned its place in my workflow by opening " @@ -1255,7 +1255,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:770 +#: website/public/blog/reverse-engineering-models/index.html:772 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1263,7 +1263,7 @@ msgid "" "that record to build the comparison and see what we learn." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:780 +#: website/public/blog/reverse-engineering-models/index.html:782 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Evidence and model attribution" msgstr "" @@ -1271,7 +1271,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/reverse-engineering-models/index.html:781 +#: website/public/blog/reverse-engineering-models/index.html:783 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1279,7 +1279,7 @@ msgid "" "context." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:788 +#: website/public/blog/reverse-engineering-models/index.html:790 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The examples describe historical function-level comparisons recorded in the linked " @@ -1289,7 +1289,7 @@ msgstr "" #. {ph0}: gpt-dots #. {ph1}: gpt-web -#: website/public/blog/reverse-engineering-models/index.html:794 +#: website/public/blog/reverse-engineering-models/index.html:796 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1309,7 +1309,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th09/commit/52929ed7c299f1a5f29cc13964e22510145fd616" #. > #. {ph5}: -#: website/public/blog/reverse-engineering-models/index.html:803 +#: website/public/blog/reverse-engineering-models/index.html:805 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1331,7 +1331,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th09/commit/5f825b28a862f8e1a6d4aea2f78a42f04c09a1c0" #. > #. {ph7}: -#: website/public/blog/reverse-engineering-models/index.html:815 +#: website/public/blog/reverse-engineering-models/index.html:817 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1353,7 +1353,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th09/commit/1eb843383941d00065622a9e353146c4bb96979e" #. > #. {ph7}: -#: website/public/blog/reverse-engineering-models/index.html:831 +#: website/public/blog/reverse-engineering-models/index.html:833 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1375,7 +1375,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th09/commit/ab72fd77728293fc0beacfc656ca701b0e266016" #. > #. {ph7}: -#: website/public/blog/reverse-engineering-models/index.html:847 +#: website/public/blog/reverse-engineering-models/index.html:849 #, python-brace-format msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" @@ -1383,7 +1383,7 @@ msgid "" "numerical investigation{ph5} and {ph6}TH09 replay-save reconstruction{ph7}." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:864 +#: website/public/blog/reverse-engineering-models/index.html:866 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "" "The proposed specialist and RL comparisons are future experiments. The project " @@ -1402,27 +1402,27 @@ msgid "" "learning to propose better hypotheses from compiler feedback." msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:245 +#: website/public/blog/reverse-engineering-models/index.html:247 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "On this page" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:258 +#: website/public/blog/reverse-engineering-models/index.html:260 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Models and reverse engineering essay" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:496 +#: website/public/blog/reverse-engineering-models/index.html:498 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Selected reconstruction experiments" msgstr "" -#: website/public/blog/reverse-engineering-models/index.html:889 +#: website/public/blog/reverse-engineering-models/index.html:891 msgctxt "page:blog/reverse-engineering-models/index.html" msgid "Back to top" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:107 +#: website/public/blog/touhou-reconstruction/index.html:109 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Skip to content" msgstr "" @@ -1431,35 +1431,35 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/blog/touhou-reconstruction/index.html:199 +#: website/public/blog/touhou-reconstruction/index.html:201 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Home{ph1} / {ph2}Blog{ph3} / Touhou reconstruction" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:203 +#: website/public/blog/touhou-reconstruction/index.html:205 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Essay · Touhou reconstruction" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:204 +#: website/public/blog/touhou-reconstruction/index.html:206 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "The industrial revolution in reverse engineering." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:205 +#: website/public/blog/touhou-reconstruction/index.html:207 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "By N0zoM1z0 · 10 October 2026" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:207 +#: website/public/blog/touhou-reconstruction/index.html:209 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Takeaway" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:209 +#: website/public/blog/touhou-reconstruction/index.html:211 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1469,7 +1469,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:214 +#: website/public/blog/touhou-reconstruction/index.html:216 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1479,7 +1479,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:219 +#: website/public/blog/touhou-reconstruction/index.html:221 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1489,7 +1489,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:224 +#: website/public/blog/touhou-reconstruction/index.html:226 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1499,7 +1499,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:229 +#: website/public/blog/touhou-reconstruction/index.html:231 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1507,65 +1507,65 @@ msgid "" "still taking shape. There is plenty left to explore." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:241 +#: website/public/blog/touhou-reconstruction/index.html:243 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "How experience compounds" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:242 +#: website/public/blog/touhou-reconstruction/index.html:244 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Human direction{ph1} · Goal and acceptance criteria" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:330 +#: website/public/blog/touhou-reconstruction/index.html:332 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Autonomy" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:331 +#: website/public/blog/touhou-reconstruction/index.html:333 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Agent" msgstr "" #. {ph0}:
-#: website/public/blog/touhou-reconstruction/index.html:332 +#: website/public/blog/touhou-reconstruction/index.html:334 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Choose an experiment.{ph0}Propose a hypothesis." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:335 +#: website/public/blog/touhou-reconstruction/index.html:337 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Verification" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:336 +#: website/public/blog/touhou-reconstruction/index.html:338 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Oracle" msgstr "" #. {ph0}:
-#: website/public/blog/touhou-reconstruction/index.html:337 +#: website/public/blog/touhou-reconstruction/index.html:339 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Test against a{ph0}concrete reference." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:340 +#: website/public/blog/touhou-reconstruction/index.html:342 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Repository" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:341 +#: website/public/blog/touhou-reconstruction/index.html:343 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Working memory" msgstr "" #. {ph0}:
-#: website/public/blog/touhou-reconstruction/index.html:342 +#: website/public/blog/touhou-reconstruction/index.html:344 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Code, evidence,{ph0}checks and lessons." @@ -1574,7 +1574,7 @@ msgstr "" #. {ph0}:
#. {ph1}: #. {ph2}: -#: website/public/blog/touhou-reconstruction/index.html:344 +#: website/public/blog/touhou-reconstruction/index.html:346 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Mismatch{ph0}{ph1}Revise the hypothesis{ph2}" @@ -1583,40 +1583,40 @@ msgstr "" #. {ph0}:
#. {ph1}: #. {ph2}: -#: website/public/blog/touhou-reconstruction/index.html:347 +#: website/public/blog/touhou-reconstruction/index.html:349 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "A better{ph0}{ph1}starting point{ph2}" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:350 +#: website/public/blog/touhou-reconstruction/index.html:352 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Reuse" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:351 +#: website/public/blog/touhou-reconstruction/index.html:353 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Pass{ph1} · Keep the result and its evidence" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:363 +#: website/public/blog/touhou-reconstruction/index.html:365 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Each project leaves the next with a better starting point. That includes fixing the " "checks when we discover a gap." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:370 +#: website/public/blog/touhou-reconstruction/index.html:372 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "In this article" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:372 +#: website/public/blog/touhou-reconstruction/index.html:374 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}August 2026{ph1}" @@ -1624,7 +1624,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:373 +#: website/public/blog/touhou-reconstruction/index.html:375 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}TH08: the continuation{ph1}" @@ -1632,7 +1632,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:374 +#: website/public/blog/touhou-reconstruction/index.html:376 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Two approaches{ph1}" @@ -1640,7 +1640,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:375 +#: website/public/blog/touhou-reconstruction/index.html:377 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}TH095: compounding{ph1}" @@ -1648,7 +1648,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:376 +#: website/public/blog/touhou-reconstruction/index.html:378 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}TH04: across architectures{ph1}" @@ -1656,7 +1656,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:377 +#: website/public/blog/touhou-reconstruction/index.html:379 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}From exact to readable{ph1}" @@ -1664,7 +1664,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:380 +#: website/public/blog/touhou-reconstruction/index.html:382 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}The industrial shift{ph1}" @@ -1672,18 +1672,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:381 +#: website/public/blog/touhou-reconstruction/index.html:383 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}What becomes possible{ph1}" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:386 +#: website/public/blog/touhou-reconstruction/index.html:388 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "What changed in August 2026" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:387 +#: website/public/blog/touhou-reconstruction/index.html:389 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Before this work, I had done a lot of manual reverse engineering. I would inspect a " @@ -1692,7 +1692,7 @@ msgid "" " keeping an increasingly large picture in my head." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:394 +#: website/public/blog/touhou-reconstruction/index.html:396 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Most of my RE work is on games. I reconstruct them so their behavior can be understood" @@ -1701,7 +1701,7 @@ msgid "" " can check against a reliable reference." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:401 +#: website/public/blog/touhou-reconstruction/index.html:403 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "In August 2026, I started exploring agent-driven RE seriously. I wanted to see how far" @@ -1709,7 +1709,7 @@ msgid "" "reconstruction gave me a substantial project in which to find out." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:407 +#: website/public/blog/touhou-reconstruction/index.html:409 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The early progress was startling. An investigation could keep moving without me " @@ -1719,14 +1719,14 @@ msgid "" "project's direction and on whether its checks were trustworthy." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:416 +#: website/public/blog/touhou-reconstruction/index.html:418 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The pace got my attention first. Then I began wondering what would survive beyond the " "current project. Would the next game benefit from everything we had just learned?" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:423 +#: website/public/blog/touhou-reconstruction/index.html:425 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "TH08: building on human work" msgstr "" @@ -1735,7 +1735,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/blog/touhou-reconstruction/index.html:424 +#: website/public/blog/touhou-reconstruction/index.html:426 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1745,7 +1745,7 @@ msgid "" "continuation." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:433 +#: website/public/blog/touhou-reconstruction/index.html:435 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The imported history ends at the public 10 August checkpoint. My independent " @@ -1753,7 +1753,7 @@ msgid "" "1,107 identified game functions." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:438 +#: website/public/blog/touhou-reconstruction/index.html:440 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "A playable Linux reconstruction port was committed on 24 August, roughly eleven days " @@ -1761,7 +1761,7 @@ msgid "" "arrived on 30 August." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:443 +#: website/public/blog/touhou-reconstruction/index.html:445 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "What struck me was that the work had reached a program people could run. Getting there" @@ -1772,7 +1772,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:450 +#: website/public/blog/touhou-reconstruction/index.html:452 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1783,12 +1783,12 @@ msgid "" "something specific to investigate." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:458 +#: website/public/blog/touhou-reconstruction/index.html:460 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "An exact match with the wrong constant" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:459 +#: website/public/blog/touhou-reconstruction/index.html:461 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "An oracle is software someone wrote. TH08 gave me a clear reminder of how much can " @@ -1797,7 +1797,7 @@ msgstr "" #. {ph0}: 0.0 #. {ph1}: 128.0 -#: website/public/blog/touhou-reconstruction/index.html:463 +#: website/public/blog/touhou-reconstruction/index.html:465 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1806,7 +1806,7 @@ msgid "" "used {ph1}, the maximum-power threshold." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:469 +#: website/public/blog/touhou-reconstruction/index.html:471 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Normal power is non-negative, so the reconstructed power check was effectively always " @@ -1817,13 +1817,13 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:476 +#: website/public/blog/touhou-reconstruction/index.html:478 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}Yet the function had already passed the exact comparison.{ph1}" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:482 +#: website/public/blog/touhou-reconstruction/index.html:484 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "A rebuild can put a constant at a different address. The comparison tool accounted for" @@ -1834,7 +1834,7 @@ msgstr "" #. {ph0}: 128.0 #. {ph1}: 0.0 -#: website/public/blog/touhou-reconstruction/index.html:489 +#: website/public/blog/touhou-reconstruction/index.html:491 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1847,7 +1847,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/blog/touhou-reconstruction/index.html:495 +#: website/public/blog/touhou-reconstruction/index.html:497 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1857,7 +1857,7 @@ msgid "" "accepted functions." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:506 +#: website/public/blog/touhou-reconstruction/index.html:508 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The comparison now checks every such floating literal. Its tests include deliberately " @@ -1867,7 +1867,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:511 +#: website/public/blog/touhou-reconstruction/index.html:513 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1875,7 +1875,7 @@ msgid "" " game." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:515 +#: website/public/blog/touhou-reconstruction/index.html:517 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "That matters when the team is mostly one person working with agents. I cannot " @@ -1887,7 +1887,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:523 +#: website/public/blog/touhou-reconstruction/index.html:525 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1898,7 +1898,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:532 +#: website/public/blog/touhou-reconstruction/index.html:534 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1906,7 +1906,7 @@ msgid "" "next batch.{ph1}" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:540 +#: website/public/blog/touhou-reconstruction/index.html:542 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Two different ideas of reconstruction" msgstr "" @@ -1915,7 +1915,7 @@ msgstr "" #. href="https://web.archive.org/web/20260909051514/https://github.com/GensokyoClub/th08#important- #. notice" > #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:541 +#: website/public/blog/touhou-reconstruction/index.html:543 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -1924,14 +1924,14 @@ msgid "" "completion. One passage reads:" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:552 +#: website/public/blog/touhou-reconstruction/index.html:554 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The rise of grifters (AI decompilations and ports) in this space taking from our work " "paints a bad image for future decompilation efforts…" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:558 +#: website/public/blog/touhou-reconstruction/index.html:560 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The notice also describes the psychological toll on the maintainers. Their " @@ -1941,7 +1941,7 @@ msgid "" "how reconstruction should proceed and how a contribution should be judged." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:567 +#: website/public/blog/touhou-reconstruction/index.html:569 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "In the manual workflow I knew, developing an understanding of a function and " @@ -1950,7 +1950,7 @@ msgid "" " happened while they worked." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:574 +#: website/public/blog/touhou-reconstruction/index.html:576 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Existing projects already preserve knowledge in their source and build tools. What " @@ -1958,7 +1958,7 @@ msgid "" "investigation on its own." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:579 +#: website/public/blog/touhou-reconstruction/index.html:581 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "In my continuation, I decide the objective and the standard for accepting a result. " @@ -1967,7 +1967,7 @@ msgid "" "an implementation, even if an agent did most of the work." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:586 +#: website/public/blog/touhou-reconstruction/index.html:588 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "This can be a difficult transition. Years of careful work may become the foundation " @@ -1975,7 +1975,7 @@ msgid "" " also changes what maintainers need to know before accepting a contribution." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:592 +#: website/public/blog/touhou-reconstruction/index.html:594 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The industrial analogy helps me think about this. In a craft, much of the process " @@ -1984,7 +1984,7 @@ msgid "" "wrong. Different communities can choose how much of that change they want to take on." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:600 +#: website/public/blog/touhou-reconstruction/index.html:602 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "My choice is to continue openly, with the inherited work credited and its history " @@ -2004,7 +2004,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th08/blob/d2a00f4acb4a13916e07a00bd13f714961714628/README.md#credits- #. and-provenance" > #. {ph5}: -#: website/public/blog/touhou-reconstruction/index.html:606 +#: website/public/blog/touhou-reconstruction/index.html:608 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2013,14 +2013,14 @@ msgid "" "{ph4}credits and provenance{ph5} record the continuation boundary." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:624 +#: website/public/blog/touhou-reconstruction/index.html:626 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "TH095: experience starts compounding" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:625 +#: website/public/blog/touhou-reconstruction/index.html:627 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2030,7 +2030,7 @@ msgid "" "begin a reconstruction and how to keep it moving." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:633 +#: website/public/blog/touhou-reconstruction/index.html:635 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "By 7 September, all 697 identified game functions had source. By 8 September, 696 had " @@ -2039,7 +2039,7 @@ msgid "" "after initialization." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:640 +#: website/public/blog/touhou-reconstruction/index.html:642 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "I found this more exciting than the first project's speed. A fresh target could " @@ -2047,7 +2047,7 @@ msgid "" "tools and in the way the project was organized." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:646 +#: website/public/blog/touhou-reconstruction/index.html:648 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "For example, TH08 had taught us to pay attention to the assembled program early. If " @@ -2056,7 +2056,7 @@ msgid "" "shape how we approached TH095's whole-program build." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:653 +#: website/public/blog/touhou-reconstruction/index.html:655 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "A lesson that stays in my head is useful while I am there. Once it becomes a check " @@ -2064,7 +2064,7 @@ msgid "" "agent can use the result without repeating the investigation that led to it." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:659 +#: website/public/blog/touhou-reconstruction/index.html:661 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The floating-literal bug belongs in that memory too. It explains why checking a " @@ -2074,7 +2074,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:665 +#: website/public/blog/touhou-reconstruction/index.html:667 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2082,7 +2082,7 @@ msgid "" "spend more of the next project's effort on what is actually new about its target." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:673 +#: website/public/blog/touhou-reconstruction/index.html:675 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The same benefit is available to people joining later. They can inspect a decision and" @@ -2090,7 +2090,7 @@ msgid "" "entire project's history to find out why the source looks the way it does." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:681 +#: website/public/blog/touhou-reconstruction/index.html:683 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "TH04: the workflow survives a different architecture" msgstr "" @@ -2099,7 +2099,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/blog/touhou-reconstruction/index.html:682 +#: website/public/blog/touhou-reconstruction/index.html:684 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2109,7 +2109,7 @@ msgid "" "{ph2}ReC98 work{ph3} gave us valuable knowledge and source material here too." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:691 +#: website/public/blog/touhou-reconstruction/index.html:693 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The DOS reconstruction is now working. In my manual testing, I played complete Normal " @@ -2117,7 +2117,7 @@ msgid "" "port. Establishing a working DOS version first gives that port a reference." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:697 +#: website/public/blog/touhou-reconstruction/index.html:699 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The architecture changed what we needed to investigate. It also changed the compiler " @@ -2125,7 +2125,7 @@ msgid "" "question through to a result and let that result guide the next experiment." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:703 +#: website/public/blog/touhou-reconstruction/index.html:705 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Consider the transition from gameplay to an ending. We need to know what state carries" @@ -2134,7 +2134,7 @@ msgid "" "an agent can work through the question much as it did on a Windows title." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:711 +#: website/public/blog/touhou-reconstruction/index.html:713 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "This is why TH04 matters to the argument. A substantial platform change did not force " @@ -2142,7 +2142,7 @@ msgid "" "workflow still gave us a way to solve it." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:717 +#: website/public/blog/touhou-reconstruction/index.html:719 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "For the 64-bit port, we can now examine the new implementation against behavior " @@ -2156,7 +2156,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/blog/touhou-reconstruction/index.html:722 +#: website/public/blog/touhou-reconstruction/index.html:724 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2164,17 +2164,17 @@ msgid "" " {ph2}64-bit port{ph3}. The port remains in development." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:735 +#: website/public/blog/touhou-reconstruction/index.html:737 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "From exact code to readable code" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:736 +#: website/public/blog/touhou-reconstruction/index.html:738 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Once a reconstruction works, I want someone else to be able to understand it." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:740 +#: website/public/blog/touhou-reconstruction/index.html:742 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "To me, assembly and raw offsets can feel like old friends. I realise this is a " @@ -2184,7 +2184,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:746 +#: website/public/blog/touhou-reconstruction/index.html:748 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2195,7 +2195,7 @@ msgid "" "interpretation came from." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:754 +#: website/public/blog/touhou-reconstruction/index.html:756 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "This becomes especially important for a port. An absolute address tells me where " @@ -2204,14 +2204,14 @@ msgid "" "recover the relationship behind the old memory access." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:761 +#: website/public/blog/touhou-reconstruction/index.html:763 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "The order I now use is:" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:763 +#: website/public/blog/touhou-reconstruction/index.html:765 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2222,7 +2222,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:770 +#: website/public/blog/touhou-reconstruction/index.html:772 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2234,7 +2234,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:777 +#: website/public/blog/touhou-reconstruction/index.html:779 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2246,7 +2246,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:786 +#: website/public/blog/touhou-reconstruction/index.html:788 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2257,7 +2257,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:793 +#: website/public/blog/touhou-reconstruction/index.html:795 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2267,7 +2267,7 @@ msgid "" "still builds and behaves correctly along the paths we exercise." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:801 +#: website/public/blog/touhou-reconstruction/index.html:803 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "They catch different mistakes. A type change can alter the generated instructions. An " @@ -2276,7 +2276,7 @@ msgid "" " carrying a refactor further." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:808 +#: website/public/blog/touhou-reconstruction/index.html:810 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "A name needs evidence of its own. An exact comparison cannot tell us whether a field " @@ -2289,7 +2289,7 @@ msgstr "" #. factory/blob/717e1b8560783ed17a39fdf159d30aa16bb307a7/docs/semantic- #. reconstruction.md" > #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:815 +#: website/public/blog/touhou-reconstruction/index.html:817 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2301,7 +2301,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:826 +#: website/public/blog/touhou-reconstruction/index.html:828 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2309,12 +2309,12 @@ msgid "" "recovered knowledge usable.{ph1} A port can then build on both." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:835 +#: website/public/blog/touhou-reconstruction/index.html:837 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "What makes this an industrial shift" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:836 +#: website/public/blog/touhou-reconstruction/index.html:838 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "These projects changed where I spent my attention. Once agents could carry much of an " @@ -2323,7 +2323,7 @@ msgid "" "needed it." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:843 +#: website/public/blog/touhou-reconstruction/index.html:845 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Autonomy matters here. The useful next step often becomes clear only after a failed " @@ -2332,7 +2332,7 @@ msgid "" "attention." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:850 +#: website/public/blog/touhou-reconstruction/index.html:852 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "I expect the agent to make wrong hypotheses. What matters is whether we can test them " @@ -2341,7 +2341,7 @@ msgid "" "a project milestone." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:857 +#: website/public/blog/touhou-reconstruction/index.html:859 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "REA gives the agent access to analysis tools. A question about a function's caller can" @@ -2350,7 +2350,7 @@ msgid "" "proposes and see where its explanation holds up." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:864 +#: website/public/blog/touhou-reconstruction/index.html:866 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The TH08 bug shows why those checks deserve engineering attention of their own. When " @@ -2362,7 +2362,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:871 +#: website/public/blog/touhou-reconstruction/index.html:873 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2375,7 +2375,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:884 +#: website/public/blog/touhou-reconstruction/index.html:886 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2386,7 +2386,7 @@ msgid "" "project can then inherit a stronger tool." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:894 +#: website/public/blog/touhou-reconstruction/index.html:896 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "There is also a practical limit to any one conversation. It will end before a large " @@ -2396,7 +2396,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:900 +#: website/public/blog/touhou-reconstruction/index.html:902 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2405,7 +2405,7 @@ msgid "" "the starting conditions for another." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:910 +#: website/public/blog/touhou-reconstruction/index.html:912 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "That is what makes the industrial analogy meaningful to me. Experience starts becoming" @@ -2413,12 +2413,12 @@ msgid "" "person—or the next agent—can get done." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:918 +#: website/public/blog/touhou-reconstruction/index.html:920 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "The projects we can now consider" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:919 +#: website/public/blog/touhou-reconstruction/index.html:921 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The pace matters because it changes the decision to begin. A game could be fascinating" @@ -2426,7 +2426,7 @@ msgid "" "realistically give it. Many projects would stay ideas." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:925 +#: website/public/blog/touhou-reconstruction/index.html:927 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "Now I can see a way to keep such a project moving through repeated investigations. " @@ -2437,7 +2437,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/blog/touhou-reconstruction/index.html:932 +#: website/public/blog/touhou-reconstruction/index.html:934 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2445,7 +2445,7 @@ msgid "" "accumulated knowledge would let an agent work on this reliably?{ph1}" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:939 +#: website/public/blog/touhou-reconstruction/index.html:941 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "That question makes me consider projects I would previously have left alone. Each one " @@ -2453,12 +2453,12 @@ msgid "" "take us." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:947 +#: website/public/blog/touhou-reconstruction/index.html:949 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Project milestones and sources" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:948 +#: website/public/blog/touhou-reconstruction/index.html:950 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" "The dates describe recorded project checkpoints, checked against public GitHub history" @@ -2486,7 +2486,7 @@ msgstr "" #. {ph9}: #. {ph10}: #. {ph11}: -#: website/public/blog/touhou-reconstruction/index.html:956 +#: website/public/blog/touhou-reconstruction/index.html:958 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2517,7 +2517,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th095/blob/3442dcf29d9e0b5bef384a49bd0c9ad32a711826/docs/WHOLE_BUILD_TODO.md" #. > #. {ph11}: -#: website/public/blog/touhou-reconstruction/index.html:979 +#: website/public/blog/touhou-reconstruction/index.html:981 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2532,7 +2532,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th04/blob/bb9faca54e2eb3c0d6c757c75d59ac29d2cd5e93/docs/RE_HANDOFF.md" #. > #. {ph3}: -#: website/public/blog/touhou-reconstruction/index.html:1002 +#: website/public/blog/touhou-reconstruction/index.html:1004 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2552,7 +2552,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th08/commit/a393f400786e4cc6cbb1000af0dad3276da12c78" #. > #. {ph7}: -#: website/public/blog/touhou-reconstruction/index.html:1011 +#: website/public/blog/touhou-reconstruction/index.html:1013 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2570,7 +2570,7 @@ msgstr "" #. factory/blob/717e1b8560783ed17a39fdf159d30aa16bb307a7/docs/semantic- #. reconstruction.md" > #. {ph5}: -#: website/public/blog/touhou-reconstruction/index.html:1025 +#: website/public/blog/touhou-reconstruction/index.html:1027 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2583,7 +2583,7 @@ msgstr "" #. {ph2}: #. {ph3}: -#: website/public/blog/touhou-reconstruction/index.html:1037 +#: website/public/blog/touhou-reconstruction/index.html:1039 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2599,7 +2599,7 @@ msgstr "" #. {ph4}: #. {ph5}: -#: website/public/blog/touhou-reconstruction/index.html:1046 +#: website/public/blog/touhou-reconstruction/index.html:1048 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "" @@ -2611,7 +2611,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/blog/touhou-reconstruction/index.html:1061 +#: website/public/blog/touhou-reconstruction/index.html:1063 #, python-brace-format msgctxt "page:blog/touhou-reconstruction/index.html" msgid "{ph0}More articles{ph1} · {ph2}Explore a TH04 investigation{ph3}" @@ -2629,72 +2629,72 @@ msgid "" " and how knowledge compounds across TH08, TH095 and PC-98 TH04." msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:355 +#: website/public/blog/touhou-reconstruction/index.html:357 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Experience carried between projects" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:369 +#: website/public/blog/touhou-reconstruction/index.html:371 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "On this page" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:384 +#: website/public/blog/touhou-reconstruction/index.html:386 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Touhou reconstruction essay" msgstr "" -#: website/public/blog/touhou-reconstruction/index.html:1086 +#: website/public/blog/touhou-reconstruction/index.html:1088 msgctxt "page:blog/touhou-reconstruction/index.html" msgid "Back to top" msgstr "" -#: website/public/contributors/index.html:108 +#: website/public/contributors/index.html:110 msgctxt "page:contributors/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/contributors/index.html:200 +#: website/public/contributors/index.html:202 #, python-brace-format msgctxt "page:contributors/index.html" msgid "{ph0}Home{ph1} / Contributors" msgstr "" -#: website/public/contributors/index.html:201 +#: website/public/contributors/index.html:203 msgctxt "page:contributors/index.html" msgid "Built together." msgstr "" -#: website/public/contributors/index.html:202 +#: website/public/contributors/index.html:204 msgctxt "page:contributors/index.html" msgid "Thank you to everyone who helps make REA better." msgstr "" -#: website/public/contributors/index.html:203 +#: website/public/contributors/index.html:205 msgctxt "page:contributors/index.html" msgid "" "Code, documentation, tests, translations and ideas — there are many ways to " "contribute." msgstr "" -#: website/public/contributors/index.html:208 +#: website/public/contributors/index.html:210 msgctxt "page:contributors/index.html" msgid "How to contribute" msgstr "" -#: website/public/contributors/index.html:213 +#: website/public/contributors/index.html:215 msgctxt "page:contributors/index.html" msgid "Join the conversation →" msgstr "" -#: website/public/contributors/index.html:223 +#: website/public/contributors/index.html:225 msgctxt "page:contributors/index.html" msgid "Contributors" msgstr "" -#: website/public/contributors/index.html:225 +#: website/public/contributors/index.html:227 msgctxt "page:contributors/index.html" msgid "Find a contributor" msgstr "" @@ -2702,13 +2702,13 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: -#: website/public/contributors/index.html:1112 +#: website/public/contributors/index.html:1114 #, python-brace-format msgctxt "page:contributors/index.html" msgid "From {ph0}GitHub’s contributor list{ph1} · Updated {ph2}." msgstr "" -#: website/public/contributors/index.html:1117 +#: website/public/contributors/index.html:1119 msgctxt "page:contributors/index.html" msgid "No matching contributors. Try another username." msgstr "" @@ -2723,17 +2723,17 @@ msgctxt "page:contributors/index.html" msgid "Meet the people who contribute code, documentation, tests and ideas to REA." msgstr "" -#: website/public/contributors/index.html:226 +#: website/public/contributors/index.html:228 msgctxt "page:contributors/index.html" msgid "GitHub username" msgstr "" -#: website/public/contributors/index.html:1137 +#: website/public/contributors/index.html:1139 msgctxt "page:contributors/index.html" msgid "Back to top" msgstr "" -#: website/public/examples/dino-lab/index.html:108 +#: website/public/examples/dino-lab/index.html:110 msgctxt "page:examples/dino-lab/index.html" msgid "Skip to content" msgstr "" @@ -2742,18 +2742,18 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/examples/dino-lab/index.html:200 +#: website/public/examples/dino-lab/index.html:202 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Home{ph1}{ph2}/{ph3}Dinosaur speed lab" msgstr "" -#: website/public/examples/dino-lab/index.html:203 +#: website/public/examples/dino-lab/index.html:205 msgctxt "page:examples/dino-lab/index.html" msgid "Inspect → rebuild → change" msgstr "" -#: website/public/examples/dino-lab/index.html:204 +#: website/public/examples/dino-lab/index.html:206 msgctxt "page:examples/dino-lab/index.html" msgid "Rebuild the dinosaur’s speed rule." msgstr "" @@ -2762,7 +2762,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/examples/dino-lab/index.html:205 +#: website/public/examples/dino-lab/index.html:207 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" @@ -2771,15 +2771,15 @@ msgid "" "with {ph2}adjustable speed.{ph3}" msgstr "" -#: website/public/examples/dino-lab/index.html:214 -#: website/public/examples/dino-lab/index.html:213 +#: website/public/examples/dino-lab/index.html:216 +#: website/public/examples/dino-lab/index.html:215 msgctxt "page:examples/dino-lab/index.html" msgid "On this page" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/examples/dino-lab/index.html:216 +#: website/public/examples/dino-lab/index.html:218 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Play and change the speed{ph1}" @@ -2787,7 +2787,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/examples/dino-lab/index.html:217 +#: website/public/examples/dino-lab/index.html:219 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Read the recovered rule{ph1}" @@ -2795,7 +2795,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/examples/dino-lab/index.html:218 +#: website/public/examples/dino-lab/index.html:220 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Check the reconstruction{ph1}" @@ -2803,18 +2803,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/examples/dino-lab/index.html:219 +#: website/public/examples/dino-lab/index.html:221 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Try the analysis{ph1}" msgstr "" -#: website/public/examples/dino-lab/index.html:224 +#: website/public/examples/dino-lab/index.html:226 msgctxt "page:examples/dino-lab/index.html" msgid "Play and change the speed" msgstr "" -#: website/public/examples/dino-lab/index.html:225 +#: website/public/examples/dino-lab/index.html:227 msgctxt "page:examples/dino-lab/index.html" msgid "" "Press Play, then jump over the cactus. Move the speed slider to try a slower or faster" @@ -2822,54 +2822,54 @@ msgid "" "gradually accelerate again." msgstr "" -#: website/public/examples/dino-lab/index.html:231 +#: website/public/examples/dino-lab/index.html:233 msgctxt "page:examples/dino-lab/index.html" msgid "Play the reconstruction" msgstr "" -#: website/public/examples/dino-lab/index.html:263 +#: website/public/examples/dino-lab/index.html:265 msgctxt "page:examples/dino-lab/index.html" msgid "Play" msgstr "" -#: website/public/examples/dino-lab/index.html:266 +#: website/public/examples/dino-lab/index.html:268 msgctxt "page:examples/dino-lab/index.html" msgid "Jump ↑" msgstr "" -#: website/public/examples/dino-lab/index.html:267 +#: website/public/examples/dino-lab/index.html:269 msgctxt "page:examples/dino-lab/index.html" msgid "Restart" msgstr "" -#: website/public/examples/dino-lab/index.html:270 +#: website/public/examples/dino-lab/index.html:272 msgctxt "page:examples/dino-lab/index.html" msgid "Speed" msgstr "" -#: website/public/examples/dino-lab/index.html:280 +#: website/public/examples/dino-lab/index.html:282 msgctxt "page:examples/dino-lab/index.html" msgid "Use the recovered acceleration rule" msgstr "" -#: website/public/examples/dino-lab/index.html:284 +#: website/public/examples/dino-lab/index.html:286 msgctxt "page:examples/dino-lab/index.html" msgid "Original rule: start at 6, then increase toward 13." msgstr "" -#: website/public/examples/dino-lab/index.html:287 +#: website/public/examples/dino-lab/index.html:289 msgctxt "page:examples/dino-lab/index.html" msgid "Move the slider to set your own speed. Space or Jump clears a cactus." msgstr "" -#: website/public/examples/dino-lab/index.html:292 +#: website/public/examples/dino-lab/index.html:294 msgctxt "page:examples/dino-lab/index.html" msgid "" "Enable JavaScript to play the reconstruction. The code and explanation above remain " "readable." msgstr "" -#: website/public/examples/dino-lab/index.html:300 +#: website/public/examples/dino-lab/index.html:302 msgctxt "page:examples/dino-lab/index.html" msgid "Read the script REA returned" msgstr "" @@ -2877,7 +2877,7 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: index.js -#: website/public/examples/dino-lab/index.html:301 +#: website/public/examples/dino-lab/index.html:303 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" @@ -2885,7 +2885,7 @@ msgid "" "the loaded {ph2}, including this branch in the game’s update function:" msgstr "" -#: website/public/examples/dino-lab/index.html:311 +#: website/public/examples/dino-lab/index.html:313 msgctxt "page:examples/dino-lab/index.html" msgid "REA · selected script source" msgstr "" @@ -2893,7 +2893,7 @@ msgstr "" #. {ph0}: SPEED: 6 #. {ph1}: ACCELERATION: 0.001 #. {ph2}: MAX_SPEED: 13 -#: website/public/examples/dino-lab/index.html:317 +#: website/public/examples/dino-lab/index.html:319 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" @@ -2901,25 +2901,25 @@ msgid "" "without a collision." msgstr "" -#: website/public/examples/dino-lab/index.html:322 +#: website/public/examples/dino-lab/index.html:324 msgctxt "page:examples/dino-lab/index.html" msgid "Use the same rule in the new game" msgstr "" #. {ph0}: dino-speed.js -#: website/public/examples/dino-lab/index.html:325 +#: website/public/examples/dino-lab/index.html:327 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "Reconstruction · {ph0}" msgstr "" -#: website/public/examples/dino-lab/index.html:328 -#: website/public/examples/dino-lab/index.html:427 +#: website/public/examples/dino-lab/index.html:330 +#: website/public/examples/dino-lab/index.html:429 msgctxt "page:examples/dino-lab/index.html" msgid "Copy" msgstr "" -#: website/public/examples/dino-lab/index.html:341 +#: website/public/examples/dino-lab/index.html:343 msgctxt "page:examples/dino-lab/index.html" msgid "" "The mini-game uses this function for automatic acceleration. Moving the slider " @@ -2931,59 +2931,59 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/examples/dino-lab/index.html:347 +#: website/public/examples/dino-lab/index.html:349 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Download the speed rule{ph1} · {ph2}Read the game code{ph3}" msgstr "" -#: website/public/examples/dino-lab/index.html:355 +#: website/public/examples/dino-lab/index.html:357 msgctxt "page:examples/dino-lab/index.html" msgid "Check the reconstruction" msgstr "" -#: website/public/examples/dino-lab/index.html:356 +#: website/public/examples/dino-lab/index.html:358 msgctxt "page:examples/dino-lab/index.html" msgid "" "We called the original game’s update function with obstacles and automatic scheduling " "disabled. Compare those recorded speeds with a replay of the recovered rule." msgstr "" -#: website/public/examples/dino-lab/index.html:365 +#: website/public/examples/dino-lab/index.html:367 msgctxt "page:examples/dino-lab/index.html" msgid "Updates" msgstr "" -#: website/public/examples/dino-lab/index.html:366 +#: website/public/examples/dino-lab/index.html:368 msgctxt "page:examples/dino-lab/index.html" msgid "Original game" msgstr "" -#: website/public/examples/dino-lab/index.html:367 +#: website/public/examples/dino-lab/index.html:369 msgctxt "page:examples/dino-lab/index.html" msgid "Reconstructed rule" msgstr "" -#: website/public/examples/dino-lab/index.html:394 +#: website/public/examples/dino-lab/index.html:396 msgctxt "page:examples/dino-lab/index.html" msgid "Run the speed check" msgstr "" -#: website/public/examples/dino-lab/index.html:397 +#: website/public/examples/dino-lab/index.html:399 msgctxt "page:examples/dino-lab/index.html" msgid "" "Values rounded to three decimals. The branch checks before adding, so the final " "increment can take speed just above 13." msgstr "" -#: website/public/examples/dino-lab/index.html:403 +#: website/public/examples/dino-lab/index.html:405 msgctxt "page:examples/dino-lab/index.html" msgid "Try the analysis yourself" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/examples/dino-lab/index.html:405 +#: website/public/examples/dino-lab/index.html:407 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}Set up REA{ph1} with your coding agent." @@ -2992,13 +2992,13 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: https://wayou.github.io/t-rex-runner/ -#: website/public/examples/dino-lab/index.html:409 +#: website/public/examples/dino-lab/index.html:411 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "Follow the {ph0}browser connection steps{ph1}, using {ph2} as the page URL." msgstr "" -#: website/public/examples/dino-lab/index.html:416 +#: website/public/examples/dino-lab/index.html:418 msgctxt "page:examples/dino-lab/index.html" msgid "" "Give your agent the page URL and local debugging endpoint, then copy this prompt." @@ -3012,7 +3012,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/examples/dino-lab/index.html:423 +#: website/public/examples/dino-lab/index.html:425 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" @@ -3024,7 +3024,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/examples/dino-lab/index.html:436 +#: website/public/examples/dino-lab/index.html:438 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" @@ -3034,7 +3034,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/examples/dino-lab/index.html:445 +#: website/public/examples/dino-lab/index.html:447 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" @@ -3047,7 +3047,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/examples/dino-lab/index.html:452 +#: website/public/examples/dino-lab/index.html:454 #, python-brace-format msgctxt "page:examples/dino-lab/index.html" msgid "" @@ -3067,63 +3067,63 @@ msgid "" "play." msgstr "" -#: website/public/examples/dino-lab/index.html:222 +#: website/public/examples/dino-lab/index.html:224 msgctxt "page:examples/dino-lab/index.html" msgid "Dinosaur speed reconstruction" msgstr "" -#: website/public/examples/dino-lab/index.html:253 +#: website/public/examples/dino-lab/index.html:255 msgctxt "page:examples/dino-lab/index.html" msgid "" "Dinosaur mini-game. Use the Jump button or press Space while the game is focused." msgstr "" -#: website/public/examples/dino-lab/index.html:328 +#: website/public/examples/dino-lab/index.html:330 msgctxt "page:examples/dino-lab/index.html" msgid "Copy reconstructed speed rule" msgstr "" -#: website/public/examples/dino-lab/index.html:427 +#: website/public/examples/dino-lab/index.html:429 msgctxt "page:examples/dino-lab/index.html" msgid "Copy dinosaur analysis prompt" msgstr "" -#: website/public/examples/dino-lab/index.html:481 +#: website/public/examples/dino-lab/index.html:483 msgctxt "page:examples/dino-lab/index.html" msgid "Back to top" msgstr "" -#: website/public/faq/index.html:107 +#: website/public/faq/index.html:109 msgctxt "page:faq/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:199 +#: website/public/faq/index.html:201 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Home{ph1} / FAQ" msgstr "" -#: website/public/faq/index.html:200 +#: website/public/faq/index.html:202 msgctxt "page:faq/index.html" msgid "REA FAQ." msgstr "" -#: website/public/faq/index.html:201 +#: website/public/faq/index.html:203 msgctxt "page:faq/index.html" msgid "Setup, updates, analysis and troubleshooting." msgstr "" -#: website/public/faq/index.html:205 +#: website/public/faq/index.html:207 msgctxt "page:faq/index.html" msgid "Topics" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:207 +#: website/public/faq/index.html:209 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Setup and updates{ph1}" @@ -3131,7 +3131,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:208 +#: website/public/faq/index.html:210 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Analysis{ph1}" @@ -3139,7 +3139,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:209 +#: website/public/faq/index.html:211 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Troubleshooting{ph1}" @@ -3147,24 +3147,24 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:210 +#: website/public/faq/index.html:212 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Data and sharing{ph1}" msgstr "" -#: website/public/faq/index.html:219 +#: website/public/faq/index.html:221 msgctxt "page:faq/index.html" msgid "Setup and updates" msgstr "" -#: website/public/faq/index.html:222 +#: website/public/faq/index.html:224 msgctxt "page:faq/index.html" msgid "How do I install REA?" msgstr "" #. {ph0}: Node.js -#: website/public/faq/index.html:223 +#: website/public/faq/index.html:225 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3172,22 +3172,22 @@ msgid "" "proposed changes." msgstr "" -#: website/public/faq/index.html:230 +#: website/public/faq/index.html:232 msgctxt "page:faq/index.html" msgid "Terminal · agent setup" msgstr "" -#: website/public/faq/index.html:231 website/public/faq/index.html:272 -#: website/public/faq/index.html:290 website/public/faq/index.html:374 -#: website/public/faq/index.html:421 website/public/faq/index.html:461 -#: website/public/faq/index.html:481 +#: website/public/faq/index.html:233 website/public/faq/index.html:274 +#: website/public/faq/index.html:292 website/public/faq/index.html:376 +#: website/public/faq/index.html:423 website/public/faq/index.html:463 +#: website/public/faq/index.html:483 msgctxt "page:faq/index.html" msgid "Copy" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:242 +#: website/public/faq/index.html:244 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3196,12 +3196,12 @@ msgid "" "{ph0}Follow the setup guide{ph1} for prerequisites and your first analysis." msgstr "" -#: website/public/faq/index.html:251 +#: website/public/faq/index.html:253 msgctxt "page:faq/index.html" msgid "Which coding agents can use REA?" msgstr "" -#: website/public/faq/index.html:252 +#: website/public/faq/index.html:254 msgctxt "page:faq/index.html" msgid "" "Any agent that supports local MCP servers. Setup includes Claude Code, Claude Desktop," @@ -3212,29 +3212,29 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:259 +#: website/public/faq/index.html:261 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Connect your coding agent{ph1}." msgstr "" -#: website/public/faq/index.html:264 +#: website/public/faq/index.html:266 msgctxt "page:faq/index.html" msgid "How do I update REA?" msgstr "" -#: website/public/faq/index.html:265 +#: website/public/faq/index.html:267 msgctxt "page:faq/index.html" msgid "REA releases frequently, including bug fixes. If you installed the CLI with npm:" msgstr "" -#: website/public/faq/index.html:271 +#: website/public/faq/index.html:273 msgctxt "page:faq/index.html" msgid "Terminal · installed CLI" msgstr "" #. {ph0}: npx -#: website/public/faq/index.html:283 +#: website/public/faq/index.html:285 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3242,13 +3242,13 @@ msgid "" "through {ph0}, run:" msgstr "" -#: website/public/faq/index.html:289 +#: website/public/faq/index.html:291 msgctxt "page:faq/index.html" msgid "Terminal · refresh agent setup" msgstr "" #. {ph0}: npx -y rea-agents@latest -#: website/public/faq/index.html:301 +#: website/public/faq/index.html:303 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3257,14 +3257,14 @@ msgid "" "followed by the command." msgstr "" -#: website/public/faq/index.html:309 +#: website/public/faq/index.html:311 msgctxt "page:faq/index.html" msgid "Is installing the skill from skills.sh enough?" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:312 +#: website/public/faq/index.html:314 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3273,24 +3273,24 @@ msgid "" "can call the tools." msgstr "" -#: website/public/faq/index.html:323 +#: website/public/faq/index.html:325 msgctxt "page:faq/index.html" msgid "Analysis" msgstr "" -#: website/public/faq/index.html:326 +#: website/public/faq/index.html:328 msgctxt "page:faq/index.html" msgid "What can I analyze with REA?" msgstr "" -#: website/public/faq/index.html:327 +#: website/public/faq/index.html:329 msgctxt "page:faq/index.html" msgid "Start with the kind of software you have:" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:329 +#: website/public/faq/index.html:331 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3300,7 +3300,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:334 +#: website/public/faq/index.html:336 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3309,7 +3309,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:339 +#: website/public/faq/index.html:341 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}Browser pages{ph1}: scripts, requests and runtime observations." @@ -3317,7 +3317,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:344 +#: website/public/faq/index.html:346 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3325,12 +3325,12 @@ msgid "" "resources. {ph0}See the case studies{ph1} for worked investigations." msgstr "" -#: website/public/faq/index.html:352 +#: website/public/faq/index.html:354 msgctxt "page:faq/index.html" msgid "Do I need Hopper, Ghidra or IDA?" msgstr "" -#: website/public/faq/index.html:353 +#: website/public/faq/index.html:355 msgctxt "page:faq/index.html" msgid "" "Deep native analysis uses one of them. Static JavaScript and .NET inspection work with" @@ -3339,7 +3339,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:358 +#: website/public/faq/index.html:360 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3348,25 +3348,25 @@ msgid "" "{ph0}Set up native analysis{ph1}." msgstr "" -#: website/public/faq/index.html:366 +#: website/public/faq/index.html:368 msgctxt "page:faq/index.html" msgid "Can I use REA without a coding agent?" msgstr "" -#: website/public/faq/index.html:367 +#: website/public/faq/index.html:369 msgctxt "page:faq/index.html" msgid "" "Yes. The CLI uses the same analysis workflows. For a local JavaScript or Electron app:" msgstr "" -#: website/public/faq/index.html:373 +#: website/public/faq/index.html:375 msgctxt "page:faq/index.html" msgid "Terminal · static application analysis" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:386 +#: website/public/faq/index.html:388 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3374,12 +3374,12 @@ msgid "" "CLI{ph1} for installation options." msgstr "" -#: website/public/faq/index.html:393 +#: website/public/faq/index.html:395 msgctxt "page:faq/index.html" msgid "What code does REA return?" msgstr "" -#: website/public/faq/index.html:394 +#: website/public/faq/index.html:396 msgctxt "page:faq/index.html" msgid "" "Native analysis returns assembly and pseudocode, with calls, references and relevant " @@ -3391,7 +3391,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/faq/index.html:399 +#: website/public/faq/index.html:401 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3400,12 +3400,12 @@ msgid "" "how that process works." msgstr "" -#: website/public/faq/index.html:410 +#: website/public/faq/index.html:412 msgctxt "page:faq/index.html" msgid "What should I ask my agent?" msgstr "" -#: website/public/faq/index.html:411 +#: website/public/faq/index.html:413 msgctxt "page:faq/index.html" msgid "" "Give it a local target and one behavior to investigate. For a JavaScript or Electron " @@ -3420,7 +3420,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/faq/index.html:417 +#: website/public/faq/index.html:419 #, python-brace-format msgctxt "page:faq/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" @@ -3433,7 +3433,7 @@ msgstr "" #. {ph4}: #. {ph5}: -#: website/public/faq/index.html:430 +#: website/public/faq/index.html:432 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3443,7 +3443,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:440 +#: website/public/faq/index.html:442 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3451,18 +3451,18 @@ msgid "" "Electron and browser examples." msgstr "" -#: website/public/faq/index.html:450 +#: website/public/faq/index.html:452 msgctxt "page:faq/index.html" msgid "Troubleshooting" msgstr "" -#: website/public/faq/index.html:453 +#: website/public/faq/index.html:455 msgctxt "page:faq/index.html" msgid "Why can't my agent see the REA tools?" msgstr "" #. {ph0}: doctor -#: website/public/faq/index.html:454 +#: website/public/faq/index.html:456 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3470,7 +3470,7 @@ msgid "" "for Codex:" msgstr "" -#: website/public/faq/index.html:460 +#: website/public/faq/index.html:462 msgctxt "page:faq/index.html" msgid "Terminal · check one client" msgstr "" @@ -3478,7 +3478,7 @@ msgstr "" #. {ph0}: codex #. {ph1}: claude_code #. {ph2}: cursor -#: website/public/faq/index.html:472 +#: website/public/faq/index.html:474 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3486,14 +3486,14 @@ msgid "" "missing or stale registration, run setup for that client:" msgstr "" -#: website/public/faq/index.html:480 +#: website/public/faq/index.html:482 msgctxt "page:faq/index.html" msgid "Terminal · repair one client's setup" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:492 +#: website/public/faq/index.html:494 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3501,14 +3501,14 @@ msgid "" "absent, check the client's MCP connection error. {ph0}More setup diagnostics{ph1}." msgstr "" -#: website/public/faq/index.html:500 +#: website/public/faq/index.html:502 msgctxt "page:faq/index.html" msgid "Do I need to start Hopper first?" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:501 +#: website/public/faq/index.html:503 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3517,14 +3517,14 @@ msgid "" "provider setup{ph1}." msgstr "" -#: website/public/faq/index.html:510 +#: website/public/faq/index.html:512 msgctxt "page:faq/index.html" msgid "What should I do if I hit a bug?" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:511 +#: website/public/faq/index.html:513 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3534,7 +3534,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:515 +#: website/public/faq/index.html:517 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3543,24 +3543,24 @@ msgid "" "problem involves native analysis." msgstr "" -#: website/public/faq/index.html:529 +#: website/public/faq/index.html:531 msgctxt "page:faq/index.html" msgid "Data and sharing" msgstr "" -#: website/public/faq/index.html:532 +#: website/public/faq/index.html:534 msgctxt "page:faq/index.html" msgid "Does REA upload my app?" msgstr "" -#: website/public/faq/index.html:533 +#: website/public/faq/index.html:535 msgctxt "page:faq/index.html" msgid "" "REA analyzes targets on your machine. Your agent receives the results, and its model " "provider's data policy applies to those results." msgstr "" -#: website/public/faq/index.html:540 +#: website/public/faq/index.html:542 msgctxt "page:faq/index.html" msgid "How can I share an example or contribute?" msgstr "" @@ -3569,7 +3569,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/faq/index.html:541 +#: website/public/faq/index.html:543 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3580,7 +3580,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/faq/index.html:553 +#: website/public/faq/index.html:555 #, python-brace-format msgctxt "page:faq/index.html" msgid "" @@ -3600,77 +3600,77 @@ msgid "" " troubleshooting and sharing examples." msgstr "" -#: website/public/faq/index.html:204 +#: website/public/faq/index.html:206 msgctxt "page:faq/index.html" msgid "On this page" msgstr "" -#: website/public/faq/index.html:213 +#: website/public/faq/index.html:215 msgctxt "page:faq/index.html" msgid "Frequently asked questions about REA" msgstr "" -#: website/public/faq/index.html:231 +#: website/public/faq/index.html:233 msgctxt "page:faq/index.html" msgid "Copy REA setup command" msgstr "" -#: website/public/faq/index.html:272 +#: website/public/faq/index.html:274 msgctxt "page:faq/index.html" msgid "Copy REA update command" msgstr "" -#: website/public/faq/index.html:290 +#: website/public/faq/index.html:292 msgctxt "page:faq/index.html" msgid "Copy agent setup refresh command" msgstr "" -#: website/public/faq/index.html:374 +#: website/public/faq/index.html:376 msgctxt "page:faq/index.html" msgid "Copy REA CLI analysis command" msgstr "" -#: website/public/faq/index.html:421 +#: website/public/faq/index.html:423 msgctxt "page:faq/index.html" msgid "Copy example analysis prompt" msgstr "" -#: website/public/faq/index.html:461 +#: website/public/faq/index.html:463 msgctxt "page:faq/index.html" msgid "Copy client diagnosis command" msgstr "" -#: website/public/faq/index.html:481 +#: website/public/faq/index.html:483 msgctxt "page:faq/index.html" msgid "Copy scoped setup command" msgstr "" -#: website/public/faq/index.html:579 +#: website/public/faq/index.html:581 msgctxt "page:faq/index.html" msgid "Back to top" msgstr "" -#: website/public/first-investigation/index.html:107 +#: website/public/first-investigation/index.html:109 msgctxt "page:first-investigation/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/first-investigation/index.html:199 +#: website/public/first-investigation/index.html:201 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}Home{ph1} / Your first investigation" msgstr "" #. {ph0}:
-#: website/public/first-investigation/index.html:202 +#: website/public/first-investigation/index.html:204 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "Find out where{ph0}exported notes go." msgstr "" -#: website/public/first-investigation/index.html:203 +#: website/public/first-investigation/index.html:205 msgctxt "page:first-investigation/index.html" msgid "" "Use REA to inspect a small app, follow its Export notes button and check one detail " @@ -3678,20 +3678,20 @@ msgid "" msgstr "" #. {ph0}: Node.js -#: website/public/first-investigation/index.html:207 +#: website/public/first-investigation/index.html:209 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "A supplied example · {ph0} and npm · Your coding agent" msgstr "" -#: website/public/first-investigation/index.html:214 +#: website/public/first-investigation/index.html:216 msgctxt "page:first-investigation/index.html" msgid "In this exercise" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/first-investigation/index.html:216 +#: website/public/first-investigation/index.html:218 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}1. Set up{ph1}" @@ -3699,7 +3699,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/first-investigation/index.html:217 +#: website/public/first-investigation/index.html:219 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}2. Ask about export{ph1}" @@ -3707,7 +3707,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/first-investigation/index.html:218 +#: website/public/first-investigation/index.html:220 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}3. Follow the answer{ph1}" @@ -3715,7 +3715,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/first-investigation/index.html:219 +#: website/public/first-investigation/index.html:221 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}4. Check a prediction{ph1}" @@ -3723,13 +3723,13 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/first-investigation/index.html:220 +#: website/public/first-investigation/index.html:222 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}5. Ask another question{ph1}" msgstr "" -#: website/public/first-investigation/index.html:225 +#: website/public/first-investigation/index.html:227 msgctxt "page:first-investigation/index.html" msgid "1. Connect your agent to REA" msgstr "" @@ -3737,7 +3737,7 @@ msgstr "" #. {ph0}: Node.js #. {ph1}: #. {ph2}: -#: website/public/first-investigation/index.html:226 +#: website/public/first-investigation/index.html:228 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -3753,20 +3753,20 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/first-investigation/index.html:234 -#: website/public/first-investigation/index.html:284 -#: website/public/first-investigation/index.html:406 +#: website/public/first-investigation/index.html:236 +#: website/public/first-investigation/index.html:286 +#: website/public/first-investigation/index.html:408 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" -#: website/public/first-investigation/index.html:239 -#: website/public/first-investigation/index.html:261 -#: website/public/first-investigation/index.html:289 -#: website/public/first-investigation/index.html:411 -#: website/public/first-investigation/index.html:452 -#: website/public/first-investigation/index.html:469 +#: website/public/first-investigation/index.html:241 +#: website/public/first-investigation/index.html:263 +#: website/public/first-investigation/index.html:291 +#: website/public/first-investigation/index.html:413 +#: website/public/first-investigation/index.html:454 +#: website/public/first-investigation/index.html:471 msgctxt "page:first-investigation/index.html" msgid "Copy" msgstr "" @@ -3778,7 +3778,7 @@ msgstr "" #. {ph4}: #. {ph5}: -#: website/public/first-investigation/index.html:248 +#: website/public/first-investigation/index.html:250 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -3786,26 +3786,26 @@ msgid "" "the setup plan for approval, then verify the installation.{ph4}{ph5}{ph6}" msgstr "" -#: website/public/first-investigation/index.html:258 +#: website/public/first-investigation/index.html:260 msgctxt "page:first-investigation/index.html" msgid "Or run this command in your terminal:" msgstr "" -#: website/public/first-investigation/index.html:270 +#: website/public/first-investigation/index.html:272 msgctxt "page:first-investigation/index.html" msgid "" "Review the plan, approve the setup, then restart your agent. Already connected? " "Continue below." msgstr "" -#: website/public/first-investigation/index.html:276 +#: website/public/first-investigation/index.html:278 msgctxt "page:first-investigation/index.html" msgid "2. Ask where the CSV is written" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/first-investigation/index.html:277 +#: website/public/first-investigation/index.html:279 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -3821,7 +3821,7 @@ msgstr "" #. {ph5}: #. {ph6}: -#: website/public/first-investigation/index.html:298 +#: website/public/first-investigation/index.html:300 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -3830,7 +3830,7 @@ msgid "" " it contains, and the relevant files and lines.{ph5}{ph6}{ph7}" msgstr "" -#: website/public/first-investigation/index.html:312 +#: website/public/first-investigation/index.html:314 msgctxt "page:first-investigation/index.html" msgid "" "Your agent downloads the files and gives the unpacked folder to REA for inspection." @@ -3839,14 +3839,14 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/first-investigation/index.html:316 +#: website/public/first-investigation/index.html:318 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}Download example ZIP{ph1}" msgstr "" #. {ph0}: notes-example -#: website/public/first-investigation/index.html:324 +#: website/public/first-investigation/index.html:326 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -3854,12 +3854,12 @@ msgid "" "the {ph0} folder and the same export question." msgstr "" -#: website/public/first-investigation/index.html:331 +#: website/public/first-investigation/index.html:333 msgctxt "page:first-investigation/index.html" msgid "3. Follow the answer back to the code" msgstr "" -#: website/public/first-investigation/index.html:332 +#: website/public/first-investigation/index.html:334 msgctxt "page:first-investigation/index.html" msgid "Look for a short explanation with file and line references:" msgstr "" @@ -3868,7 +3868,7 @@ msgstr "" #. {ph1}: notes.csv #. {ph2}: id #. {ph3}: title -#: website/public/first-investigation/index.html:334 +#: website/public/first-investigation/index.html:336 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -3876,7 +3876,7 @@ msgid "" " {ph1} in the user’s Downloads folder. The columns are {ph2} and {ph3}." msgstr "" -#: website/public/first-investigation/index.html:342 +#: website/public/first-investigation/index.html:344 msgctxt "page:first-investigation/index.html" msgid "From the button to the file writer" msgstr "" @@ -3889,7 +3889,7 @@ msgstr "" #. {ph5}: #. {ph6}: notes.exportCsv() #. {ph7}: -#: website/public/first-investigation/index.html:344 +#: website/public/first-investigation/index.html:346 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}Page · {ph1}{ph2}{ph3}Export notes{ph4}{ph5}Calls {ph6}.{ph7}" @@ -3903,7 +3903,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/first-investigation/index.html:352 +#: website/public/first-investigation/index.html:354 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -3920,7 +3920,7 @@ msgstr "" #. {ph6}: #. {ph7}: csv.js #. {ph8}: -#: website/public/first-investigation/index.html:360 +#: website/public/first-investigation/index.html:362 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -3928,7 +3928,7 @@ msgid "" "writes the file.{ph8}" msgstr "" -#: website/public/first-investigation/index.html:371 +#: website/public/first-investigation/index.html:373 msgctxt "page:first-investigation/index.html" msgid "" "REA’s static analysis pairs the message with its handler. The destination is read from" @@ -3936,18 +3936,18 @@ msgid "" msgstr "" #. {ph0}: main.js -#: website/public/first-investigation/index.html:378 +#: website/public/first-investigation/index.html:380 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0} · lines 8–12" msgstr "" -#: website/public/first-investigation/index.html:379 +#: website/public/first-investigation/index.html:381 msgctxt "page:first-investigation/index.html" msgid "Source" msgstr "" -#: website/public/first-investigation/index.html:387 +#: website/public/first-investigation/index.html:389 msgctxt "page:first-investigation/index.html" msgid "" "The file path, formatter and write call are together in this handler. Ask your agent " @@ -3956,18 +3956,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/first-investigation/index.html:392 +#: website/public/first-investigation/index.html:394 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "{ph0}See the full code trace and recorded REA result{ph1}." msgstr "" -#: website/public/first-investigation/index.html:399 +#: website/public/first-investigation/index.html:401 msgctxt "page:first-investigation/index.html" msgid "4. Check a prediction" msgstr "" -#: website/public/first-investigation/index.html:400 +#: website/public/first-investigation/index.html:402 msgctxt "page:first-investigation/index.html" msgid "" "A comma separates CSV columns. What happens when a note title itself contains a comma " @@ -3983,7 +3983,7 @@ msgstr "" #. {ph6}: #. {ph7}: -#: website/public/first-investigation/index.html:420 +#: website/public/first-investigation/index.html:422 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -3992,13 +3992,13 @@ msgid "" "output.{ph6}{ph7}{ph8}" msgstr "" -#: website/public/first-investigation/index.html:433 +#: website/public/first-investigation/index.html:435 msgctxt "page:first-investigation/index.html" msgid "Expected formatter output" msgstr "" #. {ph0}: Node.js -#: website/public/first-investigation/index.html:438 +#: website/public/first-investigation/index.html:440 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -4006,34 +4006,34 @@ msgid "" "formatter directly with {ph0}." msgstr "" -#: website/public/first-investigation/index.html:444 +#: website/public/first-investigation/index.html:446 msgctxt "page:first-investigation/index.html" msgid "Run the check yourself" msgstr "" #. {ph0}: notes-example -#: website/public/first-investigation/index.html:445 +#: website/public/first-investigation/index.html:447 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "Open a terminal in the unpacked {ph0} folder:" msgstr "" -#: website/public/first-investigation/index.html:486 +#: website/public/first-investigation/index.html:488 msgctxt "page:first-investigation/index.html" msgid "5. Ask another question" msgstr "" -#: website/public/first-investigation/index.html:487 +#: website/public/first-investigation/index.html:489 msgctxt "page:first-investigation/index.html" msgid "Try a follow-up in the same conversation:" msgstr "" -#: website/public/first-investigation/index.html:489 +#: website/public/first-investigation/index.html:491 msgctxt "page:first-investigation/index.html" msgid "What happens if the file can’t be written? Follow the error back to the page." msgstr "" -#: website/public/first-investigation/index.html:494 +#: website/public/first-investigation/index.html:496 msgctxt "page:first-investigation/index.html" msgid "" "Or give your agent an app of your own and ask about one button, file or behavior." @@ -4043,7 +4043,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/first-investigation/index.html:499 +#: website/public/first-investigation/index.html:501 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -4055,7 +4055,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/first-investigation/index.html:505 +#: website/public/first-investigation/index.html:507 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -4067,7 +4067,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/first-investigation/index.html:513 +#: website/public/first-investigation/index.html:515 #, python-brace-format msgctxt "page:first-investigation/index.html" msgid "" @@ -4087,66 +4087,66 @@ msgid "" "check the CSV formatter with a sample title." msgstr "" -#: website/public/first-investigation/index.html:213 +#: website/public/first-investigation/index.html:215 msgctxt "page:first-investigation/index.html" msgid "On this page" msgstr "" -#: website/public/first-investigation/index.html:223 +#: website/public/first-investigation/index.html:225 msgctxt "page:first-investigation/index.html" msgid "Your first REA investigation" msgstr "" -#: website/public/first-investigation/index.html:239 +#: website/public/first-investigation/index.html:241 msgctxt "page:first-investigation/index.html" msgid "Copy REA installation prompt" msgstr "" -#: website/public/first-investigation/index.html:261 +#: website/public/first-investigation/index.html:263 msgctxt "page:first-investigation/index.html" msgid "Copy setup command" msgstr "" -#: website/public/first-investigation/index.html:289 +#: website/public/first-investigation/index.html:291 msgctxt "page:first-investigation/index.html" msgid "Copy Notes investigation prompt" msgstr "" -#: website/public/first-investigation/index.html:411 +#: website/public/first-investigation/index.html:413 msgctxt "page:first-investigation/index.html" msgid "Copy CSV check prompt" msgstr "" -#: website/public/first-investigation/index.html:452 -#: website/public/first-investigation/index.html:469 +#: website/public/first-investigation/index.html:454 +#: website/public/first-investigation/index.html:471 msgctxt "page:first-investigation/index.html" msgid "Copy formatter check command" msgstr "" -#: website/public/first-investigation/index.html:540 +#: website/public/first-investigation/index.html:542 msgctxt "page:first-investigation/index.html" msgid "Back to top" msgstr "" -#: website/public/get-started/index.html:107 +#: website/public/get-started/index.html:109 msgctxt "page:get-started/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:199 +#: website/public/get-started/index.html:201 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Home{ph1} / Get started" msgstr "" -#: website/public/get-started/index.html:200 +#: website/public/get-started/index.html:202 msgctxt "page:get-started/index.html" msgid "Set up REA." msgstr "" -#: website/public/get-started/index.html:201 +#: website/public/get-started/index.html:203 msgctxt "page:get-started/index.html" msgid "" "Set up your computer and coding agent, connect REA, then investigate a small app." @@ -4154,7 +4154,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:205 +#: website/public/get-started/index.html:207 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4162,14 +4162,14 @@ msgid "" "{ph0}Connect REA{ph1}." msgstr "" -#: website/public/get-started/index.html:212 website/public/get-started/index.html:211 +#: website/public/get-started/index.html:214 website/public/get-started/index.html:213 msgctxt "page:get-started/index.html" msgid "On this page" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:214 +#: website/public/get-started/index.html:216 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}1. Prepare your computer{ph1}" @@ -4177,7 +4177,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:215 +#: website/public/get-started/index.html:217 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}2. Choose an agent{ph1}" @@ -4185,7 +4185,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:216 +#: website/public/get-started/index.html:218 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}3. Connect REA{ph1}" @@ -4193,7 +4193,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:217 +#: website/public/get-started/index.html:219 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}4. Try an investigation{ph1}" @@ -4201,7 +4201,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:218 +#: website/public/get-started/index.html:220 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Other targets and providers{ph1}" @@ -4209,7 +4209,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:219 +#: website/public/get-started/index.html:221 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Use the CLI{ph1}" @@ -4217,25 +4217,25 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:220 +#: website/public/get-started/index.html:222 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Getting help{ph1}" msgstr "" -#: website/public/get-started/index.html:225 +#: website/public/get-started/index.html:227 msgctxt "page:get-started/index.html" msgid "1. Prepare your computer" msgstr "" -#: website/public/get-started/index.html:226 +#: website/public/get-started/index.html:228 msgctxt "page:get-started/index.html" msgid "" "Use the computer where your target files are stored. A local coding agent can read " "those files and run tools for you." msgstr "" -#: website/public/get-started/index.html:231 +#: website/public/get-started/index.html:233 msgctxt "page:get-started/index.html" msgid "How do I open a terminal?" msgstr "" @@ -4244,7 +4244,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/get-started/index.html:233 +#: website/public/get-started/index.html:235 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4257,7 +4257,7 @@ msgstr "" #. {ph3}: Space #. {ph4}: #. {ph5}: -#: website/public/get-started/index.html:237 +#: website/public/get-started/index.html:239 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}macOS:{ph1} press {ph2} {ph3}, type {ph4}Terminal{ph5} and press Enter." @@ -4268,7 +4268,7 @@ msgstr "" #. {ph2}: Ctrl #. {ph3}: Alt #. {ph4}: T -#: website/public/get-started/index.html:241 +#: website/public/get-started/index.html:243 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Linux:{ph1} press {ph2} {ph3} {ph4} on most desktops." @@ -4281,7 +4281,7 @@ msgstr "" #. {ph4}: Ctrl #. {ph5}: Shift #. {ph6}: V -#: website/public/get-started/index.html:246 +#: website/public/get-started/index.html:248 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4289,7 +4289,7 @@ msgid "" "{ph6}), then press Enter." msgstr "" -#: website/public/get-started/index.html:251 +#: website/public/get-started/index.html:253 msgctxt "page:get-started/index.html" msgid "" "Commands go in the terminal. Prompts labeled “Your coding agent” go in the agent's " @@ -4298,54 +4298,54 @@ msgstr "" #. {ph0}: Node.js #. {ph1}: Node.js -#: website/public/get-started/index.html:256 +#: website/public/get-started/index.html:258 #, python-brace-format msgctxt "page:get-started/index.html" msgid "You'll need {ph0} 22 (22.19+), 24 (24.11+) or 26+. npm comes with {ph1}." msgstr "" #. {ph0}: Node.js -#: website/public/get-started/index.html:262 +#: website/public/get-started/index.html:264 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Don't have {ph0}, or not sure?" msgstr "" -#: website/public/get-started/index.html:265 +#: website/public/get-started/index.html:267 msgctxt "page:get-started/index.html" msgid "Open a terminal and check:" msgstr "" -#: website/public/get-started/index.html:268 +#: website/public/get-started/index.html:270 msgctxt "page:get-started/index.html" msgid "Terminal" msgstr "" -#: website/public/get-started/index.html:269 website/public/get-started/index.html:292 -#: website/public/get-started/index.html:322 website/public/get-started/index.html:347 -#: website/public/get-started/index.html:370 website/public/get-started/index.html:385 -#: website/public/get-started/index.html:419 website/public/get-started/index.html:450 -#: website/public/get-started/index.html:464 website/public/get-started/index.html:482 -#: website/public/get-started/index.html:534 website/public/get-started/index.html:548 -#: website/public/get-started/index.html:580 website/public/get-started/index.html:609 -#: website/public/get-started/index.html:744 website/public/get-started/index.html:774 -#: website/public/get-started/index.html:799 website/public/get-started/index.html:814 -#: website/public/get-started/index.html:862 website/public/get-started/index.html:895 -#: website/public/get-started/index.html:1047 website/public/get-started/index.html:1109 -#: website/public/get-started/index.html:1132 website/public/get-started/index.html:1156 -#: website/public/get-started/index.html:1204 website/public/get-started/index.html:1279 -#: website/public/get-started/index.html:1305 website/public/get-started/index.html:1322 -#: website/public/get-started/index.html:1565 website/public/get-started/index.html:1624 -#: website/public/get-started/index.html:1643 website/public/get-started/index.html:1665 -#: website/public/get-started/index.html:1708 website/public/get-started/index.html:1738 -#: website/public/get-started/index.html:1759 +#: website/public/get-started/index.html:271 website/public/get-started/index.html:294 +#: website/public/get-started/index.html:324 website/public/get-started/index.html:349 +#: website/public/get-started/index.html:372 website/public/get-started/index.html:387 +#: website/public/get-started/index.html:421 website/public/get-started/index.html:452 +#: website/public/get-started/index.html:466 website/public/get-started/index.html:484 +#: website/public/get-started/index.html:536 website/public/get-started/index.html:550 +#: website/public/get-started/index.html:582 website/public/get-started/index.html:611 +#: website/public/get-started/index.html:746 website/public/get-started/index.html:776 +#: website/public/get-started/index.html:801 website/public/get-started/index.html:816 +#: website/public/get-started/index.html:864 website/public/get-started/index.html:897 +#: website/public/get-started/index.html:1049 website/public/get-started/index.html:1111 +#: website/public/get-started/index.html:1134 website/public/get-started/index.html:1158 +#: website/public/get-started/index.html:1206 website/public/get-started/index.html:1281 +#: website/public/get-started/index.html:1307 website/public/get-started/index.html:1324 +#: website/public/get-started/index.html:1567 website/public/get-started/index.html:1626 +#: website/public/get-started/index.html:1645 website/public/get-started/index.html:1667 +#: website/public/get-started/index.html:1710 website/public/get-started/index.html:1740 +#: website/public/get-started/index.html:1761 msgctxt "page:get-started/index.html" msgid "Copy" msgstr "" #. {ph0}: node -v #. {ph1}: Node.js -#: website/public/get-started/index.html:281 +#: website/public/get-started/index.html:283 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4354,7 +4354,7 @@ msgid "" msgstr "" #. {ph0}: node -v -#: website/public/get-started/index.html:303 +#: website/public/get-started/index.html:305 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4363,7 +4363,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:307 +#: website/public/get-started/index.html:309 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Download the Node.js installer{ph1} if winget is unavailable." @@ -4374,7 +4374,7 @@ msgstr "" #. {ph2}: npx #. {ph3}: npx.cmd #. {ph4}: npm.cmd -#: website/public/get-started/index.html:313 +#: website/public/get-started/index.html:315 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4384,7 +4384,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:336 +#: website/public/get-started/index.html:338 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4392,13 +4392,13 @@ msgid "" "(.pkg){ph1}, open it and follow the installer. Then reopen Terminal." msgstr "" -#: website/public/get-started/index.html:343 +#: website/public/get-started/index.html:345 msgctxt "page:get-started/index.html" msgid "Already use Homebrew?" msgstr "" #. {ph0}: sudo apt install curl unzip -#: website/public/get-started/index.html:362 +#: website/public/get-started/index.html:364 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4406,14 +4406,14 @@ msgid "" "other distributions, use your package manager." msgstr "" -#: website/public/get-started/index.html:381 +#: website/public/get-started/index.html:383 msgctxt "page:get-started/index.html" msgid "Close the terminal, open it again, then:" msgstr "" #. {ph0}: nodejs #. {ph1}: node -v -#: website/public/get-started/index.html:398 +#: website/public/get-started/index.html:400 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4423,59 +4423,59 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:404 +#: website/public/get-started/index.html:406 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Prefer a regular installer? Download the LTS version from {ph0}nodejs.org{ph1}." msgstr "" -#: website/public/get-started/index.html:411 +#: website/public/get-started/index.html:413 msgctxt "page:get-started/index.html" msgid "Make a working folder for your agent" msgstr "" -#: website/public/get-started/index.html:412 +#: website/public/get-started/index.html:414 msgctxt "page:get-started/index.html" msgid "In your terminal, make a folder for the exercise, then move into it:" msgstr "" -#: website/public/get-started/index.html:431 +#: website/public/get-started/index.html:433 msgctxt "page:get-started/index.html" msgid "" "Keep this terminal open for the next step. If you already have a working folder, open " "it instead." msgstr "" -#: website/public/get-started/index.html:438 +#: website/public/get-started/index.html:440 msgctxt "page:get-started/index.html" msgid "2. Choose a coding agent" msgstr "" -#: website/public/get-started/index.html:439 +#: website/public/get-started/index.html:441 msgctxt "page:get-started/index.html" msgid "" "Your agent is the AI you talk to. REA supplies the inspection tools it uses. Pick one " "client below; open its instructions if you haven't used it before." msgstr "" -#: website/public/get-started/index.html:445 +#: website/public/get-started/index.html:447 msgctxt "page:get-started/index.html" msgid "Codex · use your ChatGPT account" msgstr "" -#: website/public/get-started/index.html:446 +#: website/public/get-started/index.html:448 msgctxt "page:get-started/index.html" msgid "Install Codex using the command for your operating system:" msgstr "" -#: website/public/get-started/index.html:475 +#: website/public/get-started/index.html:477 msgctxt "page:get-started/index.html" msgid "" "After installation, reopen your terminal and return to the working folder. Then start " "Codex:" msgstr "" -#: website/public/get-started/index.html:493 +#: website/public/get-started/index.html:495 msgctxt "page:get-started/index.html" msgid "" "Choose “Sign in with ChatGPT”, complete the browser sign-in, then return to the " @@ -4484,28 +4484,28 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:498 +#: website/public/get-started/index.html:500 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Codex installation and sign-in{ph1}" msgstr "" -#: website/public/get-started/index.html:505 +#: website/public/get-started/index.html:507 msgctxt "page:get-started/index.html" msgid "Cursor, Windsurf or VS Code · use an editor" msgstr "" -#: website/public/get-started/index.html:507 +#: website/public/get-started/index.html:509 msgctxt "page:get-started/index.html" msgid "Install the editor for your operating system and sign in." msgstr "" -#: website/public/get-started/index.html:510 +#: website/public/get-started/index.html:512 msgctxt "page:get-started/index.html" msgid "Open the rea-work folder you made in step 1." msgstr "" -#: website/public/get-started/index.html:511 +#: website/public/get-started/index.html:513 msgctxt "page:get-started/index.html" msgid "" "Open its AI chat and choose Agent mode. In Windsurf or Devin Desktop, open the agent " @@ -4518,7 +4518,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/get-started/index.html:517 +#: website/public/get-started/index.html:519 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4526,18 +4526,18 @@ msgid "" "Copilot setup{ph5}" msgstr "" -#: website/public/get-started/index.html:529 +#: website/public/get-started/index.html:531 msgctxt "page:get-started/index.html" msgid "Claude Code · use your Claude account" msgstr "" -#: website/public/get-started/index.html:530 +#: website/public/get-started/index.html:532 msgctxt "page:get-started/index.html" msgid "Install using the command for your operating system:" msgstr "" #. {ph0}: claude -#: website/public/get-started/index.html:559 +#: website/public/get-started/index.html:561 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4547,18 +4547,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:564 +#: website/public/get-started/index.html:566 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Claude Code installation and account options{ph1}" msgstr "" -#: website/public/get-started/index.html:571 +#: website/public/get-started/index.html:573 msgctxt "page:get-started/index.html" msgid "Claude Desktop · use a desktop chat" msgstr "" -#: website/public/get-started/index.html:572 +#: website/public/get-started/index.html:574 msgctxt "page:get-started/index.html" msgid "" "Install Claude Desktop on Windows or macOS and sign in. Quit it completely, then run " @@ -4567,7 +4567,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:591 +#: website/public/get-started/index.html:593 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4580,20 +4580,20 @@ msgstr "" #. {ph2}: #. {ph3}: -#: website/public/get-started/index.html:595 +#: website/public/get-started/index.html:597 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Download Claude Desktop{ph1} · {ph2}Claude Desktop connection details{ph3}" msgstr "" -#: website/public/get-started/index.html:605 +#: website/public/get-started/index.html:607 msgctxt "page:get-started/index.html" msgid "OpenCode · choose an AI model" msgstr "" #. {ph0}: opencode #. {ph1}: /connect -#: website/public/get-started/index.html:620 +#: website/public/get-started/index.html:622 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4603,19 +4603,19 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:625 +#: website/public/get-started/index.html:627 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}OpenCode installation and model setup{ph1}" msgstr "" -#: website/public/get-started/index.html:632 +#: website/public/get-started/index.html:634 msgctxt "page:get-started/index.html" msgid "All supported clients and setup IDs" msgstr "" #. {ph0}: --client -#: website/public/get-started/index.html:633 +#: website/public/get-started/index.html:635 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4623,12 +4623,12 @@ msgid "" "a client explicitly." msgstr "" -#: website/public/get-started/index.html:641 +#: website/public/get-started/index.html:643 msgctxt "page:get-started/index.html" msgid "Client" msgstr "" -#: website/public/get-started/index.html:642 +#: website/public/get-started/index.html:644 msgctxt "page:get-started/index.html" msgid "Setup ID" msgstr "" @@ -4638,7 +4638,7 @@ msgstr "" #. {ph2}: trae #. {ph3}: zcode #. {ph4}: dsh -#: website/public/get-started/index.html:717 +#: website/public/get-started/index.html:719 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4654,20 +4654,20 @@ msgstr "" #. href="https://github.com/morluto/rea/blob/main/docs/installation.md#released-package- #. and-main" > #. {ph3}: -#: website/public/get-started/index.html:724 +#: website/public/get-started/index.html:726 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Client configuration and troubleshooting{ph1} · {ph2}Release availability{ph3}" msgstr "" -#: website/public/get-started/index.html:736 +#: website/public/get-started/index.html:738 msgctxt "page:get-started/index.html" msgid "Grok Bot · connect on its hosted computer" msgstr "" #. {ph0}: rea -#: website/public/get-started/index.html:737 +#: website/public/get-started/index.html:739 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4678,18 +4678,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:755 +#: website/public/get-started/index.html:757 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Grok Bot connector instructions{ph1}" msgstr "" -#: website/public/get-started/index.html:765 +#: website/public/get-started/index.html:767 msgctxt "page:get-started/index.html" msgid "3. Connect REA" msgstr "" -#: website/public/get-started/index.html:766 +#: website/public/get-started/index.html:768 msgctxt "page:get-started/index.html" msgid "Copy this into your coding agent:" msgstr "" @@ -4702,7 +4702,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/get-started/index.html:769 +#: website/public/get-started/index.html:771 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" @@ -4715,7 +4715,7 @@ msgstr "" #. {ph4}: #. {ph5}: -#: website/public/get-started/index.html:783 +#: website/public/get-started/index.html:785 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4723,18 +4723,18 @@ msgid "" "the setup plan for approval, then verify the installation.{ph4}{ph5}{ph6}" msgstr "" -#: website/public/get-started/index.html:795 +#: website/public/get-started/index.html:797 msgctxt "page:get-started/index.html" msgid "Or run setup yourself" msgstr "" -#: website/public/get-started/index.html:810 +#: website/public/get-started/index.html:812 msgctxt "page:get-started/index.html" msgid "For one specific client, add its setup ID:" msgstr "" #. {ph0}: y -#: website/public/get-started/index.html:825 +#: website/public/get-started/index.html:827 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4742,7 +4742,7 @@ msgid "" " use the arrow keys to move, Space to select your client and Enter to continue." msgstr "" -#: website/public/get-started/index.html:831 +#: website/public/get-started/index.html:833 msgctxt "page:get-started/index.html" msgid "" "Choose your client and review the setup plan. REA adds its MCP connection and the " @@ -4750,21 +4750,21 @@ msgid "" "before applying the changes." msgstr "" -#: website/public/get-started/index.html:836 +#: website/public/get-started/index.html:838 msgctxt "page:get-started/index.html" msgid "" "MCP is the connection that lets your agent call REA. The skill gives it a workflow for" " investigating software." msgstr "" -#: website/public/get-started/index.html:840 +#: website/public/get-started/index.html:842 msgctxt "page:get-started/index.html" msgid "" "For the first exercise, you can skip the optional Hopper installation. Restart your " "client when setup finishes." msgstr "" -#: website/public/get-started/index.html:845 +#: website/public/get-started/index.html:847 msgctxt "page:get-started/index.html" msgid "How do I restart my client?" msgstr "" @@ -4773,7 +4773,7 @@ msgstr "" #. {ph1}: #. {ph2}: ⌘ #. {ph3}: Q -#: website/public/get-started/index.html:846 +#: website/public/get-started/index.html:848 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4784,7 +4784,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:853 +#: website/public/get-started/index.html:855 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4794,7 +4794,7 @@ msgstr "" #. {ph0}: codex #. {ph1}: "healthy": true -#: website/public/get-started/index.html:873 +#: website/public/get-started/index.html:875 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4802,19 +4802,19 @@ msgid "" "your agent:" msgstr "" -#: website/public/get-started/index.html:879 +#: website/public/get-started/index.html:881 msgctxt "page:get-started/index.html" msgid "Check that REA is connected and show me which REA tools you can use." msgstr "" -#: website/public/get-started/index.html:886 +#: website/public/get-started/index.html:888 msgctxt "page:get-started/index.html" msgid "4. Try your first investigation" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:887 +#: website/public/get-started/index.html:889 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4822,7 +4822,7 @@ msgid "" "agent can inspect its code without installing or launching Electron." msgstr "" -#: website/public/get-started/index.html:894 +#: website/public/get-started/index.html:896 msgctxt "page:get-started/index.html" msgid "Your coding agent" msgstr "" @@ -4835,7 +4835,7 @@ msgstr "" #. {ph5}: #. {ph6}: -#: website/public/get-started/index.html:904 +#: website/public/get-started/index.html:906 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4844,7 +4844,7 @@ msgid "" " it contains, and the relevant files and lines.{ph5}{ph6}{ph7}" msgstr "" -#: website/public/get-started/index.html:918 +#: website/public/get-started/index.html:920 msgctxt "page:get-started/index.html" msgid "Look for a short explanation with file and line references:" msgstr "" @@ -4853,7 +4853,7 @@ msgstr "" #. {ph1}: notes.csv #. {ph2}: id #. {ph3}: title -#: website/public/get-started/index.html:920 +#: website/public/get-started/index.html:922 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4863,13 +4863,13 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:927 +#: website/public/get-started/index.html:929 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Check a prediction in the guided exercise →{ph1}" msgstr "" -#: website/public/get-started/index.html:933 +#: website/public/get-started/index.html:935 msgctxt "page:get-started/index.html" msgid "Download the example yourself, or use your own app" msgstr "" @@ -4877,14 +4877,14 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:936 +#: website/public/get-started/index.html:938 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Download example ZIP{ph1}" msgstr "" #. {ph0}: notes-example -#: website/public/get-started/index.html:944 +#: website/public/get-started/index.html:946 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4893,7 +4893,7 @@ msgid "" msgstr "" #. {ph0}: /absolute/path/to/app -#: website/public/get-started/index.html:950 +#: website/public/get-started/index.html:952 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4901,7 +4901,7 @@ msgid "" "files and lines." msgstr "" -#: website/public/get-started/index.html:957 +#: website/public/get-started/index.html:959 msgctxt "page:get-started/index.html" msgid "How do I get a folder's full path?" msgstr "" @@ -4910,7 +4910,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/get-started/index.html:959 +#: website/public/get-started/index.html:961 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4922,7 +4922,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/get-started/index.html:964 +#: website/public/get-started/index.html:966 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -4932,90 +4932,90 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:968 +#: website/public/get-started/index.html:970 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Any system:{ph1} drag the folder into a terminal window and its path appears." msgstr "" -#: website/public/get-started/index.html:973 website/public/get-started/index.html:1731 +#: website/public/get-started/index.html:975 website/public/get-started/index.html:1733 msgctxt "page:get-started/index.html" msgid "In a terminal, put quotes around a path that contains spaces." msgstr "" -#: website/public/get-started/index.html:980 +#: website/public/get-started/index.html:982 msgctxt "page:get-started/index.html" msgid "Analyze another kind of software" msgstr "" -#: website/public/get-started/index.html:981 +#: website/public/get-started/index.html:983 msgctxt "page:get-started/index.html" msgid "" "Choose the section for your target. A provider is the local analysis tool REA uses for" " that kind of software." msgstr "" -#: website/public/get-started/index.html:986 +#: website/public/get-started/index.html:988 msgctxt "page:get-started/index.html" msgid "Native executables and libraries · Hopper, Ghidra or IDA" msgstr "" -#: website/public/get-started/index.html:989 +#: website/public/get-started/index.html:991 msgctxt "page:get-started/index.html" msgid "" "Install one analysis tool on the computer running REA. The host is your operating " "system; the target is the program you want to inspect." msgstr "" -#: website/public/get-started/index.html:998 +#: website/public/get-started/index.html:1000 msgctxt "page:get-started/index.html" msgid "Provider" msgstr "" -#: website/public/get-started/index.html:1007 +#: website/public/get-started/index.html:1009 msgctxt "page:get-started/index.html" msgid "Unavailable" msgstr "" -#: website/public/get-started/index.html:1009 +#: website/public/get-started/index.html:1011 msgctxt "page:get-started/index.html" msgid "Supported distributions" msgstr "" -#: website/public/get-started/index.html:1013 +#: website/public/get-started/index.html:1015 msgctxt "page:get-started/index.html" msgid "x64 · experimental" msgstr "" -#: website/public/get-started/index.html:1019 +#: website/public/get-started/index.html:1021 msgctxt "page:get-started/index.html" msgid "Verified profiles" msgstr "" -#: website/public/get-started/index.html:1020 +#: website/public/get-started/index.html:1022 msgctxt "page:get-started/index.html" msgid "Verified headless profile" msgstr "" -#: website/public/get-started/index.html:1021 +#: website/public/get-started/index.html:1023 msgctxt "page:get-started/index.html" msgid "See provider guide" msgstr "" -#: website/public/get-started/index.html:1027 +#: website/public/get-started/index.html:1029 msgctxt "page:get-started/index.html" msgid "Hopper · let setup install or connect it" msgstr "" -#: website/public/get-started/index.html:1028 +#: website/public/get-started/index.html:1030 msgctxt "page:get-started/index.html" msgid "" "Connect Hopper on macOS or Linux. Run the setup command above; it detects an existing " "installation or offers an installation plan for your approval." msgstr "" -#: website/public/get-started/index.html:1033 +#: website/public/get-started/index.html:1035 msgctxt "page:get-started/index.html" msgid "" "Choose Hopper in setup and review its separate installation plan. On macOS, choose " @@ -5023,14 +5023,14 @@ msgid "" "the supported demo and its private display." msgstr "" -#: website/public/get-started/index.html:1039 +#: website/public/get-started/index.html:1041 msgctxt "page:get-started/index.html" msgid "" "Linux hosts: Ubuntu 24.04+, Fedora 41+, Nobara 44+, Arch Linux, CachyOS or Omarchy. " "Hopper is commercial software; its demo has vendor-defined limits." msgstr "" -#: website/public/get-started/index.html:1058 +#: website/public/get-started/index.html:1060 msgctxt "page:get-started/index.html" msgid "" "If macOS asks for Automation permission, allow the app that starts REA in System " @@ -5040,18 +5040,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:1063 +#: website/public/get-started/index.html:1065 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Hopper setup and troubleshooting{ph1}" msgstr "" -#: website/public/get-started/index.html:1071 +#: website/public/get-started/index.html:1073 msgctxt "page:get-started/index.html" msgid "Ghidra · install the free analysis tool and Java" msgstr "" -#: website/public/get-started/index.html:1075 +#: website/public/get-started/index.html:1077 msgctxt "page:get-started/index.html" msgid "" "Install a 64-bit JDK 21 or newer, including the Java compiler. Choose the package " @@ -5059,7 +5059,7 @@ msgid "" msgstr "" #. {ph0}: ghidra_…_PUBLIC_….zip -#: website/public/get-started/index.html:1080 +#: website/public/get-started/index.html:1082 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5070,7 +5070,7 @@ msgstr "" #. {ph0}: ghidraRun #. {ph1}: ghidraRun.bat #. {ph2}: GHIDRA_INSTALL_DIR -#: website/public/get-started/index.html:1085 +#: website/public/get-started/index.html:1087 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Find the extracted folder containing {ph0} or {ph1}. Use that folder for {ph2}." @@ -5082,7 +5082,7 @@ msgstr "" #. href="https://github.com/NationalSecurityAgency/ghidra/releases/tag/Ghidra_12.1.4_build" #. > #. {ph3}: -#: website/public/get-started/index.html:1091 +#: website/public/get-started/index.html:1093 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Download a JDK{ph1} · {ph2}Download Ghidra 12.1.4{ph3}" @@ -5090,7 +5090,7 @@ msgstr "" #. {ph0}: java.home #. {ph1}: JAVA_HOME -#: website/public/get-started/index.html:1101 +#: website/public/get-started/index.html:1103 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5098,12 +5098,12 @@ msgid "" "confirms the compiler is installed:" msgstr "" -#: website/public/get-started/index.html:1122 +#: website/public/get-started/index.html:1124 msgctxt "page:get-started/index.html" msgid "Connect Ghidra on Windows" msgstr "" -#: website/public/get-started/index.html:1123 +#: website/public/get-started/index.html:1125 msgctxt "page:get-started/index.html" msgid "" "Windows x64 has experimental, read-only support for native x86 and x64 PE applications" @@ -5111,29 +5111,29 @@ msgid "" " 64-bit JDK 21 or newer:" msgstr "" -#: website/public/get-started/index.html:1146 +#: website/public/get-started/index.html:1148 msgctxt "page:get-started/index.html" msgid "Replace the two paths with your installations, then review setup's plan." msgstr "" -#: website/public/get-started/index.html:1152 +#: website/public/get-started/index.html:1154 msgctxt "page:get-started/index.html" msgid "Connect your Ghidra installation" msgstr "" -#: website/public/get-started/index.html:1168 +#: website/public/get-started/index.html:1170 msgctxt "page:get-started/index.html" msgid "" "Replace both paths with your existing installations. For a fresh macOS or Linux arm64 " "installation, build the native decompiler for your computer before continuing." msgstr "" -#: website/public/get-started/index.html:1174 +#: website/public/get-started/index.html:1176 msgctxt "page:get-started/index.html" msgid "Build Ghidra's native decompiler" msgstr "" -#: website/public/get-started/index.html:1175 +#: website/public/get-started/index.html:1177 msgctxt "page:get-started/index.html" msgid "" "On macOS, the build needs Xcode Command Line Tools, make and bison. Use the guide for " @@ -5144,7 +5144,7 @@ msgstr "" #. href="https://github.com/morluto/rea/blob/main/docs/installation.md#missing-macos- #. native-decompiler" > #. {ph1}: -#: website/public/get-started/index.html:1180 +#: website/public/get-started/index.html:1182 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}macOS · Intel{ph1}" @@ -5153,7 +5153,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:1186 +#: website/public/get-started/index.html:1188 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}macOS · Apple Silicon{ph1}" @@ -5163,18 +5163,18 @@ msgstr "" #. href="https://github.com/NationalSecurityAgency/ghidra/blob/Ghidra_12.1.4_build/GhidraDocs/GettingStarted.md#building- #. native-components" > #. {ph1}: -#: website/public/get-started/index.html:1192 +#: website/public/get-started/index.html:1194 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Linux arm64 · native build instructions{ph1}" msgstr "" -#: website/public/get-started/index.html:1200 +#: website/public/get-started/index.html:1202 msgctxt "page:get-started/index.html" msgid "Then check Ghidra and save its paths for your client:" msgstr "" -#: website/public/get-started/index.html:1217 +#: website/public/get-started/index.html:1219 msgctxt "page:get-started/index.html" msgid "" "Keep these commands in the same terminal session. Rerun setup after setting the paths," @@ -5186,19 +5186,19 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/get-started/index.html:1222 +#: website/public/get-started/index.html:1224 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "{ph0}Ghidra setup and architecture requirements{ph1} · {ph2}Windows Ghidra guide{ph3}" msgstr "" -#: website/public/get-started/index.html:1235 +#: website/public/get-started/index.html:1237 msgctxt "page:get-started/index.html" msgid "IDA · connect an existing installation" msgstr "" -#: website/public/get-started/index.html:1236 +#: website/public/get-started/index.html:1238 msgctxt "page:get-started/index.html" msgid "" "Use the IDA provider guide to prepare an upstream MCP registration. Choose an attached" @@ -5206,7 +5206,7 @@ msgid "" "database." msgstr "" -#: website/public/get-started/index.html:1241 +#: website/public/get-started/index.html:1243 msgctxt "page:get-started/index.html" msgid "" "Verified profiles include the Windows legacy GUI and headless supervisor, plus a macOS" @@ -5218,7 +5218,7 @@ msgstr "" #. setup" > #. {ph1}: #. {ph2}: 6.4.0 -#: website/public/get-started/index.html:1247 +#: website/public/get-started/index.html:1249 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5229,21 +5229,21 @@ msgstr "" #. {ph0}: node scripts/rea.mjs doctor --provider ida --json #. {ph1}: node scripts/rea.mjs setup #. {ph2}: npx -#: website/public/get-started/index.html:1256 +#: website/public/get-started/index.html:1258 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" "From the built checkout, run {ph0} and {ph1} instead of the {ph2} commands below." msgstr "" -#: website/public/get-started/index.html:1263 +#: website/public/get-started/index.html:1265 msgctxt "page:get-started/index.html" msgid "Prepare the IDA registration file" msgstr "" #. {ph0}: ida-mcp.json #. {ph1}: .txt -#: website/public/get-started/index.html:1264 +#: website/public/get-started/index.html:1266 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5255,7 +5255,7 @@ msgstr "" #. {ph0}: idb_open #. {ph1}: idb_list #. {ph2}: idb_close -#: website/public/get-started/index.html:1271 +#: website/public/get-started/index.html:1273 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5266,7 +5266,7 @@ msgstr "" #. {ph0}: command #. {ph1}: args #. {ph2}: env -#: website/public/get-started/index.html:1294 +#: website/public/get-started/index.html:1296 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5275,7 +5275,7 @@ msgid "" "before asking REA to inspect it." msgstr "" -#: website/public/get-started/index.html:1336 +#: website/public/get-started/index.html:1338 msgctxt "page:get-started/index.html" msgid "" "Use the JSON registration file you prepared with the provider guide, then rerun setup " @@ -5284,13 +5284,13 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:1340 +#: website/public/get-started/index.html:1342 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}IDA profiles, registration examples and verified platforms{ph1}" msgstr "" -#: website/public/get-started/index.html:1348 +#: website/public/get-started/index.html:1350 msgctxt "page:get-started/index.html" msgid "" "Once connected, give your agent the original executable's full path and name your " @@ -5298,7 +5298,7 @@ msgid "" msgstr "" #. {ph0}: /absolute/path/to/program -#: website/public/get-started/index.html:1353 +#: website/public/get-started/index.html:1355 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5308,130 +5308,130 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:1360 +#: website/public/get-started/index.html:1362 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Follow a native analysis example{ph1}" msgstr "" -#: website/public/get-started/index.html:1365 +#: website/public/get-started/index.html:1367 msgctxt "page:get-started/index.html" msgid "Websites, Android, .NET, firmware and other targets" msgstr "" -#: website/public/get-started/index.html:1368 +#: website/public/get-started/index.html:1370 msgctxt "page:get-started/index.html" msgid "" "Open the guide for the target you have. Each guide gives the additional tools, " "supported hosts and first command." msgstr "" -#: website/public/get-started/index.html:1376 +#: website/public/get-started/index.html:1378 msgctxt "page:get-started/index.html" msgid "Target" msgstr "" -#: website/public/get-started/index.html:1377 +#: website/public/get-started/index.html:1379 msgctxt "page:get-started/index.html" msgid "Tools to prepare" msgstr "" -#: website/public/get-started/index.html:1378 +#: website/public/get-started/index.html:1380 msgctxt "page:get-started/index.html" msgid "Guide" msgstr "" -#: website/public/get-started/index.html:1383 +#: website/public/get-started/index.html:1385 msgctxt "page:get-started/index.html" msgid "JavaScript / Electron" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:1385 website/public/get-started/index.html:1390 -#: website/public/get-started/index.html:1395 website/public/get-started/index.html:1405 -#: website/public/get-started/index.html:1415 website/public/get-started/index.html:1425 -#: website/public/get-started/index.html:1435 website/public/get-started/index.html:1445 -#: website/public/get-started/index.html:1455 website/public/get-started/index.html:1465 -#: website/public/get-started/index.html:1475 website/public/get-started/index.html:1485 -#: website/public/get-started/index.html:1495 website/public/get-started/index.html:1505 -#: website/public/get-started/index.html:1515 website/public/get-started/index.html:1525 +#: website/public/get-started/index.html:1387 website/public/get-started/index.html:1392 +#: website/public/get-started/index.html:1397 website/public/get-started/index.html:1407 +#: website/public/get-started/index.html:1417 website/public/get-started/index.html:1427 +#: website/public/get-started/index.html:1437 website/public/get-started/index.html:1447 +#: website/public/get-started/index.html:1457 website/public/get-started/index.html:1467 +#: website/public/get-started/index.html:1477 website/public/get-started/index.html:1487 +#: website/public/get-started/index.html:1497 website/public/get-started/index.html:1507 +#: website/public/get-started/index.html:1517 website/public/get-started/index.html:1527 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Open guide{ph1}" msgstr "" -#: website/public/get-started/index.html:1388 +#: website/public/get-started/index.html:1390 msgctxt "page:get-started/index.html" msgid "Website" msgstr "" -#: website/public/get-started/index.html:1393 +#: website/public/get-started/index.html:1395 msgctxt "page:get-started/index.html" msgid ".NET / Flutter / packages" msgstr "" -#: website/public/get-started/index.html:1403 +#: website/public/get-started/index.html:1405 msgctxt "page:get-started/index.html" msgid "Android APK" msgstr "" -#: website/public/get-started/index.html:1413 +#: website/public/get-started/index.html:1415 msgctxt "page:get-started/index.html" msgid "Android device" msgstr "" -#: website/public/get-started/index.html:1423 +#: website/public/get-started/index.html:1425 msgctxt "page:get-started/index.html" msgid "Android resources" msgstr "" -#: website/public/get-started/index.html:1433 +#: website/public/get-started/index.html:1435 msgctxt "page:get-started/index.html" msgid "JEB project" msgstr "" -#: website/public/get-started/index.html:1443 +#: website/public/get-started/index.html:1445 msgctxt "page:get-started/index.html" msgid "Firmware" msgstr "" -#: website/public/get-started/index.html:1453 +#: website/public/get-started/index.html:1455 msgctxt "page:get-started/index.html" msgid "WASM" msgstr "" -#: website/public/get-started/index.html:1463 +#: website/public/get-started/index.html:1465 msgctxt "page:get-started/index.html" msgid "SQLite database" msgstr "" -#: website/public/get-started/index.html:1473 +#: website/public/get-started/index.html:1475 msgctxt "page:get-started/index.html" msgid "EVM bytecode" msgstr "" -#: website/public/get-started/index.html:1483 +#: website/public/get-started/index.html:1485 msgctxt "page:get-started/index.html" msgid "ELF / Linux crash" msgstr "" -#: website/public/get-started/index.html:1493 +#: website/public/get-started/index.html:1495 msgctxt "page:get-started/index.html" msgid "HAR / SAZ / mitmproxy" msgstr "" -#: website/public/get-started/index.html:1503 +#: website/public/get-started/index.html:1505 msgctxt "page:get-started/index.html" msgid "PCAP / PCAPNG" msgstr "" -#: website/public/get-started/index.html:1513 +#: website/public/get-started/index.html:1515 msgctxt "page:get-started/index.html" msgid "Logic signals" msgstr "" -#: website/public/get-started/index.html:1523 +#: website/public/get-started/index.html:1525 msgctxt "page:get-started/index.html" msgid "Process behavior" msgstr "" @@ -5445,7 +5445,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/get-started/index.html:1535 +#: website/public/get-started/index.html:1537 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5453,31 +5453,31 @@ msgid "" "{ph6}All investigation guides{ph7}" msgstr "" -#: website/public/get-started/index.html:1555 +#: website/public/get-started/index.html:1557 msgctxt "page:get-started/index.html" msgid "Use REA from a terminal" msgstr "" -#: website/public/get-started/index.html:1557 +#: website/public/get-started/index.html:1559 msgctxt "page:get-started/index.html" msgid "CLI commands, global installation and curl" msgstr "" -#: website/public/get-started/index.html:1558 +#: website/public/get-started/index.html:1560 msgctxt "page:get-started/index.html" msgid "" "Analyze a JavaScript or Electron application folder or ASAR archive without running " "the app:" msgstr "" -#: website/public/get-started/index.html:1564 +#: website/public/get-started/index.html:1566 msgctxt "page:get-started/index.html" msgid "Static application analysis" msgstr "" #. {ph0}: .asar #. {ph1}: "D:/apps/example" -#: website/public/get-started/index.html:1576 +#: website/public/get-started/index.html:1578 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5485,13 +5485,13 @@ msgid "" "such as {ph1} works here." msgstr "" -#: website/public/get-started/index.html:1582 +#: website/public/get-started/index.html:1584 msgctxt "page:get-started/index.html" msgid "Where do I find an app's .asar file?" msgstr "" #. {ph0}: resources -#: website/public/get-started/index.html:1583 +#: website/public/get-started/index.html:1585 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Electron apps usually keep it in a {ph0} folder:" @@ -5501,7 +5501,7 @@ msgstr "" #. {ph1}: #. {ph2}: C:\Users\<you>\AppData\Local\Programs\<App>\resources\app.asar -#: website/public/get-started/index.html:1588 +#: website/public/get-started/index.html:1590 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Windows:{ph1} {ph2}" @@ -5512,7 +5512,7 @@ msgstr "" #. {ph2}: /Applications/<App>.app/Contents/Resources/app.asar #. {ph3}: #. {ph4}: -#: website/public/get-started/index.html:1594 +#: website/public/get-started/index.html:1596 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5523,20 +5523,20 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: /opt/<App>/resources/app.asar -#: website/public/get-started/index.html:1602 +#: website/public/get-started/index.html:1604 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Linux:{ph1} often {ph2}" msgstr "" #. {ph0}: app.asar -#: website/public/get-started/index.html:1607 +#: website/public/get-started/index.html:1609 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Some apps install elsewhere. Search the app's folder for {ph0}." msgstr "" -#: website/public/get-started/index.html:1612 +#: website/public/get-started/index.html:1614 msgctxt "page:get-started/index.html" msgid "" "The result identifies the app, shows connections between modules and gives their " @@ -5544,27 +5544,27 @@ msgid "" msgstr "" #. {ph0}: rea -#: website/public/get-started/index.html:1617 +#: website/public/get-started/index.html:1619 #, python-brace-format msgctxt "page:get-started/index.html" msgid "If you'd like a permanent {ph0} command in your shell:" msgstr "" -#: website/public/get-started/index.html:1623 +#: website/public/get-started/index.html:1625 msgctxt "page:get-started/index.html" msgid "Install the CLI" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/get-started/index.html:1635 +#: website/public/get-started/index.html:1637 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Continue with the JavaScript application guide{ph1}" msgstr "" #. {ph0}: main -#: website/public/get-started/index.html:1654 +#: website/public/get-started/index.html:1656 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5572,13 +5572,13 @@ msgid "" "must be configured first." msgstr "" -#: website/public/get-started/index.html:1658 +#: website/public/get-started/index.html:1660 msgctxt "page:get-started/index.html" msgid "On macOS or Linux, you can also use the curl installer after preparing Node.js:" msgstr "" #. {ph0}: rea setup -#: website/public/get-started/index.html:1676 +#: website/public/get-started/index.html:1678 #, python-brace-format msgctxt "page:get-started/index.html" msgid "Follow the setup prompts to connect your agent. If they don't appear, run {ph0}." @@ -5586,7 +5586,7 @@ msgstr "" #. {ph0}: rea #. {ph1}: "$HOME/.local/bin/rea" setup -#: website/public/get-started/index.html:1680 +#: website/public/get-started/index.html:1682 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5594,18 +5594,18 @@ msgid "" "Linux, the default setup command is {ph1}." msgstr "" -#: website/public/get-started/index.html:1689 +#: website/public/get-started/index.html:1691 msgctxt "page:get-started/index.html" msgid "Getting help" msgstr "" -#: website/public/get-started/index.html:1691 +#: website/public/get-started/index.html:1693 msgctxt "page:get-started/index.html" msgid "If your agent doesn't see REA" msgstr "" #. {ph0}: doctor -#: website/public/get-started/index.html:1692 +#: website/public/get-started/index.html:1694 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5613,39 +5613,39 @@ msgid "" "Codex:" msgstr "" -#: website/public/get-started/index.html:1696 +#: website/public/get-started/index.html:1698 msgctxt "page:get-started/index.html" msgid "" "Use the client check in step 3 with your setup ID. In editor clients, enable REA in " "MCP settings and allow its tools in the agent chat." msgstr "" -#: website/public/get-started/index.html:1703 +#: website/public/get-started/index.html:1705 msgctxt "page:get-started/index.html" msgid "If a provider needs attention" msgstr "" -#: website/public/get-started/index.html:1704 +#: website/public/get-started/index.html:1706 msgctxt "page:get-started/index.html" msgid "Check the provider you're using. For Ghidra:" msgstr "" -#: website/public/get-started/index.html:1707 +#: website/public/get-started/index.html:1709 msgctxt "page:get-started/index.html" msgid "Check one provider" msgstr "" -#: website/public/get-started/index.html:1719 +#: website/public/get-started/index.html:1721 msgctxt "page:get-started/index.html" msgid "The report gives the failed check and a suggested next step." msgstr "" -#: website/public/get-started/index.html:1724 +#: website/public/get-started/index.html:1726 msgctxt "page:get-started/index.html" msgid "Windows, WSL and paths with spaces" msgstr "" -#: website/public/get-started/index.html:1725 +#: website/public/get-started/index.html:1727 msgctxt "page:get-started/index.html" msgid "" "Use Windows PowerShell for Windows clients and analysis tools. If your agent runs " @@ -5653,17 +5653,17 @@ msgid "" "there. Headless providers run on the same host as REA." msgstr "" -#: website/public/get-started/index.html:1734 +#: website/public/get-started/index.html:1736 msgctxt "page:get-started/index.html" msgid "Windows setup command:" msgstr "" -#: website/public/get-started/index.html:1751 +#: website/public/get-started/index.html:1753 msgctxt "page:get-started/index.html" msgid "Update or remove REA" msgstr "" -#: website/public/get-started/index.html:1752 +#: website/public/get-started/index.html:1754 msgctxt "page:get-started/index.html" msgid "" "To refresh your agent connection, run the latest setup command again, review its plan " @@ -5672,7 +5672,7 @@ msgstr "" #. {ph0}: rea update #. {ph1}: npx rea-agents@latest uninstall -#: website/public/get-started/index.html:1770 +#: website/public/get-started/index.html:1772 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5684,7 +5684,7 @@ msgstr "" #. href="https://github.com/morluto/rea/blob/main/docs/installation.md#diagnose-update- #. and-remove" > #. {ph1}: -#: website/public/get-started/index.html:1776 +#: website/public/get-started/index.html:1778 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}Update and uninstall details{ph1}" @@ -5694,7 +5694,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/get-started/index.html:1784 +#: website/public/get-started/index.html:1786 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}REA FAQ{ph1}{ph2}Quick answers on updates, agents and analysis.{ph3}" @@ -5704,7 +5704,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/get-started/index.html:1788 +#: website/public/get-started/index.html:1790 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5716,7 +5716,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/get-started/index.html:1795 +#: website/public/get-started/index.html:1797 #, python-brace-format msgctxt "page:get-started/index.html" msgid "" @@ -5727,7 +5727,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/get-started/index.html:1799 +#: website/public/get-started/index.html:1801 #, python-brace-format msgctxt "page:get-started/index.html" msgid "{ph0}REA community{ph1}{ph2}Questions, investigations and work in progress.{ph3}" @@ -5745,88 +5745,88 @@ msgid "" "the terminal. Setup, first questions and native provider guides." msgstr "" -#: website/public/get-started/index.html:223 +#: website/public/get-started/index.html:225 msgctxt "page:get-started/index.html" msgid "REA getting started guide" msgstr "" -#: website/public/get-started/index.html:269 +#: website/public/get-started/index.html:271 msgctxt "page:get-started/index.html" msgid "Copy Node.js version check" msgstr "" -#: website/public/get-started/index.html:292 +#: website/public/get-started/index.html:294 msgctxt "page:get-started/index.html" msgid "Copy Node.js installation command for Windows" msgstr "" -#: website/public/get-started/index.html:322 +#: website/public/get-started/index.html:324 msgctxt "page:get-started/index.html" msgid "Copy Windows REA setup command" msgstr "" -#: website/public/get-started/index.html:347 +#: website/public/get-started/index.html:349 msgctxt "page:get-started/index.html" msgid "Copy Homebrew Node.js installation command" msgstr "" -#: website/public/get-started/index.html:370 +#: website/public/get-started/index.html:372 msgctxt "page:get-started/index.html" msgid "Copy fnm installation command for Linux" msgstr "" -#: website/public/get-started/index.html:385 +#: website/public/get-started/index.html:387 msgctxt "page:get-started/index.html" msgid "Copy Node.js 24 commands for Linux" msgstr "" -#: website/public/get-started/index.html:419 website/public/get-started/index.html:450 -#: website/public/get-started/index.html:464 website/public/get-started/index.html:482 -#: website/public/get-started/index.html:534 website/public/get-started/index.html:548 -#: website/public/get-started/index.html:580 website/public/get-started/index.html:609 -#: website/public/get-started/index.html:744 website/public/get-started/index.html:799 -#: website/public/get-started/index.html:814 website/public/get-started/index.html:862 -#: website/public/get-started/index.html:1047 website/public/get-started/index.html:1109 -#: website/public/get-started/index.html:1132 website/public/get-started/index.html:1156 -#: website/public/get-started/index.html:1204 website/public/get-started/index.html:1279 -#: website/public/get-started/index.html:1305 website/public/get-started/index.html:1322 -#: website/public/get-started/index.html:1643 website/public/get-started/index.html:1665 -#: website/public/get-started/index.html:1738 website/public/get-started/index.html:1759 +#: website/public/get-started/index.html:421 website/public/get-started/index.html:452 +#: website/public/get-started/index.html:466 website/public/get-started/index.html:484 +#: website/public/get-started/index.html:536 website/public/get-started/index.html:550 +#: website/public/get-started/index.html:582 website/public/get-started/index.html:611 +#: website/public/get-started/index.html:746 website/public/get-started/index.html:801 +#: website/public/get-started/index.html:816 website/public/get-started/index.html:864 +#: website/public/get-started/index.html:1049 website/public/get-started/index.html:1111 +#: website/public/get-started/index.html:1134 website/public/get-started/index.html:1158 +#: website/public/get-started/index.html:1206 website/public/get-started/index.html:1281 +#: website/public/get-started/index.html:1307 website/public/get-started/index.html:1324 +#: website/public/get-started/index.html:1645 website/public/get-started/index.html:1667 +#: website/public/get-started/index.html:1740 website/public/get-started/index.html:1761 msgctxt "page:get-started/index.html" msgid "Copy command" msgstr "" -#: website/public/get-started/index.html:774 +#: website/public/get-started/index.html:776 msgctxt "page:get-started/index.html" msgid "Copy REA installation prompt" msgstr "" -#: website/public/get-started/index.html:895 +#: website/public/get-started/index.html:897 msgctxt "page:get-started/index.html" msgid "Copy Notes investigation prompt" msgstr "" -#: website/public/get-started/index.html:1565 +#: website/public/get-started/index.html:1567 msgctxt "page:get-started/index.html" msgid "Copy JavaScript analysis command" msgstr "" -#: website/public/get-started/index.html:1624 +#: website/public/get-started/index.html:1626 msgctxt "page:get-started/index.html" msgid "Copy CLI installation command" msgstr "" -#: website/public/get-started/index.html:1708 +#: website/public/get-started/index.html:1710 msgctxt "page:get-started/index.html" msgid "Copy provider diagnosis command" msgstr "" -#: website/public/get-started/index.html:1823 +#: website/public/get-started/index.html:1825 msgctxt "page:get-started/index.html" msgid "Back to top" msgstr "" -#: website/public/guides/browser/index.html:107 +#: website/public/guides/browser/index.html:109 msgctxt "page:guides/browser/index.html" msgid "Skip to content" msgstr "" @@ -5835,34 +5835,34 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/guides/browser/index.html:199 +#: website/public/guides/browser/index.html:201 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Home{ph1} / {ph2}Guides{ph3} / Browser observation" msgstr "" #. {ph0}:
-#: website/public/guides/browser/index.html:203 +#: website/public/guides/browser/index.html:205 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "See what happens{ph0}when you click." msgstr "" -#: website/public/guides/browser/index.html:204 +#: website/public/guides/browser/index.html:206 msgctxt "page:guides/browser/index.html" msgid "" "Use a small browser app to connect an action, its network request and the JavaScript " "that builds a download." msgstr "" -#: website/public/guides/browser/index.html:211 +#: website/public/guides/browser/index.html:213 msgctxt "page:guides/browser/index.html" msgid "In this guide" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/browser/index.html:213 +#: website/public/guides/browser/index.html:215 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}The example{ph1}" @@ -5870,7 +5870,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/browser/index.html:214 +#: website/public/guides/browser/index.html:216 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Open the browser{ph1}" @@ -5878,7 +5878,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/browser/index.html:215 +#: website/public/guides/browser/index.html:217 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Ask your agent{ph1}" @@ -5886,7 +5886,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/browser/index.html:216 +#: website/public/guides/browser/index.html:218 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Capture from CLI{ph1}" @@ -5894,13 +5894,13 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/browser/index.html:217 +#: website/public/guides/browser/index.html:219 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Read the request and script{ph1}" msgstr "" -#: website/public/guides/browser/index.html:222 +#: website/public/guides/browser/index.html:224 msgctxt "page:guides/browser/index.html" msgid "What happens when you click Export?" msgstr "" @@ -5910,7 +5910,7 @@ msgstr "" #. {ph2}: #. {ph3}: #. {ph4}: notes.json -#: website/public/guides/browser/index.html:223 +#: website/public/guides/browser/index.html:225 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -5918,7 +5918,7 @@ msgid "" "loads {ph4}, formats the two notes as CSV, and starts a download." msgstr "" -#: website/public/guides/browser/index.html:231 +#: website/public/guides/browser/index.html:233 msgctxt "page:guides/browser/index.html" msgid "From the click to the CSV download" msgstr "" @@ -5929,7 +5929,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/guides/browser/index.html:233 +#: website/public/guides/browser/index.html:235 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -5943,7 +5943,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/guides/browser/index.html:241 +#: website/public/guides/browser/index.html:243 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -5959,7 +5959,7 @@ msgstr "" #. {ph5}: fetch("./notes.json") #. {ph6}: export.js #. {ph7}: -#: website/public/guides/browser/index.html:249 +#: website/public/guides/browser/index.html:251 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -5967,52 +5967,52 @@ msgid "" "request to {ph5} in {ph6}.{ph7}" msgstr "" -#: website/public/guides/browser/index.html:262 +#: website/public/guides/browser/index.html:264 msgctxt "page:guides/browser/index.html" msgid "Start the capture before clicking Export notes." msgstr "" -#: website/public/guides/browser/index.html:268 +#: website/public/guides/browser/index.html:270 msgctxt "page:guides/browser/index.html" msgid "Open Chrome with remote debugging" msgstr "" -#: website/public/guides/browser/index.html:269 +#: website/public/guides/browser/index.html:271 msgctxt "page:guides/browser/index.html" msgid "" "Open the hosted Notes example with a separate browser profile and a local debugging " "port. On Linux:" msgstr "" -#: website/public/guides/browser/index.html:275 +#: website/public/guides/browser/index.html:277 msgctxt "page:guides/browser/index.html" msgid "Start the example browser" msgstr "" -#: website/public/guides/browser/index.html:276 -#: website/public/guides/browser/index.html:308 -#: website/public/guides/browser/index.html:342 -#: website/public/guides/browser/index.html:361 -#: website/public/guides/browser/index.html:426 +#: website/public/guides/browser/index.html:278 +#: website/public/guides/browser/index.html:310 +#: website/public/guides/browser/index.html:344 +#: website/public/guides/browser/index.html:363 +#: website/public/guides/browser/index.html:428 msgctxt "page:guides/browser/index.html" msgid "Copy" msgstr "" -#: website/public/guides/browser/index.html:290 +#: website/public/guides/browser/index.html:292 msgctxt "page:guides/browser/index.html" msgid "" "Use your installed browser's executable path on macOS or Windows. You can replace the " "page URL with another page you want to inspect." msgstr "" -#: website/public/guides/browser/index.html:295 +#: website/public/guides/browser/index.html:297 msgctxt "page:guides/browser/index.html" msgid "" "REA connects to this existing browser. You keep control of the page, perform the " "action, and close the browser when finished." msgstr "" -#: website/public/guides/browser/index.html:301 +#: website/public/guides/browser/index.html:303 msgctxt "page:guides/browser/index.html" msgid "Ask your agent to watch one action" msgstr "" @@ -6025,7 +6025,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/guides/browser/index.html:304 +#: website/public/guides/browser/index.html:306 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" @@ -6037,7 +6037,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/guides/browser/index.html:317 +#: website/public/guides/browser/index.html:319 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -6046,7 +6046,7 @@ msgid "" msgstr "" #. {ph0}: http://127.0.0.1:9222 -#: website/public/guides/browser/index.html:325 +#: website/public/guides/browser/index.html:327 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -6054,30 +6054,30 @@ msgid "" "it start the capture before you click." msgstr "" -#: website/public/guides/browser/index.html:330 +#: website/public/guides/browser/index.html:332 msgctxt "page:guides/browser/index.html" msgid "" "Your agent discovers the page target, starts an observation window, and reads the " "resulting evidence. It can then inspect the script behind the export." msgstr "" -#: website/public/guides/browser/index.html:337 +#: website/public/guides/browser/index.html:339 msgctxt "page:guides/browser/index.html" msgid "Or capture from the terminal" msgstr "" -#: website/public/guides/browser/index.html:338 +#: website/public/guides/browser/index.html:340 msgctxt "page:guides/browser/index.html" msgid "Find the page's target ID:" msgstr "" -#: website/public/guides/browser/index.html:341 +#: website/public/guides/browser/index.html:343 msgctxt "page:guides/browser/index.html" msgid "Find the page" msgstr "" #. {ph0}: TARGET_ID -#: website/public/guides/browser/index.html:354 +#: website/public/guides/browser/index.html:356 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -6085,14 +6085,14 @@ msgid "" "run:" msgstr "" -#: website/public/guides/browser/index.html:360 +#: website/public/guides/browser/index.html:362 msgctxt "page:guides/browser/index.html" msgid "Capture the next ten seconds" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/browser/index.html:376 +#: website/public/guides/browser/index.html:378 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -6100,56 +6100,56 @@ msgid "" "browser. The result arrives after the observation window ends." msgstr "" -#: website/public/guides/browser/index.html:381 +#: website/public/guides/browser/index.html:383 msgctxt "page:guides/browser/index.html" msgid "" "The captured result includes the selected page, network activity during that window, " "and the shape of the JSON response. Earlier requests are outside this capture." msgstr "" -#: website/public/guides/browser/index.html:388 +#: website/public/guides/browser/index.html:390 msgctxt "page:guides/browser/index.html" msgid "Read the request and export script" msgstr "" -#: website/public/guides/browser/index.html:391 +#: website/public/guides/browser/index.html:393 msgctxt "page:guides/browser/index.html" msgid "Recorded with REA 4.1.0 on the local Notes example" msgstr "" -#: website/public/guides/browser/index.html:396 +#: website/public/guides/browser/index.html:398 msgctxt "page:guides/browser/index.html" msgid "Captured fact" msgstr "" -#: website/public/guides/browser/index.html:397 +#: website/public/guides/browser/index.html:399 msgctxt "page:guides/browser/index.html" msgid "Value" msgstr "" -#: website/public/guides/browser/index.html:402 +#: website/public/guides/browser/index.html:404 msgctxt "page:guides/browser/index.html" msgid "Request" msgstr "" -#: website/public/guides/browser/index.html:406 +#: website/public/guides/browser/index.html:408 msgctxt "page:guides/browser/index.html" msgid "Response" msgstr "" -#: website/public/guides/browser/index.html:410 +#: website/public/guides/browser/index.html:412 msgctxt "page:guides/browser/index.html" msgid "Request initiator" msgstr "" #. {ph0}: export.js -#: website/public/guides/browser/index.html:411 +#: website/public/guides/browser/index.html:413 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0} · script" msgstr "" -#: website/public/guides/browser/index.html:414 +#: website/public/guides/browser/index.html:416 msgctxt "page:guides/browser/index.html" msgid "Response structure" msgstr "" @@ -6157,19 +6157,19 @@ msgstr "" #. {ph0}: notes[] #. {ph1}: id #. {ph2}: title -#: website/public/guides/browser/index.html:415 +#: website/public/guides/browser/index.html:417 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0} with {ph1} and {ph2} fields" msgstr "" -#: website/public/guides/browser/index.html:425 +#: website/public/guides/browser/index.html:427 msgctxt "page:guides/browser/index.html" msgid "Read the loaded scripts" msgstr "" #. {ph0}: export.js -#: website/public/guides/browser/index.html:439 +#: website/public/guides/browser/index.html:441 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -6178,14 +6178,14 @@ msgid "" msgstr "" #. {ph0}: export.js -#: website/public/guides/browser/index.html:446 +#: website/public/guides/browser/index.html:448 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0} · example source excerpt" msgstr "" #. {ph0}: notes.json -#: website/public/guides/browser/index.html:459 +#: website/public/guides/browser/index.html:461 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -6202,14 +6202,14 @@ msgstr "" #. {ph5}: #. {ph6}: notes.json #. {ph7}: -#: website/public/guides/browser/index.html:464 +#: website/public/guides/browser/index.html:466 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "{ph0}Open the example{ph1} · {ph2}Download {ph3}{ph4} · {ph5}Download {ph6}{ph7}" msgstr "" #. {ph0}: notes.json -#: website/public/guides/browser/index.html:475 +#: website/public/guides/browser/index.html:477 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -6219,7 +6219,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/browser/index.html:480 +#: website/public/guides/browser/index.html:482 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -6230,7 +6230,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/browser/index.html:485 +#: website/public/guides/browser/index.html:487 #, python-brace-format msgctxt "page:guides/browser/index.html" msgid "" @@ -6251,216 +6251,216 @@ msgid "" "request and follow the export script." msgstr "" -#: website/public/guides/browser/index.html:210 +#: website/public/guides/browser/index.html:212 msgctxt "page:guides/browser/index.html" msgid "On this page" msgstr "" -#: website/public/guides/browser/index.html:220 +#: website/public/guides/browser/index.html:222 msgctxt "page:guides/browser/index.html" msgid "Browser observation" msgstr "" -#: website/public/guides/browser/index.html:276 +#: website/public/guides/browser/index.html:278 msgctxt "page:guides/browser/index.html" msgid "Copy start the example browser" msgstr "" -#: website/public/guides/browser/index.html:308 +#: website/public/guides/browser/index.html:310 msgctxt "page:guides/browser/index.html" msgid "Copy example prompt" msgstr "" -#: website/public/guides/browser/index.html:342 +#: website/public/guides/browser/index.html:344 msgctxt "page:guides/browser/index.html" msgid "Copy find the page" msgstr "" -#: website/public/guides/browser/index.html:361 +#: website/public/guides/browser/index.html:363 msgctxt "page:guides/browser/index.html" msgid "Copy capture the next ten seconds" msgstr "" -#: website/public/guides/browser/index.html:426 +#: website/public/guides/browser/index.html:428 msgctxt "page:guides/browser/index.html" msgid "Copy read the loaded scripts" msgstr "" -#: website/public/guides/browser/index.html:513 +#: website/public/guides/browser/index.html:515 msgctxt "page:guides/browser/index.html" msgid "Back to top" msgstr "" -#: website/public/guides/index.html:107 +#: website/public/guides/index.html:109 msgctxt "page:guides/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/index.html:199 +#: website/public/guides/index.html:201 #, python-brace-format msgctxt "page:guides/index.html" msgid "{ph0}Home{ph1} / Guides" msgstr "" -#: website/public/guides/index.html:200 +#: website/public/guides/index.html:202 msgctxt "page:guides/index.html" msgid "REA guides." msgstr "" -#: website/public/guides/index.html:201 +#: website/public/guides/index.html:203 msgctxt "page:guides/index.html" msgid "" "Analyze a native function, an Electron export or a browser request. Each guide " "includes a prompt, code and results." msgstr "" -#: website/public/guides/index.html:208 +#: website/public/guides/index.html:210 msgctxt "page:guides/index.html" msgid "First investigation" msgstr "" -#: website/public/guides/index.html:210 +#: website/public/guides/index.html:212 msgctxt "page:guides/index.html" msgid "Set up REA" msgstr "" -#: website/public/guides/index.html:211 +#: website/public/guides/index.html:213 msgctxt "page:guides/index.html" msgid "Connect your coding agent or use REA from the terminal." msgstr "" -#: website/public/guides/index.html:212 +#: website/public/guides/index.html:214 msgctxt "page:guides/index.html" msgid "Get started with REA" msgstr "" -#: website/public/guides/index.html:216 +#: website/public/guides/index.html:218 msgctxt "page:guides/index.html" msgid "Native binaries" msgstr "" -#: website/public/guides/index.html:218 +#: website/public/guides/index.html:220 msgctxt "page:guides/index.html" msgid "Recover a sound-pan calculation" msgstr "" -#: website/public/guides/index.html:219 +#: website/public/guides/index.html:221 msgctxt "page:guides/index.html" msgid "" "Start with a Windows game executable. Inspect instructions, follow a caller, read " "numeric constants and check the recovered C." msgstr "" -#: website/public/guides/index.html:224 +#: website/public/guides/index.html:226 msgctxt "page:guides/index.html" msgid "Instructions" msgstr "" -#: website/public/guides/index.html:225 +#: website/public/guides/index.html:227 msgctxt "page:guides/index.html" msgid "Caller" msgstr "" -#: website/public/guides/index.html:226 +#: website/public/guides/index.html:228 msgctxt "page:guides/index.html" msgid "Constants" msgstr "" -#: website/public/guides/index.html:227 +#: website/public/guides/index.html:229 msgctxt "page:guides/index.html" msgid "C function" msgstr "" -#: website/public/guides/index.html:229 +#: website/public/guides/index.html:231 msgctxt "page:guides/index.html" msgid "Native analysis guide" msgstr "" -#: website/public/guides/index.html:233 +#: website/public/guides/index.html:235 msgctxt "page:guides/index.html" msgid "JavaScript & Electron" msgstr "" -#: website/public/guides/index.html:235 +#: website/public/guides/index.html:237 msgctxt "page:guides/index.html" msgid "Follow a CSV export" msgstr "" -#: website/public/guides/index.html:236 +#: website/public/guides/index.html:238 msgctxt "page:guides/index.html" msgid "" "A small Notes app spreads one feature across the renderer, preload and main process. " "Use REA to connect the API, IPC channel and file writer." msgstr "" -#: website/public/guides/index.html:242 +#: website/public/guides/index.html:244 msgctxt "page:guides/index.html" msgid "Button" msgstr "" -#: website/public/guides/index.html:243 +#: website/public/guides/index.html:245 msgctxt "page:guides/index.html" msgid "Preload API" msgstr "" -#: website/public/guides/index.html:244 +#: website/public/guides/index.html:246 msgctxt "page:guides/index.html" msgid "IPC" msgstr "" -#: website/public/guides/index.html:244 +#: website/public/guides/index.html:246 msgctxt "page:guides/index.html" msgid "CSV file" msgstr "" -#: website/public/guides/index.html:246 +#: website/public/guides/index.html:248 msgctxt "page:guides/index.html" msgid "JavaScript & Electron guide" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/index.html:249 +#: website/public/guides/index.html:251 #, python-brace-format msgctxt "page:guides/index.html" msgid "For a larger packaged app, follow {ph0}Notion's clipboard bridge{ph1}." msgstr "" -#: website/public/guides/index.html:256 +#: website/public/guides/index.html:258 msgctxt "page:guides/index.html" msgid "Browser behavior" msgstr "" -#: website/public/guides/index.html:258 +#: website/public/guides/index.html:260 msgctxt "page:guides/index.html" msgid "Observe a click" msgstr "" -#: website/public/guides/index.html:259 +#: website/public/guides/index.html:261 msgctxt "page:guides/index.html" msgid "" "Open a working Notes example, capture an export request and find the code that turns " "its response into a download." msgstr "" -#: website/public/guides/index.html:264 +#: website/public/guides/index.html:266 msgctxt "page:guides/index.html" msgid "Your click" msgstr "" -#: website/public/guides/index.html:265 +#: website/public/guides/index.html:267 msgctxt "page:guides/index.html" msgid "Captured request" msgstr "" -#: website/public/guides/index.html:266 +#: website/public/guides/index.html:268 msgctxt "page:guides/index.html" msgid "Export script" msgstr "" -#: website/public/guides/index.html:268 +#: website/public/guides/index.html:270 msgctxt "page:guides/index.html" msgid "Browser observation guide" msgstr "" @@ -6477,12 +6477,12 @@ msgid "" "and a browser request." msgstr "" -#: website/public/guides/index.html:288 +#: website/public/guides/index.html:290 msgctxt "page:guides/index.html" msgid "Back to top" msgstr "" -#: website/public/guides/javascript/index.html:107 +#: website/public/guides/javascript/index.html:109 msgctxt "page:guides/javascript/index.html" msgid "Skip to content" msgstr "" @@ -6491,33 +6491,33 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/guides/javascript/index.html:199 +#: website/public/guides/javascript/index.html:201 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Home{ph1} / {ph2}Guides{ph3} / JavaScript & Electron" msgstr "" #. {ph0}:
-#: website/public/guides/javascript/index.html:203 +#: website/public/guides/javascript/index.html:205 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "Trace an Electron{ph0}CSV export." msgstr "" -#: website/public/guides/javascript/index.html:204 +#: website/public/guides/javascript/index.html:206 msgctxt "page:guides/javascript/index.html" msgid "" "Follow a button click from the page API, through Electron IPC, to the CSV file writer." msgstr "" -#: website/public/guides/javascript/index.html:211 +#: website/public/guides/javascript/index.html:213 msgctxt "page:guides/javascript/index.html" msgid "In this guide" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/javascript/index.html:213 +#: website/public/guides/javascript/index.html:215 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}The example{ph1}" @@ -6525,7 +6525,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/javascript/index.html:214 +#: website/public/guides/javascript/index.html:216 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Ask your agent{ph1}" @@ -6533,7 +6533,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/javascript/index.html:215 +#: website/public/guides/javascript/index.html:217 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Trace the export code{ph1}" @@ -6541,7 +6541,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/javascript/index.html:216 +#: website/public/guides/javascript/index.html:218 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Try the example{ph1}" @@ -6549,20 +6549,20 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/javascript/index.html:217 +#: website/public/guides/javascript/index.html:219 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Inspect the CSV writer{ph1}" msgstr "" -#: website/public/guides/javascript/index.html:222 +#: website/public/guides/javascript/index.html:224 msgctxt "page:guides/javascript/index.html" msgid "Where does “Export notes” go?" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/javascript/index.html:223 +#: website/public/guides/javascript/index.html:225 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6571,7 +6571,7 @@ msgid "" "across several files." msgstr "" -#: website/public/guides/javascript/index.html:230 +#: website/public/guides/javascript/index.html:232 msgctxt "page:guides/javascript/index.html" msgid "The CSV export across Electron processes" msgstr "" @@ -6585,7 +6585,7 @@ msgstr "" #. {ph6}: renderer.js #. {ph7}: preload.js #. {ph8}: -#: website/public/guides/javascript/index.html:234 +#: website/public/guides/javascript/index.html:236 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6600,7 +6600,7 @@ msgstr "" #. {ph4}: #. {ph5}: #. {ph6}: -#: website/public/guides/javascript/index.html:242 +#: website/public/guides/javascript/index.html:244 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6615,7 +6615,7 @@ msgstr "" #. {ph4}: #. {ph5}: main.js #. {ph6}: -#: website/public/guides/javascript/index.html:250 +#: website/public/guides/javascript/index.html:252 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6626,27 +6626,27 @@ msgstr "" #. {ph0}: csv.js #. {ph1}: main.js #. {ph2}: downloads/notes.csv -#: website/public/guides/javascript/index.html:259 +#: website/public/guides/javascript/index.html:261 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0} formats the notes → {ph1} writes {ph2}." msgstr "" -#: website/public/guides/javascript/index.html:263 +#: website/public/guides/javascript/index.html:265 msgctxt "page:guides/javascript/index.html" msgid "" "REA matches the literal IPC call to its handler and identifies the exposed API. The " "path is inferred from code; a runtime capture can check what executes." msgstr "" -#: website/public/guides/javascript/index.html:271 +#: website/public/guides/javascript/index.html:273 msgctxt "page:guides/javascript/index.html" msgid "Ask about the CSV export" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/javascript/index.html:272 +#: website/public/guides/javascript/index.html:274 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Connect your agent to REA{ph1} and give it the app directory or ASAR file:" @@ -6660,14 +6660,14 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/guides/javascript/index.html:278 +#: website/public/guides/javascript/index.html:280 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" -#: website/public/guides/javascript/index.html:282 -#: website/public/guides/javascript/index.html:431 +#: website/public/guides/javascript/index.html:284 +#: website/public/guides/javascript/index.html:433 msgctxt "page:guides/javascript/index.html" msgid "Copy" msgstr "" @@ -6678,7 +6678,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/guides/javascript/index.html:291 +#: website/public/guides/javascript/index.html:293 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6687,13 +6687,13 @@ msgid "" msgstr "" #. {ph0}: app.asar -#: website/public/guides/javascript/index.html:299 +#: website/public/guides/javascript/index.html:301 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "Example prompt. Include the absolute path to the application folder or {ph0}." msgstr "" -#: website/public/guides/javascript/index.html:303 +#: website/public/guides/javascript/index.html:305 msgctxt "page:guides/javascript/index.html" msgid "" "REA reads the application files and builds a map of entrypoints, modules and process " @@ -6701,26 +6701,26 @@ msgid "" "feature." msgstr "" -#: website/public/guides/javascript/index.html:310 +#: website/public/guides/javascript/index.html:312 msgctxt "page:guides/javascript/index.html" msgid "Trace the export code" msgstr "" -#: website/public/guides/javascript/index.html:311 +#: website/public/guides/javascript/index.html:313 msgctxt "page:guides/javascript/index.html" msgid "The page calls a small API" msgstr "" #. {ph0}: renderer.js -#: website/public/guides/javascript/index.html:314 -#: website/public/guides/javascript/index.html:330 -#: website/public/guides/javascript/index.html:345 +#: website/public/guides/javascript/index.html:316 +#: website/public/guides/javascript/index.html:332 +#: website/public/guides/javascript/index.html:347 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0} · example source" msgstr "" -#: website/public/guides/javascript/index.html:324 +#: website/public/guides/javascript/index.html:326 msgctxt "page:guides/javascript/index.html" msgid "" "The page knows the method name. The implementation lives in the preload, which exposes" @@ -6729,7 +6729,7 @@ msgstr "" #. {ph0}: notes.exportCsv #. {ph1}: notes:export -#: website/public/guides/javascript/index.html:338 +#: website/public/guides/javascript/index.html:340 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6739,7 +6739,7 @@ msgstr "" #. {ph0}: csv.js #. {ph1}: notes.csv -#: website/public/guides/javascript/index.html:355 +#: website/public/guides/javascript/index.html:357 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6747,26 +6747,26 @@ msgid "" "main process writes {ph1} into the user's Downloads folder." msgstr "" -#: website/public/guides/javascript/index.html:362 +#: website/public/guides/javascript/index.html:364 msgctxt "page:guides/javascript/index.html" msgid "REA result · summary.ipc excerpt" msgstr "" -#: website/public/guides/javascript/index.html:372 +#: website/public/guides/javascript/index.html:374 msgctxt "page:guides/javascript/index.html" msgid "" "Recorded by REA 4.1.0 on the downloadable example below. Source locations accompany " "the API, channel and handler findings." msgstr "" -#: website/public/guides/javascript/index.html:378 +#: website/public/guides/javascript/index.html:380 msgctxt "page:guides/javascript/index.html" msgid "Analyze the example yourself" msgstr "" #. {ph0}: notes-example #. {ph1}: Node.js -#: website/public/guides/javascript/index.html:379 +#: website/public/guides/javascript/index.html:381 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6777,25 +6777,25 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/javascript/index.html:385 +#: website/public/guides/javascript/index.html:387 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "{ph0}Download example ZIP{ph1}" msgstr "" -#: website/public/guides/javascript/index.html:394 +#: website/public/guides/javascript/index.html:396 msgctxt "page:guides/javascript/index.html" msgid "Browse the six source files" msgstr "" -#: website/public/guides/javascript/index.html:430 +#: website/public/guides/javascript/index.html:432 msgctxt "page:guides/javascript/index.html" msgid "Static application analysis" msgstr "" #. {ph0}: normalized_result.summary.ipc #. {ph1}: normalized_result.graph -#: website/public/guides/javascript/index.html:443 +#: website/public/guides/javascript/index.html:445 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6803,20 +6803,20 @@ msgid "" " matching handler in {ph0}. Source locations are in {ph1}." msgstr "" -#: website/public/guides/javascript/index.html:449 +#: website/public/guides/javascript/index.html:451 msgctxt "page:guides/javascript/index.html" msgid "" "For your own app, use the same command with its directory or ASAR path. An agent can " "follow a literal string, API name or IPC channel with REA's feature tracing tools." msgstr "" -#: website/public/guides/javascript/index.html:456 +#: website/public/guides/javascript/index.html:458 msgctxt "page:guides/javascript/index.html" msgid "Inspect the CSV writer" msgstr "" #. {ph0}: notes:export -#: website/public/guides/javascript/index.html:458 +#: website/public/guides/javascript/index.html:460 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6824,7 +6824,7 @@ msgid "" "writing the file fails?" msgstr "" -#: website/public/guides/javascript/index.html:464 +#: website/public/guides/javascript/index.html:466 msgctxt "page:guides/javascript/index.html" msgid "" "Use the source locations to inspect those details. Computed channel names and " @@ -6836,7 +6836,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/guides/javascript/index.html:470 +#: website/public/guides/javascript/index.html:472 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6848,7 +6848,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/guides/javascript/index.html:476 +#: website/public/guides/javascript/index.html:478 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6860,7 +6860,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/guides/javascript/index.html:482 +#: website/public/guides/javascript/index.html:484 #, python-brace-format msgctxt "page:guides/javascript/index.html" msgid "" @@ -6880,32 +6880,32 @@ msgid "" "Includes downloadable example files and a verified analysis result." msgstr "" -#: website/public/guides/javascript/index.html:210 +#: website/public/guides/javascript/index.html:212 msgctxt "page:guides/javascript/index.html" msgid "On this page" msgstr "" -#: website/public/guides/javascript/index.html:220 +#: website/public/guides/javascript/index.html:222 msgctxt "page:guides/javascript/index.html" msgid "JavaScript & Electron" msgstr "" -#: website/public/guides/javascript/index.html:282 +#: website/public/guides/javascript/index.html:284 msgctxt "page:guides/javascript/index.html" msgid "Copy example prompt" msgstr "" -#: website/public/guides/javascript/index.html:431 +#: website/public/guides/javascript/index.html:433 msgctxt "page:guides/javascript/index.html" msgid "Copy static application analysis" msgstr "" -#: website/public/guides/javascript/index.html:509 +#: website/public/guides/javascript/index.html:511 msgctxt "page:guides/javascript/index.html" msgid "Back to top" msgstr "" -#: website/public/guides/native/index.html:107 +#: website/public/guides/native/index.html:109 msgctxt "page:guides/native/index.html" msgid "Skip to content" msgstr "" @@ -6914,34 +6914,34 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/guides/native/index.html:199 +#: website/public/guides/native/index.html:201 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Home{ph1} / {ph2}Guides{ph3} / Native analysis" msgstr "" #. {ph0}:
-#: website/public/guides/native/index.html:202 +#: website/public/guides/native/index.html:204 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "Recover DX-Ball's{ph0}sound-pan calculation." msgstr "" -#: website/public/guides/native/index.html:203 +#: website/public/guides/native/index.html:205 msgctxt "page:guides/native/index.html" msgid "" "Inspect the original instructions, identify the input and constants, then check the " "recovered C." msgstr "" -#: website/public/guides/native/index.html:210 +#: website/public/guides/native/index.html:212 msgctxt "page:guides/native/index.html" msgid "In this guide" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:212 +#: website/public/guides/native/index.html:214 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}The example{ph1}" @@ -6949,7 +6949,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:213 +#: website/public/guides/native/index.html:215 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Ask your agent{ph1}" @@ -6957,7 +6957,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:214 +#: website/public/guides/native/index.html:216 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Read the REA results{ph1}" @@ -6965,7 +6965,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:215 +#: website/public/guides/native/index.html:217 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Recover and check{ph1}" @@ -6973,18 +6973,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:216 +#: website/public/guides/native/index.html:218 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Use your own binary{ph1}" msgstr "" -#: website/public/guides/native/index.html:221 +#: website/public/guides/native/index.html:223 msgctxt "page:guides/native/index.html" msgid "Calculate left/right sound panning" msgstr "" -#: website/public/guides/native/index.html:222 +#: website/public/guides/native/index.html:224 msgctxt "page:guides/native/index.html" msgid "" "In DX-Ball, a brick hit supplies a horizontal screen position. The sound code turns it" @@ -6993,7 +6993,7 @@ msgstr "" #. {ph0}: 0x00406400 #. {ph1}: __ftol() -#: website/public/guides/native/index.html:226 +#: website/public/guides/native/index.html:228 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7002,7 +7002,7 @@ msgid "" "missing arithmetic." msgstr "" -#: website/public/guides/native/index.html:233 +#: website/public/guides/native/index.html:235 msgctxt "page:guides/native/index.html" msgid "New to these terms?" msgstr "" @@ -7011,7 +7011,7 @@ msgstr "" #. {ph1}: #. {ph2}: MOV #. {ph3}: ADD -#: website/public/guides/native/index.html:235 +#: website/public/guides/native/index.html:237 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7021,7 +7021,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:240 +#: website/public/guides/native/index.html:242 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7031,7 +7031,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:245 +#: website/public/guides/native/index.html:247 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7041,7 +7041,7 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: 0x00406400 -#: website/public/guides/native/index.html:249 +#: website/public/guides/native/index.html:251 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7050,7 +7050,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:253 +#: website/public/guides/native/index.html:255 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7058,7 +7058,7 @@ msgid "" "decoded." msgstr "" -#: website/public/guides/native/index.html:260 +#: website/public/guides/native/index.html:262 msgctxt "page:guides/native/index.html" msgid "Three pieces of evidence, one calculation" msgstr "" @@ -7069,7 +7069,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/guides/native/index.html:264 +#: website/public/guides/native/index.html:266 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7084,7 +7084,7 @@ msgstr "" #. {ph4}: #. {ph5}: 20 + 30 × tile_x #. {ph6}: -#: website/public/guides/native/index.html:272 +#: website/public/guides/native/index.html:274 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7100,7 +7100,7 @@ msgstr "" #. {ph5}: 1.5625 #. {ph6}: 500.0 #. {ph7}: -#: website/public/guides/native/index.html:280 +#: website/public/guides/native/index.html:282 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7108,14 +7108,14 @@ msgid "" "to {ph5}, {ph6} and a scale value.{ph7}" msgstr "" -#: website/public/guides/native/index.html:292 +#: website/public/guides/native/index.html:294 msgctxt "page:guides/native/index.html" msgid "" "REA supplies the instructions, call relationship and bytes. The agent interprets them " "together." msgstr "" -#: website/public/guides/native/index.html:299 +#: website/public/guides/native/index.html:301 msgctxt "page:guides/native/index.html" msgid "Ask about the behavior" msgstr "" @@ -7124,7 +7124,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/guides/native/index.html:300 +#: website/public/guides/native/index.html:302 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7132,19 +7132,19 @@ msgid "" "tool{ph3}, provide the local executable and a question:" msgstr "" -#: website/public/guides/native/index.html:311 +#: website/public/guides/native/index.html:313 msgctxt "page:guides/native/index.html" msgid "Which analysis tool should I use?" msgstr "" -#: website/public/guides/native/index.html:312 +#: website/public/guides/native/index.html:314 msgctxt "page:guides/native/index.html" msgid "REA needs one of these to read native programs:" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:314 +#: website/public/guides/native/index.html:316 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7155,7 +7155,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:320 +#: website/public/guides/native/index.html:322 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7165,7 +7165,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:325 +#: website/public/guides/native/index.html:327 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}IDA{ph1} (Windows): for an existing IDA setup with an MCP registration." @@ -7173,7 +7173,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:330 +#: website/public/guides/native/index.html:332 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "See {ph0}Set up native analysis{ph1} for the steps." @@ -7187,14 +7187,14 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/guides/native/index.html:338 +#: website/public/guides/native/index.html:340 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" -#: website/public/guides/native/index.html:342 -#: website/public/guides/native/index.html:473 +#: website/public/guides/native/index.html:344 +#: website/public/guides/native/index.html:475 msgctxt "page:guides/native/index.html" msgid "Copy" msgstr "" @@ -7205,7 +7205,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/guides/native/index.html:351 +#: website/public/guides/native/index.html:353 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7213,7 +7213,7 @@ msgid "" "calculation and show the code.{ph3}{ph4}{ph5}" msgstr "" -#: website/public/guides/native/index.html:359 +#: website/public/guides/native/index.html:361 msgctxt "page:guides/native/index.html" msgid "" "Example prompt. Give your agent the path to your local DX-Ball 1.07 executable. REA " @@ -7221,7 +7221,7 @@ msgid "" "another small Windows program you have." msgstr "" -#: website/public/guides/native/index.html:366 +#: website/public/guides/native/index.html:368 msgctxt "page:guides/native/index.html" msgid "How do I get a file's full path?" msgstr "" @@ -7230,7 +7230,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/guides/native/index.html:368 +#: website/public/guides/native/index.html:370 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7242,7 +7242,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/guides/native/index.html:373 +#: website/public/guides/native/index.html:375 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7252,46 +7252,46 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:377 +#: website/public/guides/native/index.html:379 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}Any system:{ph1} drag the file into a terminal window and its path appears." msgstr "" -#: website/public/guides/native/index.html:385 +#: website/public/guides/native/index.html:387 msgctxt "page:guides/native/index.html" msgid "Read the REA results" msgstr "" -#: website/public/guides/native/index.html:386 +#: website/public/guides/native/index.html:388 msgctxt "page:guides/native/index.html" msgid "Read the input" msgstr "" -#: website/public/guides/native/index.html:389 +#: website/public/guides/native/index.html:391 msgctxt "page:guides/native/index.html" msgid "REA instruction excerpt · 0x406409" msgstr "" -#: website/public/guides/native/index.html:395 +#: website/public/guides/native/index.html:397 msgctxt "page:guides/native/index.html" msgid "" "The instructions load an integer argument and convert it for floating-point " "arithmetic. This is the input absent from the first pseudocode view." msgstr "" -#: website/public/guides/native/index.html:400 +#: website/public/guides/native/index.html:402 msgctxt "page:guides/native/index.html" msgid "Follow the caller" msgstr "" -#: website/public/guides/native/index.html:403 +#: website/public/guides/native/index.html:405 msgctxt "page:guides/native/index.html" msgid "REA caller excerpt · 0x411f5b" msgstr "" #. {ph0}: 0x14 -#: website/public/guides/native/index.html:409 +#: website/public/guides/native/index.html:411 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7299,34 +7299,34 @@ msgid "" "coordinate by 30; adding {ph0} (20) gives the brick's screen position." msgstr "" -#: website/public/guides/native/index.html:414 +#: website/public/guides/native/index.html:416 msgctxt "page:guides/native/index.html" msgid "Read the referenced constants" msgstr "" -#: website/public/guides/native/index.html:417 +#: website/public/guides/native/index.html:419 msgctxt "page:guides/native/index.html" msgid "REA byte results · interpreted as little-endian doubles" msgstr "" -#: website/public/guides/native/index.html:425 +#: website/public/guides/native/index.html:427 msgctxt "page:guides/native/index.html" msgid "" "The arithmetic references these addresses. Reading the bytes supplies the actual " "values; the instruction order tells the agent how they are used." msgstr "" -#: website/public/guides/native/index.html:432 +#: website/public/guides/native/index.html:434 msgctxt "page:guides/native/index.html" msgid "Write and check the recovered function" msgstr "" -#: website/public/guides/native/index.html:434 +#: website/public/guides/native/index.html:436 msgctxt "page:guides/native/index.html" msgid "Recovered C · excerpt" msgstr "" -#: website/public/guides/native/index.html:441 +#: website/public/guides/native/index.html:443 msgctxt "page:guides/native/index.html" msgid "" "With a scale of 1.0, screen positions 0, 320 and 640 map to −500, 0 and 500 before " @@ -7334,7 +7334,7 @@ msgid "" " stereo field." msgstr "" -#: website/public/guides/native/index.html:446 +#: website/public/guides/native/index.html:448 msgctxt "page:guides/native/index.html" msgid "" "The agent used REA's findings to write the C. Separate checks compared 3,205 inputs " @@ -7344,20 +7344,20 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:451 +#: website/public/guides/native/index.html:453 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "{ph0}See the full investigation and assembly-to-C comparison{ph1}" msgstr "" -#: website/public/guides/native/index.html:458 +#: website/public/guides/native/index.html:460 msgctxt "page:guides/native/index.html" msgid "Try it with your own binary" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/guides/native/index.html:459 +#: website/public/guides/native/index.html:461 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7366,20 +7366,20 @@ msgid "" "this file parsed?” or “Which function handles this menu action?”" msgstr "" -#: website/public/guides/native/index.html:466 +#: website/public/guides/native/index.html:468 msgctxt "page:guides/native/index.html" msgid "" "If you already know a function name or address, you can query it from the terminal. " "For a configured Ghidra installation:" msgstr "" -#: website/public/guides/native/index.html:472 +#: website/public/guides/native/index.html:474 msgctxt "page:guides/native/index.html" msgid "Function analysis" msgstr "" #. {ph0}: main -#: website/public/guides/native/index.html:485 +#: website/public/guides/native/index.html:487 #, python-brace-format msgctxt "page:guides/native/index.html" msgid "" @@ -7388,7 +7388,7 @@ msgid "" "queries reuse the imported binary while that session is open." msgstr "" -#: website/public/guides/native/index.html:491 +#: website/public/guides/native/index.html:493 msgctxt "page:guides/native/index.html" msgid "" "Read the pseudocode alongside instructions and references. When a result leaves a call" @@ -7407,50 +7407,50 @@ msgid "" "constants and check reconstructed C." msgstr "" -#: website/public/guides/native/index.html:209 +#: website/public/guides/native/index.html:211 msgctxt "page:guides/native/index.html" msgid "On this page" msgstr "" -#: website/public/guides/native/index.html:219 +#: website/public/guides/native/index.html:221 msgctxt "page:guides/native/index.html" msgid "Native analysis" msgstr "" -#: website/public/guides/native/index.html:342 +#: website/public/guides/native/index.html:344 msgctxt "page:guides/native/index.html" msgid "Copy example prompt" msgstr "" -#: website/public/guides/native/index.html:473 +#: website/public/guides/native/index.html:475 msgctxt "page:guides/native/index.html" msgid "Copy function analysis" msgstr "" -#: website/public/guides/native/index.html:515 +#: website/public/guides/native/index.html:517 msgctxt "page:guides/native/index.html" msgid "Back to top" msgstr "" -#: website/public/index.html:109 +#: website/public/index.html:111 msgctxt "page:index.html" msgid "Skip to content" msgstr "" -#: website/public/index.html:201 website/public/index.html:211 -#: website/public/index.html:209 +#: website/public/index.html:203 website/public/index.html:213 +#: website/public/index.html:211 msgctxt "page:index.html" msgid "On this page" msgstr "" -#: website/public/index.html:202 website/public/index.html:250 +#: website/public/index.html:204 website/public/index.html:252 msgctxt "page:index.html" msgid "Set up REA" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:213 +#: website/public/index.html:215 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Set up REA{ph1}" @@ -7458,7 +7458,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:214 +#: website/public/index.html:216 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}How it works{ph1}" @@ -7466,7 +7466,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:215 +#: website/public/index.html:217 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Dinosaur game{ph1}" @@ -7474,7 +7474,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:216 +#: website/public/index.html:218 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Calculator{ph1}" @@ -7482,7 +7482,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:217 +#: website/public/index.html:219 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Showcases{ph1}" @@ -7490,7 +7490,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:218 +#: website/public/index.html:220 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Try REA{ph1}" @@ -7498,44 +7498,44 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:219 +#: website/public/index.html:221 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Go deeper{ph1}" msgstr "" -#: website/public/index.html:228 +#: website/public/index.html:230 msgctxt "page:index.html" msgid "Reverse engineering, with your coding agent" msgstr "" #. {ph0}:
-#: website/public/index.html:229 +#: website/public/index.html:231 #, python-brace-format msgctxt "page:index.html" msgid "Find out how{ph0}software works." msgstr "" -#: website/public/index.html:230 +#: website/public/index.html:232 msgctxt "page:index.html" msgid "" "Ask your coding agent about an app, a game or a website. REA gives it the tools to " "inspect the code behind the answer." msgstr "" -#: website/public/index.html:235 +#: website/public/index.html:237 msgctxt "page:index.html" msgid "Get started" msgstr "" -#: website/public/index.html:236 +#: website/public/index.html:238 msgctxt "page:index.html" msgid "See an example ↓" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:239 +#: website/public/index.html:241 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Showcases →{ph1} — investigations and interactive demos." @@ -7543,13 +7543,13 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:243 +#: website/public/index.html:245 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Blog →{ph1} — methods and reconstruction notes." msgstr "" -#: website/public/index.html:251 +#: website/public/index.html:253 msgctxt "page:index.html" msgid "Copy this into your coding agent:" msgstr "" @@ -7562,16 +7562,16 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/index.html:254 +#: website/public/index.html:256 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" -#: website/public/index.html:259 website/public/index.html:283 -#: website/public/index.html:519 website/public/index.html:600 -#: website/public/index.html:824 website/public/index.html:1136 -#: website/public/index.html:1164 +#: website/public/index.html:261 website/public/index.html:285 +#: website/public/index.html:521 website/public/index.html:602 +#: website/public/index.html:826 website/public/index.html:1138 +#: website/public/index.html:1166 msgctxt "page:index.html" msgid "Copy" msgstr "" @@ -7583,7 +7583,7 @@ msgstr "" #. {ph4}: #. {ph5}: -#: website/public/index.html:268 +#: website/public/index.html:270 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -7591,17 +7591,17 @@ msgid "" "the setup plan for approval, then verify the installation.{ph4}{ph5}{ph6}" msgstr "" -#: website/public/index.html:280 +#: website/public/index.html:282 msgctxt "page:index.html" msgid "Or run this in your terminal:" msgstr "" -#: website/public/index.html:292 +#: website/public/index.html:294 msgctxt "page:index.html" msgid "Approve the setup plan, then restart your agent." msgstr "" -#: website/public/index.html:296 +#: website/public/index.html:298 msgctxt "page:index.html" msgid "Setup for your platform:" msgstr "" @@ -7609,7 +7609,7 @@ msgstr "" #. {ph0}: #. {ph1}: curl #. {ph2}: -#: website/public/index.html:307 +#: website/public/index.html:309 #, python-brace-format msgctxt "page:index.html" msgid "Other install options: {ph0}{ph1} →{ph2}" @@ -7618,7 +7618,7 @@ msgstr "" #. {ph0}: Node.js #. {ph1}: #. {ph2}: -#: website/public/index.html:313 +#: website/public/index.html:315 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -7626,12 +7626,12 @@ msgid "" "guide →{ph2}" msgstr "" -#: website/public/index.html:326 +#: website/public/index.html:328 msgctxt "page:index.html" msgid "How it works" msgstr "" -#: website/public/index.html:328 +#: website/public/index.html:330 msgctxt "page:index.html" msgid "" "Reverse engineering means learning how software works by inspecting the program " @@ -7639,56 +7639,56 @@ msgid "" "rebuild it." msgstr "" -#: website/public/index.html:335 +#: website/public/index.html:337 msgctxt "page:index.html" msgid "Ask about one feature" msgstr "" -#: website/public/index.html:336 +#: website/public/index.html:338 msgctxt "page:index.html" msgid "Give your agent a program or page and a question." msgstr "" -#: website/public/index.html:339 +#: website/public/index.html:341 msgctxt "page:index.html" msgid "Inspect the program" msgstr "" -#: website/public/index.html:340 +#: website/public/index.html:342 msgctxt "page:index.html" msgid "REA returns code, references and runtime observations." msgstr "" -#: website/public/index.html:343 +#: website/public/index.html:345 msgctxt "page:index.html" msgid "Explain it, then try a change" msgstr "" -#: website/public/index.html:344 +#: website/public/index.html:346 msgctxt "page:index.html" msgid "Your agent uses the findings to explain or rebuild the feature." msgstr "" -#: website/public/index.html:350 +#: website/public/index.html:352 msgctxt "page:index.html" msgid "See the full Calculator investigation" msgstr "" #. {ph0}: 200 + 10% -#: website/public/index.html:351 +#: website/public/index.html:353 #, python-brace-format msgctxt "page:index.html" msgid "Why does Calculator give 220 for {ph0}?" msgstr "" -#: website/public/index.html:360 +#: website/public/index.html:362 msgctxt "page:index.html" msgid "Follow the instructions step by step" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:368 +#: website/public/index.html:370 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}01{ph1} Decode branches" @@ -7696,7 +7696,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:376 +#: website/public/index.html:378 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}02{ph1} Trace calls" @@ -7704,7 +7704,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:384 +#: website/public/index.html:386 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}03{ph1} Recover the rule" @@ -7714,48 +7714,48 @@ msgstr "" #. {ph1}: #. {ph2}: -#: website/public/index.html:395 +#: website/public/index.html:397 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Original x64 · selected instructions{ph1} {ph2}{ph3}" msgstr "" -#: website/public/index.html:437 +#: website/public/index.html:439 msgctxt "page:index.html" msgid "01 · Which branch?" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:438 +#: website/public/index.html:440 #, python-brace-format msgctxt "page:index.html" msgid "“{ph0}0x5b? 0x5c?{ph1} Two jumps to the same place. Which operators are these?”" msgstr "" -#: website/public/index.html:442 +#: website/public/index.html:444 msgctxt "page:index.html" msgid "Look up the command IDs, then label the branch." msgstr "" -#: website/public/index.html:448 +#: website/public/index.html:450 msgctxt "page:index.html" msgid "Divide ÷" msgstr "" -#: website/public/index.html:452 +#: website/public/index.html:454 msgctxt "page:index.html" msgid "Multiply ×" msgstr "" -#: website/public/index.html:457 +#: website/public/index.html:459 msgctxt "page:index.html" msgid "02 · What do the calls do?" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:458 +#: website/public/index.html:460 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -7763,43 +7763,43 @@ msgid "" "in?{ph1}”" msgstr "" -#: website/public/index.html:464 +#: website/public/index.html:466 msgctxt "page:index.html" msgid "Inspect the helpers and trace the stored values." msgstr "" -#: website/public/index.html:474 +#: website/public/index.html:476 msgctxt "page:index.html" msgid "Divide" msgstr "" -#: website/public/index.html:479 +#: website/public/index.html:481 msgctxt "page:index.html" msgid "03 · What is the rule?" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:480 +#: website/public/index.html:482 #, python-brace-format msgctxt "page:index.html" msgid "" "“This path multiplies by the other input. So {ph0}10% means 10% of 200{ph1} after +.”" msgstr "" -#: website/public/index.html:484 +#: website/public/index.html:486 msgctxt "page:index.html" msgid "Name the operands and check both operator paths." msgstr "" -#: website/public/index.html:500 website/public/index.html:427 +#: website/public/index.html:502 website/public/index.html:429 msgctxt "page:index.html" msgid "Illustrative expert reasoning" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:503 +#: website/public/index.html:505 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -7807,7 +7807,7 @@ msgid "" "calculation.{ph1}" msgstr "" -#: website/public/index.html:511 +#: website/public/index.html:513 msgctxt "page:index.html" msgid "Ask your agent the same question" msgstr "" @@ -7820,7 +7820,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/index.html:514 +#: website/public/index.html:516 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example prompt · Calculator" @@ -7833,7 +7833,7 @@ msgstr "" #. {ph4}: #. {ph5}: -#: website/public/index.html:528 +#: website/public/index.html:530 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -7841,42 +7841,42 @@ msgid "" "220?{ph4}{ph5}{ph6}" msgstr "" -#: website/public/index.html:536 +#: website/public/index.html:538 msgctxt "page:index.html" msgid "Example answer · based on the findings" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:539 +#: website/public/index.html:541 #, python-brace-format msgctxt "page:index.html" msgid "After +, the % button takes {ph0}a percentage of the first number.{ph1}" msgstr "" -#: website/public/index.html:552 +#: website/public/index.html:554 msgctxt "page:index.html" msgid "REA supplies" msgstr "" -#: website/public/index.html:553 +#: website/public/index.html:555 msgctxt "page:index.html" msgid "The handler’s instructions, decompiled code and calls." msgstr "" -#: website/public/index.html:558 +#: website/public/index.html:560 msgctxt "page:index.html" msgid "Your agent explains" msgstr "" -#: website/public/index.html:559 +#: website/public/index.html:561 msgctxt "page:index.html" msgid "Which branch applies, what it calculates and how to rebuild it." msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:566 +#: website/public/index.html:568 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -7884,30 +7884,30 @@ msgid "" " the findings. {ph0}Continue with the Calculator example ↓{ph1}" msgstr "" -#: website/public/index.html:578 +#: website/public/index.html:580 msgctxt "page:index.html" msgid "" "Let’s try two examples: change a game’s speed, then rebuild Calculator’s % button." msgstr "" -#: website/public/index.html:583 +#: website/public/index.html:585 msgctxt "page:index.html" msgid "Example 01 · Chrome’s dinosaur game" msgstr "" -#: website/public/index.html:584 +#: website/public/index.html:586 msgctxt "page:index.html" msgid "Why does the dinosaur get faster?" msgstr "" -#: website/public/index.html:586 +#: website/public/index.html:588 msgctxt "page:index.html" msgid "" "The game gets faster as you run. To rebuild it with a speed control, we first need to " "find out how the speed changes." msgstr "" -#: website/public/index.html:592 +#: website/public/index.html:594 msgctxt "page:index.html" msgid "1. Ask about the speed" msgstr "" @@ -7920,7 +7920,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/index.html:595 +#: website/public/index.html:597 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example question · Dinosaur game" @@ -7932,7 +7932,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/index.html:609 +#: website/public/index.html:611 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -7940,102 +7940,102 @@ msgid "" "the speed rule, then build a small version with an adjustable speed.{ph3}{ph4}{ph5}" msgstr "" -#: website/public/index.html:618 +#: website/public/index.html:620 msgctxt "page:index.html" msgid "2. Find the speed rule" msgstr "" -#: website/public/index.html:619 +#: website/public/index.html:621 msgctxt "page:index.html" msgid "" "REA lets the agent read the game’s running code. The speed starts at 6 and increases a" " little each update while it is below 13." msgstr "" -#: website/public/index.html:626 +#: website/public/index.html:628 msgctxt "page:index.html" msgid "3. Play the result" msgstr "" -#: website/public/index.html:627 +#: website/public/index.html:629 msgctxt "page:index.html" msgid "" "We rebuilt that rule in the mini-game below and added a speed slider. Press Play, then" " choose your own speed." msgstr "" -#: website/public/index.html:663 +#: website/public/index.html:665 msgctxt "page:index.html" msgid "Play" msgstr "" -#: website/public/index.html:666 +#: website/public/index.html:668 msgctxt "page:index.html" msgid "Jump ↑" msgstr "" -#: website/public/index.html:667 +#: website/public/index.html:669 msgctxt "page:index.html" msgid "Restart" msgstr "" -#: website/public/index.html:670 +#: website/public/index.html:672 msgctxt "page:index.html" msgid "Speed" msgstr "" -#: website/public/index.html:680 +#: website/public/index.html:682 msgctxt "page:index.html" msgid "Use the recovered acceleration rule" msgstr "" -#: website/public/index.html:684 +#: website/public/index.html:686 msgctxt "page:index.html" msgid "Original rule: start at 6, then increase toward 13." msgstr "" -#: website/public/index.html:687 +#: website/public/index.html:689 msgctxt "page:index.html" msgid "Move the slider to set your own speed. Space or Jump clears a cactus." msgstr "" -#: website/public/index.html:692 +#: website/public/index.html:694 msgctxt "page:index.html" msgid "" "Enable JavaScript to play. You can still read the rule and open the source code below." msgstr "" -#: website/public/index.html:698 +#: website/public/index.html:700 msgctxt "page:index.html" msgid "Open the speed lab →" msgstr "" -#: website/public/index.html:704 +#: website/public/index.html:706 msgctxt "page:index.html" msgid "See the script, checks and how to try the analysis" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:707 +#: website/public/index.html:709 #, python-brace-format msgctxt "page:index.html" msgid "Inspected target: {ph0}wayou’s Chromium-derived browser edition{ph1}." msgstr "" #. {ph0}: index.js -#: website/public/index.html:715 +#: website/public/index.html:717 #, python-brace-format msgctxt "page:index.html" msgid "REA · loaded {ph0} · selected lines" msgstr "" -#: website/public/index.html:724 +#: website/public/index.html:726 msgctxt "page:index.html" msgid "Start at 6. Add 0.001 each update without a collision, while speed is below 13." msgstr "" -#: website/public/index.html:729 +#: website/public/index.html:731 msgctxt "page:index.html" msgid "What each part does" msgstr "" @@ -8046,7 +8046,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/index.html:731 +#: website/public/index.html:733 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8060,7 +8060,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/index.html:738 +#: website/public/index.html:740 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8074,7 +8074,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/index.html:746 +#: website/public/index.html:748 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8083,7 +8083,7 @@ msgid "" msgstr "" #. {ph0}: index.js -#: website/public/index.html:756 +#: website/public/index.html:758 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8091,12 +8091,12 @@ msgid "" "returned the loaded {ph0}, including its source and digest." msgstr "" -#: website/public/index.html:763 +#: website/public/index.html:765 msgctxt "page:index.html" msgid "Selected settings from the inspected script" msgstr "" -#: website/public/index.html:769 +#: website/public/index.html:771 msgctxt "page:index.html" msgid "" "We called the original game’s update function in a controlled browser check, with " @@ -8106,7 +8106,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:775 +#: website/public/index.html:777 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8119,7 +8119,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/index.html:781 +#: website/public/index.html:783 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8133,30 +8133,30 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/index.html:790 +#: website/public/index.html:792 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Inspected speed code{ph1} · {ph2}Chromium Authors · BSD license{ph3}" msgstr "" -#: website/public/index.html:807 +#: website/public/index.html:809 msgctxt "page:index.html" msgid "Example 02 · Windows Calculator" msgstr "" -#: website/public/index.html:808 +#: website/public/index.html:810 msgctxt "page:index.html" msgid "Rebuild Calculator’s % button." msgstr "" -#: website/public/index.html:810 +#: website/public/index.html:812 msgctxt "page:index.html" msgid "" "The % button does different things after + and ×. Let’s find both rules and try them " "in a small calculator." msgstr "" -#: website/public/index.html:816 +#: website/public/index.html:818 msgctxt "page:index.html" msgid "1. Ask about the % button" msgstr "" @@ -8169,7 +8169,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/index.html:819 +#: website/public/index.html:821 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example question · Calculator" @@ -8181,7 +8181,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/index.html:833 +#: website/public/index.html:835 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8189,18 +8189,18 @@ msgid "" "after + and ×, then build a small calculator that uses both.{ph3}{ph4}{ph5}" msgstr "" -#: website/public/index.html:842 +#: website/public/index.html:844 msgctxt "page:index.html" msgid "2. Find both rules" msgstr "" -#: website/public/index.html:843 +#: website/public/index.html:845 msgctxt "page:index.html" msgid "" "REA helps the agent read the code behind the % button. It applies two different rules:" msgstr "" -#: website/public/index.html:849 +#: website/public/index.html:851 msgctxt "page:index.html" msgid "With +" msgstr "" @@ -8208,13 +8208,13 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: 10% of 200 = 20 → 200 + 20 = 220 -#: website/public/index.html:850 +#: website/public/index.html:852 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Take 10% of the first number.{ph1}{ph2}" msgstr "" -#: website/public/index.html:856 +#: website/public/index.html:858 msgctxt "page:index.html" msgid "With ×" msgstr "" @@ -8222,56 +8222,56 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: 200 × 0.1 = 20 -#: website/public/index.html:857 +#: website/public/index.html:859 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Turn 10% into 0.1.{ph1}{ph2}" msgstr "" -#: website/public/index.html:864 +#: website/public/index.html:866 msgctxt "page:index.html" msgid "3. Try the % button" msgstr "" -#: website/public/index.html:865 +#: website/public/index.html:867 msgctxt "page:index.html" msgid "We recreated both rules below. Choose + or ×, press %, then press =." msgstr "" -#: website/public/index.html:913 +#: website/public/index.html:915 msgctxt "page:index.html" msgid "Reset" msgstr "" -#: website/public/index.html:921 +#: website/public/index.html:923 msgctxt "page:index.html" msgid "10% of 200 = 20. Then 200 + 20 = 220." msgstr "" -#: website/public/index.html:924 +#: website/public/index.html:926 msgctxt "page:index.html" msgid "Interactive illustration of the inspected percentage rule." msgstr "" -#: website/public/index.html:931 +#: website/public/index.html:933 msgctxt "page:index.html" msgid "See the real code and how the answer was checked" msgstr "" #. {ph0}: previous = 200 #. {ph1}: current = 10 -#: website/public/index.html:932 +#: website/public/index.html:934 #, python-brace-format msgctxt "page:index.html" msgid "For this example, {ph0} and {ph1}." msgstr "" -#: website/public/index.html:938 +#: website/public/index.html:940 msgctxt "page:index.html" msgid "Readable summary of the % handler" msgstr "" -#: website/public/index.html:947 +#: website/public/index.html:949 msgctxt "page:index.html" msgid "From the installed app to a working % button" msgstr "" @@ -8284,7 +8284,7 @@ msgstr "" #. {ph5}: #. {ph6}: ms-calculator: #. {ph7}: -#: website/public/index.html:951 +#: website/public/index.html:953 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8299,7 +8299,7 @@ msgstr "" #. {ph4}: #. {ph5}: 100 #. {ph6}: -#: website/public/index.html:960 +#: website/public/index.html:962 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8313,7 +8313,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/index.html:968 +#: website/public/index.html:970 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8322,17 +8322,17 @@ msgid "" "above.{ph5}" msgstr "" -#: website/public/index.html:982 +#: website/public/index.html:984 msgctxt "page:index.html" msgid "REA · selected original instructions" msgstr "" -#: website/public/index.html:993 +#: website/public/index.html:995 msgctxt "page:index.html" msgid "Operator IDs · Microsoft’s source" msgstr "" -#: website/public/index.html:1003 +#: website/public/index.html:1005 msgctxt "page:index.html" msgid "" "Inspected with REA 4.1.0: Windows Calculator 11.2508.4.0, x64. The readable summary " @@ -8349,7 +8349,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/index.html:1008 +#: website/public/index.html:1010 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8357,166 +8357,166 @@ msgid "" "setup guide{ph5}" msgstr "" -#: website/public/index.html:1028 +#: website/public/index.html:1030 msgctxt "page:index.html" msgid "REA case studies." msgstr "" -#: website/public/index.html:1029 +#: website/public/index.html:1031 msgctxt "page:index.html" msgid "Explore a feature in a released app or game, with code and checked results." msgstr "" -#: website/public/index.html:1034 +#: website/public/index.html:1036 msgctxt "page:index.html" msgid "Showcases →" msgstr "" -#: website/public/index.html:1038 +#: website/public/index.html:1040 msgctxt "page:index.html" msgid "Android · APK analysis" msgstr "" -#: website/public/index.html:1039 +#: website/public/index.html:1041 msgctxt "page:index.html" msgid "How an authenticator generates a login code" msgstr "" -#: website/public/index.html:1040 +#: website/public/index.html:1042 msgctxt "page:index.html" msgid "" "Trace Aegis's six-digit login code through its released APK, then move a demo clock to" " see why it changes every 30 seconds." msgstr "" -#: website/public/index.html:1044 +#: website/public/index.html:1046 msgctxt "page:index.html" msgid "Read the Android case study" msgstr "" -#: website/public/index.html:1049 +#: website/public/index.html:1051 msgctxt "page:index.html" msgid "Electron · Feature tracing" msgstr "" -#: website/public/index.html:1050 +#: website/public/index.html:1052 msgctxt "page:index.html" msgid "How Notion copies text and HTML" msgstr "" -#: website/public/index.html:1051 +#: website/public/index.html:1053 msgctxt "page:index.html" msgid "" "Follow Notion's packaged JavaScript to the system clipboard and see how a copy " "preserves rich block data." msgstr "" -#: website/public/index.html:1055 +#: website/public/index.html:1057 msgctxt "page:index.html" msgid "Read the Notion case study" msgstr "" -#: website/public/index.html:1060 +#: website/public/index.html:1062 msgctxt "page:index.html" msgid "Native · Reconstruction" msgstr "" -#: website/public/index.html:1061 +#: website/public/index.html:1063 msgctxt "page:index.html" msgid "DX-Ball's sound-pan calculation" msgstr "" -#: website/public/index.html:1062 +#: website/public/index.html:1064 msgctxt "page:index.html" msgid "Recover how a ball's position becomes left/right sound in a 1996 Windows game." msgstr "" -#: website/public/index.html:1066 +#: website/public/index.html:1068 msgctxt "page:index.html" msgid "Read the DX-Ball case study" msgstr "" -#: website/public/index.html:1077 +#: website/public/index.html:1079 msgctxt "page:index.html" msgid "Your first investigation" msgstr "" -#: website/public/index.html:1078 +#: website/public/index.html:1080 msgctxt "page:index.html" msgid "Try REA on a small app." msgstr "" -#: website/public/index.html:1079 +#: website/public/index.html:1081 msgctxt "page:index.html" msgid "Download our Notes example, trace its CSV export, and check one changed input." msgstr "" -#: website/public/index.html:1084 +#: website/public/index.html:1086 msgctxt "page:index.html" msgid "Try the guided example" msgstr "" -#: website/public/index.html:1093 +#: website/public/index.html:1095 msgctxt "page:index.html" msgid "Choose your target." msgstr "" -#: website/public/index.html:1094 +#: website/public/index.html:1096 msgctxt "page:index.html" msgid "These guides cover setup and a first investigation for each kind of software." msgstr "" -#: website/public/index.html:1101 +#: website/public/index.html:1103 msgctxt "page:index.html" msgid "Native binaries" msgstr "" -#: website/public/index.html:1102 +#: website/public/index.html:1104 msgctxt "page:index.html" msgid "" "Inspect functions, strings, references and call relationships in executables and " "libraries." msgstr "" -#: website/public/index.html:1106 +#: website/public/index.html:1108 msgctxt "page:index.html" msgid "Native analysis guide" msgstr "" -#: website/public/index.html:1109 +#: website/public/index.html:1111 msgctxt "page:index.html" msgid "JavaScript & Electron" msgstr "" -#: website/public/index.html:1110 +#: website/public/index.html:1112 msgctxt "page:index.html" msgid "" "Map modules, routes, IPC and native dependencies from an application folder or ASAR " "archive." msgstr "" -#: website/public/index.html:1114 +#: website/public/index.html:1116 msgctxt "page:index.html" msgid "Application workflows" msgstr "" -#: website/public/index.html:1117 +#: website/public/index.html:1119 msgctxt "page:index.html" msgid "Browser & runtime activity" msgstr "" -#: website/public/index.html:1118 +#: website/public/index.html:1120 msgctxt "page:index.html" msgid "" "Capture selected browser or process activity, then compare the results across runs." msgstr "" -#: website/public/index.html:1122 +#: website/public/index.html:1124 msgctxt "page:index.html" msgid "Browser observation guide" msgstr "" -#: website/public/index.html:1126 +#: website/public/index.html:1128 msgctxt "page:index.html" msgid "Try a larger project" msgstr "" @@ -8529,7 +8529,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/index.html:1131 +#: website/public/index.html:1133 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example prompt · Website" @@ -8542,14 +8542,14 @@ msgstr "" #. {ph4}: #. {ph5}: -#: website/public/index.html:1145 +#: website/public/index.html:1147 #, python-brace-format msgctxt "page:index.html" msgid "" "{ph0}›{ph1}{ph2}Use REA to inspect {ph3}. Clone this website for me.{ph4}{ph5}{ph6}" msgstr "" -#: website/public/index.html:1154 +#: website/public/index.html:1156 msgctxt "page:index.html" msgid "Yes, this one." msgstr "" @@ -8562,7 +8562,7 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/index.html:1159 +#: website/public/index.html:1161 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example prompt · Game reconstruction" @@ -8574,7 +8574,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/index.html:1173 +#: website/public/index.html:1175 #, python-brace-format msgctxt "page:index.html" msgid "" @@ -8584,20 +8584,20 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:1182 +#: website/public/index.html:1184 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}See the DX-Ball case study →{ph1}" msgstr "" -#: website/public/index.html:1193 +#: website/public/index.html:1195 msgctxt "page:index.html" msgid "Any questions?" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:1195 +#: website/public/index.html:1197 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Read the FAQ{ph1} — setup and common questions." @@ -8605,7 +8605,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:1198 +#: website/public/index.html:1200 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}Join Discord{ph1} — get help and discuss your investigations." @@ -8613,7 +8613,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/index.html:1202 +#: website/public/index.html:1204 #, python-brace-format msgctxt "page:index.html" msgid "{ph0}GitHub issues{ph1} — report a bug or request a feature." @@ -8631,68 +8631,68 @@ msgid "" "clear guides and try interactive examples with REA." msgstr "" -#: website/public/index.html:259 +#: website/public/index.html:261 msgctxt "page:index.html" msgid "Copy REA installation prompt" msgstr "" -#: website/public/index.html:283 +#: website/public/index.html:285 msgctxt "page:index.html" msgid "Copy setup command" msgstr "" -#: website/public/index.html:295 +#: website/public/index.html:297 msgctxt "page:index.html" msgid "Setup options" msgstr "" -#: website/public/index.html:363 +#: website/public/index.html:365 msgctxt "page:index.html" msgid "Follow the manual Calculator analysis" msgstr "" -#: website/public/index.html:519 +#: website/public/index.html:521 msgctxt "page:index.html" msgid "Copy Calculator percentage question" msgstr "" -#: website/public/index.html:600 +#: website/public/index.html:602 msgctxt "page:index.html" msgid "Copy dinosaur analysis prompt" msgstr "" -#: website/public/index.html:653 +#: website/public/index.html:655 msgctxt "page:index.html" msgid "" "Dinosaur mini-game. Use the Jump button or press Space while the game is focused." msgstr "" -#: website/public/index.html:824 +#: website/public/index.html:826 msgctxt "page:index.html" msgid "Copy Calculator analysis prompt" msgstr "" -#: website/public/index.html:870 +#: website/public/index.html:872 msgctxt "page:index.html" msgid "Choose the calculation" msgstr "" -#: website/public/index.html:1136 +#: website/public/index.html:1138 msgctxt "page:index.html" msgid "Copy website project prompt" msgstr "" -#: website/public/index.html:1164 +#: website/public/index.html:1166 msgctxt "page:index.html" msgid "Copy game reconstruction prompt" msgstr "" -#: website/public/index.html:1228 +#: website/public/index.html:1230 msgctxt "page:index.html" msgid "Back to top" msgstr "" -#: website/public/showcase/aegis/index.html:108 +#: website/public/showcase/aegis/index.html:110 msgctxt "page:showcase/aegis/index.html" msgid "Skip to content" msgstr "" @@ -8701,42 +8701,42 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/aegis/index.html:200 +#: website/public/showcase/aegis/index.html:202 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / Android" msgstr "" -#: website/public/showcase/aegis/index.html:203 +#: website/public/showcase/aegis/index.html:205 msgctxt "page:showcase/aegis/index.html" msgid "Case study · Aegis Authenticator" msgstr "" #. {ph0}:
-#: website/public/showcase/aegis/index.html:204 +#: website/public/showcase/aegis/index.html:206 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "How does an authenticator{ph0}generate a login code?" msgstr "" -#: website/public/showcase/aegis/index.html:205 +#: website/public/showcase/aegis/index.html:207 msgctxt "page:showcase/aegis/index.html" msgid "" "A six-digit code changes every 30 seconds. Use REA to find the calculation in an " "Android APK, then rebuild it with a clock you can control." msgstr "" -#: website/public/showcase/aegis/index.html:210 +#: website/public/showcase/aegis/index.html:212 msgctxt "page:showcase/aegis/index.html" msgid "Aegis 3.4.3 · Android · Official release APK · 6.9 MB" msgstr "" -#: website/public/showcase/aegis/index.html:213 +#: website/public/showcase/aegis/index.html:215 msgctxt "page:showcase/aegis/index.html" msgid "View Aegis on GitHub" msgstr "" -#: website/public/showcase/aegis/index.html:219 +#: website/public/showcase/aegis/index.html:221 msgctxt "page:showcase/aegis/index.html" msgid "From an APK to a code you can reproduce" msgstr "" @@ -8747,7 +8747,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/aegis/index.html:221 +#: website/public/showcase/aegis/index.html:223 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -8761,7 +8761,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/aegis/index.html:230 +#: website/public/showcase/aegis/index.html:232 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -8775,7 +8775,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/aegis/index.html:238 +#: website/public/showcase/aegis/index.html:240 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -8783,14 +8783,14 @@ msgid "" "browser demo reproduces the rule and checks it against public reference cases.{ph5}" msgstr "" -#: website/public/showcase/aegis/index.html:251 +#: website/public/showcase/aegis/index.html:253 msgctxt "page:showcase/aegis/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:253 +#: website/public/showcase/aegis/index.html:255 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Ask your agent{ph1}" @@ -8798,7 +8798,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:254 +#: website/public/showcase/aegis/index.html:256 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Try the code generator{ph1}" @@ -8806,7 +8806,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:255 +#: website/public/showcase/aegis/index.html:257 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Find the code with REA{ph1}" @@ -8814,7 +8814,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:256 +#: website/public/showcase/aegis/index.html:258 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Read the calculation{ph1}" @@ -8822,7 +8822,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:257 +#: website/public/showcase/aegis/index.html:259 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Check the reconstruction{ph1}" @@ -8830,20 +8830,20 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:258 +#: website/public/showcase/aegis/index.html:260 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Inspect the APK yourself{ph1}" msgstr "" -#: website/public/showcase/aegis/index.html:263 +#: website/public/showcase/aegis/index.html:265 msgctxt "page:showcase/aegis/index.html" msgid "Ask your agent" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:264 +#: website/public/showcase/aegis/index.html:266 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -8859,14 +8859,14 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/showcase/aegis/index.html:270 +#: website/public/showcase/aegis/index.html:272 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" -#: website/public/showcase/aegis/index.html:274 -#: website/public/showcase/aegis/index.html:737 +#: website/public/showcase/aegis/index.html:276 +#: website/public/showcase/aegis/index.html:739 msgctxt "page:showcase/aegis/index.html" msgid "Copy" msgstr "" @@ -8878,7 +8878,7 @@ msgstr "" #. {ph4}: #. {ph5}: -#: website/public/showcase/aegis/index.html:283 +#: website/public/showcase/aegis/index.html:285 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -8889,7 +8889,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:294 +#: website/public/showcase/aegis/index.html:296 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -8897,14 +8897,14 @@ msgid "" "{ph0}Get the APK and analysis setup ↓{ph1}" msgstr "" -#: website/public/showcase/aegis/index.html:302 +#: website/public/showcase/aegis/index.html:304 msgctxt "page:showcase/aegis/index.html" msgid "Try the code generator" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:303 +#: website/public/showcase/aegis/index.html:305 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -8912,33 +8912,33 @@ msgid "" " the account key to generate a code. The same key and block produce the same code." msgstr "" -#: website/public/showcase/aegis/index.html:310 +#: website/public/showcase/aegis/index.html:312 msgctxt "page:showcase/aegis/index.html" msgid "Move the clock across 60 seconds" msgstr "" -#: website/public/showcase/aegis/index.html:313 +#: website/public/showcase/aegis/index.html:315 msgctxt "page:showcase/aegis/index.html" msgid "Time" msgstr "" -#: website/public/showcase/aegis/index.html:315 +#: website/public/showcase/aegis/index.html:317 msgctxt "page:showcase/aegis/index.html" msgid "seconds" msgstr "" -#: website/public/showcase/aegis/index.html:316 +#: website/public/showcase/aegis/index.html:318 msgctxt "page:showcase/aegis/index.html" msgid "Our adjustable example clock" msgstr "" -#: website/public/showcase/aegis/index.html:319 +#: website/public/showcase/aegis/index.html:321 msgctxt "page:showcase/aegis/index.html" msgid "30-second block" msgstr "" -#: website/public/showcase/aegis/index.html:321 -#: website/public/showcase/aegis/index.html:648 +#: website/public/showcase/aegis/index.html:323 +#: website/public/showcase/aegis/index.html:650 msgctxt "page:showcase/aegis/index.html" msgid "Block" msgstr "" @@ -8947,35 +8947,35 @@ msgstr "" #. {ph1}:
#. {ph2}: #. {ph3}: -#: website/public/showcase/aegis/index.html:322 +#: website/public/showcase/aegis/index.html:324 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}{ph1}{ph2}30–59 seconds{ph3}" msgstr "" -#: website/public/showcase/aegis/index.html:330 +#: website/public/showcase/aegis/index.html:332 msgctxt "page:showcase/aegis/index.html" msgid "Generated code" msgstr "" -#: website/public/showcase/aegis/index.html:338 +#: website/public/showcase/aegis/index.html:340 msgctxt "page:showcase/aegis/index.html" msgid "Account key + block → six digits" msgstr "" -#: website/public/showcase/aegis/index.html:344 +#: website/public/showcase/aegis/index.html:346 msgctxt "page:showcase/aegis/index.html" msgid "Example time, in seconds" msgstr "" -#: website/public/showcase/aegis/index.html:359 -#: website/public/showcase/aegis/index.html:659 +#: website/public/showcase/aegis/index.html:361 +#: website/public/showcase/aegis/index.html:661 msgctxt "page:showcase/aegis/index.html" msgid "59 seconds" msgstr "" -#: website/public/showcase/aegis/index.html:366 -#: website/public/showcase/aegis/index.html:664 +#: website/public/showcase/aegis/index.html:368 +#: website/public/showcase/aegis/index.html:666 msgctxt "page:showcase/aegis/index.html" msgid "60 seconds" msgstr "" @@ -8984,7 +8984,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/aegis/index.html:375 +#: website/public/showcase/aegis/index.html:377 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -8994,7 +8994,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:382 +#: website/public/showcase/aegis/index.html:384 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9002,35 +9002,35 @@ msgid "" "calculation recovered from the APK." msgstr "" -#: website/public/showcase/aegis/index.html:389 +#: website/public/showcase/aegis/index.html:391 msgctxt "page:showcase/aegis/index.html" msgid "" "The diagram shows the result at 59 seconds. Enable JavaScript to change the clock." msgstr "" -#: website/public/showcase/aegis/index.html:398 +#: website/public/showcase/aegis/index.html:400 msgctxt "page:showcase/aegis/index.html" msgid "Find the code with REA" msgstr "" -#: website/public/showcase/aegis/index.html:401 +#: website/public/showcase/aegis/index.html:403 msgctxt "page:showcase/aegis/index.html" msgid "Narrow the APK to three classes" msgstr "" -#: website/public/showcase/aegis/index.html:404 -#: website/public/showcase/aegis/index.html:436 +#: website/public/showcase/aegis/index.html:406 +#: website/public/showcase/aegis/index.html:438 msgctxt "page:showcase/aegis/index.html" msgid "Agent → REA" msgstr "" -#: website/public/showcase/aegis/index.html:414 +#: website/public/showcase/aegis/index.html:416 msgctxt "page:showcase/aegis/index.html" msgid "REA → agent · selected results" msgstr "" #. {ph0}: TotpInfo -#: website/public/showcase/aegis/index.html:426 +#: website/public/showcase/aegis/index.html:428 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9038,19 +9038,19 @@ msgid "" "imported accounts. TOTP means a time-based one-time password." msgstr "" -#: website/public/showcase/aegis/index.html:433 +#: website/public/showcase/aegis/index.html:435 msgctxt "page:showcase/aegis/index.html" msgid "Connect the generator to the app's display" msgstr "" -#: website/public/showcase/aegis/index.html:450 +#: website/public/showcase/aegis/index.html:452 msgctxt "page:showcase/aegis/index.html" msgid "REA → agent · methods and callers" msgstr "" #. {ph0}: EntryHolder.getOtp #. {ph1}: TotpInfo.getOtp(timestamp) -#: website/public/showcase/aegis/index.html:461 +#: website/public/showcase/aegis/index.html:463 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9059,21 +9059,21 @@ msgid "" msgstr "" #. {ph0}: com.beemdevelopment.aegis -#: website/public/showcase/aegis/index.html:469 +#: website/public/showcase/aegis/index.html:471 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" "Requests show a shortened input path. Result class names omit the common {ph0} prefix." msgstr "" -#: website/public/showcase/aegis/index.html:476 +#: website/public/showcase/aegis/index.html:478 msgctxt "page:showcase/aegis/index.html" msgid "Read the calculation" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:477 +#: website/public/showcase/aegis/index.html:479 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9084,7 +9084,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:492 +#: website/public/showcase/aegis/index.html:494 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}01{ph1} Time block" @@ -9092,7 +9092,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:500 +#: website/public/showcase/aegis/index.html:502 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}02{ph1} Key + block" @@ -9100,25 +9100,25 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:508 +#: website/public/showcase/aegis/index.html:510 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}03{ph1} Six digits" msgstr "" -#: website/public/showcase/aegis/index.html:520 +#: website/public/showcase/aegis/index.html:522 msgctxt "page:showcase/aegis/index.html" msgid "REA · selected decompiled Java" msgstr "" -#: website/public/showcase/aegis/index.html:550 +#: website/public/showcase/aegis/index.html:552 msgctxt "page:showcase/aegis/index.html" msgid "Readable summary · agent's interpretation" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:567 +#: website/public/showcase/aegis/index.html:569 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9128,7 +9128,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:573 +#: website/public/showcase/aegis/index.html:575 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9138,7 +9138,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:580 +#: website/public/showcase/aegis/index.html:582 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9150,7 +9150,7 @@ msgstr "" #. href="https://github.com/beemdevelopment/Aegis/blob/d6f4e5925a97e4e91593f1542085eae03432a759/LICENSE" #. > #. {ph1}: -#: website/public/showcase/aegis/index.html:587 +#: website/public/showcase/aegis/index.html:589 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9158,7 +9158,7 @@ msgid "" "panel is an explanatory summary. {ph0}Aegis code is GPL-3.0.{ph1}" msgstr "" -#: website/public/showcase/aegis/index.html:596 +#: website/public/showcase/aegis/index.html:598 msgctxt "page:showcase/aegis/index.html" msgid "Inside the generator" msgstr "" @@ -9167,7 +9167,7 @@ msgstr "" #. {ph1}: kotlin.ExceptionsKt #. {ph2}: TotpInfo #. {ph3}: HOTP -#: website/public/showcase/aegis/index.html:597 +#: website/public/showcase/aegis/index.html:599 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9175,12 +9175,12 @@ msgid "" " body; the original source calls the helper {ph3}." msgstr "" -#: website/public/showcase/aegis/index.html:605 +#: website/public/showcase/aegis/index.html:607 msgctxt "page:showcase/aegis/index.html" msgid "REA · generateOTP, complete body" msgstr "" -#: website/public/showcase/aegis/index.html:619 +#: website/public/showcase/aegis/index.html:621 msgctxt "page:showcase/aegis/index.html" msgid "" "The last hash byte selects a position. Four bytes at that position provide a positive " @@ -9193,20 +9193,20 @@ msgstr "" #. href="https://github.com/beemdevelopment/Aegis/blob/d6f4e5925a97e4e91593f1542085eae03432a759/app/src/main/java/com/beemdevelopment/aegis/crypto/otp/HOTP.java" #. > #. {ph1}: -#: website/public/showcase/aegis/index.html:626 +#: website/public/showcase/aegis/index.html:628 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}Compare with the matching release source{ph1}." msgstr "" -#: website/public/showcase/aegis/index.html:636 +#: website/public/showcase/aegis/index.html:638 msgctxt "page:showcase/aegis/index.html" msgid "Check the reconstruction" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:637 +#: website/public/showcase/aegis/index.html:639 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9215,29 +9215,29 @@ msgid "" "time-block boundaries and codes beginning with zero." msgstr "" -#: website/public/showcase/aegis/index.html:647 +#: website/public/showcase/aegis/index.html:649 msgctxt "page:showcase/aegis/index.html" msgid "Example time" msgstr "" -#: website/public/showcase/aegis/index.html:649 +#: website/public/showcase/aegis/index.html:651 msgctxt "page:showcase/aegis/index.html" msgid "Six-digit code" msgstr "" -#: website/public/showcase/aegis/index.html:654 +#: website/public/showcase/aegis/index.html:656 msgctxt "page:showcase/aegis/index.html" msgid "30 seconds" msgstr "" -#: website/public/showcase/aegis/index.html:669 +#: website/public/showcase/aegis/index.html:671 msgctxt "page:showcase/aegis/index.html" msgid "1,111,111,109 seconds" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:676 +#: website/public/showcase/aegis/index.html:678 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9245,37 +9245,37 @@ msgid "" "6238{ph1}. Check the browser implementation against them:" msgstr "" -#: website/public/showcase/aegis/index.html:684 +#: website/public/showcase/aegis/index.html:686 msgctxt "page:showcase/aegis/index.html" msgid "Run reference checks" msgstr "" -#: website/public/showcase/aegis/index.html:691 +#: website/public/showcase/aegis/index.html:693 msgctxt "page:showcase/aegis/index.html" msgid "Read the demo's calculation" msgstr "" -#: website/public/showcase/aegis/index.html:695 +#: website/public/showcase/aegis/index.html:697 msgctxt "page:showcase/aegis/index.html" msgid "" "The reference cases use eight digits. The check also verifies their six-digit results." msgstr "" -#: website/public/showcase/aegis/index.html:704 +#: website/public/showcase/aegis/index.html:706 msgctxt "page:showcase/aegis/index.html" msgid "" "Verification runs extracted Java methods and the new demo. The Android APK was " "inspected statically." msgstr "" -#: website/public/showcase/aegis/index.html:711 +#: website/public/showcase/aegis/index.html:713 msgctxt "page:showcase/aegis/index.html" msgid "Inspect the APK yourself" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:712 +#: website/public/showcase/aegis/index.html:714 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9285,7 +9285,7 @@ msgstr "" #. {ph0}: JAVA_HOME #. {ph1}: PATH -#: website/public/showcase/aegis/index.html:717 +#: website/public/showcase/aegis/index.html:719 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9293,28 +9293,28 @@ msgid "" "case used JDK 21." msgstr "" -#: website/public/showcase/aegis/index.html:723 +#: website/public/showcase/aegis/index.html:725 msgctxt "page:showcase/aegis/index.html" msgid "Download Aegis APK" msgstr "" -#: website/public/showcase/aegis/index.html:727 +#: website/public/showcase/aegis/index.html:729 msgctxt "page:showcase/aegis/index.html" msgid "Download Android analysis provider" msgstr "" -#: website/public/showcase/aegis/index.html:733 +#: website/public/showcase/aegis/index.html:735 msgctxt "page:showcase/aegis/index.html" msgid "Point REA at the provider file and inspect the APK:" msgstr "" -#: website/public/showcase/aegis/index.html:736 +#: website/public/showcase/aegis/index.html:738 msgctxt "page:showcase/aegis/index.html" msgid "macOS / Linux" msgstr "" #. {ph0}: REA_JADX_MCP_JAR -#: website/public/showcase/aegis/index.html:750 +#: website/public/showcase/aegis/index.html:752 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9324,7 +9324,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/aegis/index.html:755 +#: website/public/showcase/aegis/index.html:757 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9332,7 +9332,7 @@ msgid "" "time interval?{ph1}" msgstr "" -#: website/public/showcase/aegis/index.html:765 +#: website/public/showcase/aegis/index.html:767 msgctxt "page:showcase/aegis/index.html" msgid "Sources" msgstr "" @@ -9347,7 +9347,7 @@ msgstr "" #. href="https://github.com/beemdevelopment/Aegis/blob/d6f4e5925a97e4e91593f1542085eae03432a759/LICENSE" #. > #. {ph5}: -#: website/public/showcase/aegis/index.html:767 +#: website/public/showcase/aegis/index.html:769 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "" @@ -9359,13 +9359,13 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/aegis/index.html:783 +#: website/public/showcase/aegis/index.html:785 #, python-brace-format msgctxt "page:showcase/aegis/index.html" msgid "{ph0}RFC 6238 reference cases{ph1} · {ph2}Demo test data{ph3}" msgstr "" -#: website/public/showcase/aegis/index.html:790 +#: website/public/showcase/aegis/index.html:792 msgctxt "page:showcase/aegis/index.html" msgid "" "Inspected with REA 6.1.0 on 9 October 2026. Decompiled excerpts are credited to Aegis;" @@ -9384,37 +9384,37 @@ msgid "" "and try a reconstruction with an adjustable clock." msgstr "" -#: website/public/showcase/aegis/index.html:250 +#: website/public/showcase/aegis/index.html:252 msgctxt "page:showcase/aegis/index.html" msgid "On this page" msgstr "" -#: website/public/showcase/aegis/index.html:261 +#: website/public/showcase/aegis/index.html:263 msgctxt "page:showcase/aegis/index.html" msgid "Aegis APK case study" msgstr "" -#: website/public/showcase/aegis/index.html:274 +#: website/public/showcase/aegis/index.html:276 msgctxt "page:showcase/aegis/index.html" msgid "Copy Aegis example prompt" msgstr "" -#: website/public/showcase/aegis/index.html:487 +#: website/public/showcase/aegis/index.html:489 msgctxt "page:showcase/aegis/index.html" msgid "Follow the login-code calculation" msgstr "" -#: website/public/showcase/aegis/index.html:737 +#: website/public/showcase/aegis/index.html:739 msgctxt "page:showcase/aegis/index.html" msgid "Copy APK inspection command" msgstr "" -#: website/public/showcase/aegis/index.html:814 +#: website/public/showcase/aegis/index.html:816 msgctxt "page:showcase/aegis/index.html" msgid "Back to top" msgstr "" -#: website/public/showcase/ctf/index.html:107 +#: website/public/showcase/ctf/index.html:109 msgctxt "page:showcase/ctf/index.html" msgid "Skip to content" msgstr "" @@ -9423,26 +9423,26 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/ctf/index.html:199 +#: website/public/showcase/ctf/index.html:201 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / CTF" msgstr "" -#: website/public/showcase/ctf/index.html:202 +#: website/public/showcase/ctf/index.html:204 msgctxt "page:showcase/ctf/index.html" msgid "Case study · DownUnderCTF 2023" msgstr "" #. {ph0}:
-#: website/public/showcase/ctf/index.html:203 +#: website/public/showcase/ctf/index.html:205 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "Find the flag in{ph0}a CTF binary." msgstr "" #. {ph0}: Correct! -#: website/public/showcase/ctf/index.html:204 +#: website/public/showcase/ctf/index.html:206 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9450,17 +9450,17 @@ msgid "" "input that makes the original program print {ph0}." msgstr "" -#: website/public/showcase/ctf/index.html:209 +#: website/public/showcase/ctf/index.html:211 msgctxt "page:showcase/ctf/index.html" msgid "masked squares flag checker · Easy · Linux x86-64" msgstr "" -#: website/public/showcase/ctf/index.html:212 +#: website/public/showcase/ctf/index.html:214 msgctxt "page:showcase/ctf/index.html" msgid "View the original challenge" msgstr "" -#: website/public/showcase/ctf/index.html:220 +#: website/public/showcase/ctf/index.html:222 msgctxt "page:showcase/ctf/index.html" msgid "From a binary to a checked answer" msgstr "" @@ -9471,7 +9471,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/ctf/index.html:222 +#: website/public/showcase/ctf/index.html:224 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9485,7 +9485,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/ctf/index.html:230 +#: website/public/showcase/ctf/index.html:232 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9499,7 +9499,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/ctf/index.html:238 +#: website/public/showcase/ctf/index.html:240 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9507,19 +9507,19 @@ msgid "" "solves the equations. REA captures the original program accepting the result.{ph5}" msgstr "" -#: website/public/showcase/ctf/index.html:247 +#: website/public/showcase/ctf/index.html:249 msgctxt "page:showcase/ctf/index.html" msgid "The challenge is by joseph, published in DownUnderCTF's official repository." msgstr "" -#: website/public/showcase/ctf/index.html:255 +#: website/public/showcase/ctf/index.html:257 msgctxt "page:showcase/ctf/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:257 +#: website/public/showcase/ctf/index.html:259 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Find the checking code{ph1}" @@ -9527,7 +9527,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:258 +#: website/public/showcase/ctf/index.html:260 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Read one mask{ph1}" @@ -9535,7 +9535,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:259 +#: website/public/showcase/ctf/index.html:261 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Assembly to readable code{ph1}" @@ -9543,7 +9543,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:260 +#: website/public/showcase/ctf/index.html:262 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Solve the equations{ph1}" @@ -9551,7 +9551,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:261 +#: website/public/showcase/ctf/index.html:263 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Check the answer{ph1}" @@ -9559,20 +9559,20 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:262 +#: website/public/showcase/ctf/index.html:264 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}Try it yourself{ph1}" msgstr "" -#: website/public/showcase/ctf/index.html:267 +#: website/public/showcase/ctf/index.html:269 msgctxt "page:showcase/ctf/index.html" msgid "Find the checking code" msgstr "" #. {ph0}: Correct! #. {ph1}: Incorrect! -#: website/public/showcase/ctf/index.html:268 +#: website/public/showcase/ctf/index.html:270 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9588,15 +9588,15 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/showcase/ctf/index.html:275 +#: website/public/showcase/ctf/index.html:277 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" -#: website/public/showcase/ctf/index.html:280 website/public/showcase/ctf/index.html:499 -#: website/public/showcase/ctf/index.html:523 website/public/showcase/ctf/index.html:593 -#: website/public/showcase/ctf/index.html:740 +#: website/public/showcase/ctf/index.html:282 website/public/showcase/ctf/index.html:501 +#: website/public/showcase/ctf/index.html:525 website/public/showcase/ctf/index.html:595 +#: website/public/showcase/ctf/index.html:742 msgctxt "page:showcase/ctf/index.html" msgid "Copy" msgstr "" @@ -9607,7 +9607,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/showcase/ctf/index.html:289 +#: website/public/showcase/ctf/index.html:291 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9615,48 +9615,48 @@ msgid "" "checks work, then verify the answer with the original program.{ph3}{ph4}{ph5}" msgstr "" -#: website/public/showcase/ctf/index.html:298 +#: website/public/showcase/ctf/index.html:300 msgctxt "page:showcase/ctf/index.html" msgid "" "An example prompt, with the downloaded challenge available locally and a native " "analysis provider connected." msgstr "" -#: website/public/showcase/ctf/index.html:304 +#: website/public/showcase/ctf/index.html:306 msgctxt "page:showcase/ctf/index.html" msgid "Follow the input prompt to its function" msgstr "" -#: website/public/showcase/ctf/index.html:307 website/public/showcase/ctf/index.html:343 +#: website/public/showcase/ctf/index.html:309 website/public/showcase/ctf/index.html:345 msgctxt "page:showcase/ctf/index.html" msgid "Agent → REA" msgstr "" -#: website/public/showcase/ctf/index.html:323 +#: website/public/showcase/ctf/index.html:325 msgctxt "page:showcase/ctf/index.html" msgid "REA → agent · selected results" msgstr "" -#: website/public/showcase/ctf/index.html:333 +#: website/public/showcase/ctf/index.html:335 msgctxt "page:showcase/ctf/index.html" msgid "" "The reference gives the agent a place to investigate, even though the executable's " "original function names have been removed." msgstr "" -#: website/public/showcase/ctf/index.html:340 +#: website/public/showcase/ctf/index.html:342 msgctxt "page:showcase/ctf/index.html" msgid "Read the checker and its two helpers" msgstr "" -#: website/public/showcase/ctf/index.html:355 +#: website/public/showcase/ctf/index.html:357 msgctxt "page:showcase/ctf/index.html" msgid "REA → agent · selected instructions" msgstr "" #. {ph0}: 0x18 #. {ph1}: 0x270 -#: website/public/showcase/ctf/index.html:368 +#: website/public/showcase/ctf/index.html:370 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9665,19 +9665,19 @@ msgid "" "across {ph1} bytes give 26 masks." msgstr "" -#: website/public/showcase/ctf/index.html:376 +#: website/public/showcase/ctf/index.html:378 msgctxt "page:showcase/ctf/index.html" msgid "" "These are selected results from a fresh REA analysis. The local target path is " "shortened for display; addresses refer to REA's imported image." msgstr "" -#: website/public/showcase/ctf/index.html:384 +#: website/public/showcase/ctf/index.html:386 msgctxt "page:showcase/ctf/index.html" msgid "One check reveals one character" msgstr "" -#: website/public/showcase/ctf/index.html:385 +#: website/public/showcase/ctf/index.html:387 msgctxt "page:showcase/ctf/index.html" msgid "" "The checker arranges the input in a 6×6 grid. A mask chooses which cells contribute to" @@ -9687,23 +9687,23 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:405 +#: website/public/showcase/ctf/index.html:407 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "The seventh check selects just one position. {ph0}Open figure{ph1}." msgstr "" -#: website/public/showcase/ctf/index.html:412 +#: website/public/showcase/ctf/index.html:414 msgctxt "page:showcase/ctf/index.html" msgid "Read the mask and its target from the binary" msgstr "" -#: website/public/showcase/ctf/index.html:418 +#: website/public/showcase/ctf/index.html:420 msgctxt "page:showcase/ctf/index.html" msgid "Agent → REA · read_bytes" msgstr "" -#: website/public/showcase/ctf/index.html:425 +#: website/public/showcase/ctf/index.html:427 msgctxt "page:showcase/ctf/index.html" msgid "REA → agent · seventh entries" msgstr "" @@ -9712,7 +9712,7 @@ msgstr "" #. {ph1}: eb #. {ph2}: code[21] = 55 #. {ph3}: 7 -#: website/public/showcase/ctf/index.html:434 +#: website/public/showcase/ctf/index.html:436 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9721,12 +9721,12 @@ msgid "" "{ph2}, so that character is {ph3}." msgstr "" -#: website/public/showcase/ctf/index.html:443 +#: website/public/showcase/ctf/index.html:445 msgctxt "page:showcase/ctf/index.html" msgid "From instructions to a readable check" msgstr "" -#: website/public/showcase/ctf/index.html:444 +#: website/public/showcase/ctf/index.html:446 msgctxt "page:showcase/ctf/index.html" msgid "" "Select a step to connect the summing helper and its caller to the same rule in C." @@ -9734,7 +9734,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:454 +#: website/public/showcase/ctf/index.html:456 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}01{ph1} Start" @@ -9742,7 +9742,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:462 +#: website/public/showcase/ctf/index.html:464 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}02{ph1} Select" @@ -9750,7 +9750,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:470 +#: website/public/showcase/ctf/index.html:472 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}03{ph1} Add" @@ -9758,7 +9758,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:478 +#: website/public/showcase/ctf/index.html:480 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}04{ph1} Advance" @@ -9766,18 +9766,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:486 +#: website/public/showcase/ctf/index.html:488 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}05{ph1} Compare" msgstr "" -#: website/public/showcase/ctf/index.html:498 +#: website/public/showcase/ctf/index.html:500 msgctxt "page:showcase/ctf/index.html" msgid "REA · selected original instructions" msgstr "" -#: website/public/showcase/ctf/index.html:522 +#: website/public/showcase/ctf/index.html:524 msgctxt "page:showcase/ctf/index.html" msgid "Readable C · one-check summary" msgstr "" @@ -9785,7 +9785,7 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: ECX -#: website/public/showcase/ctf/index.html:551 +#: website/public/showcase/ctf/index.html:553 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "{ph0}01 · Start at zero.{ph1} {ph2} holds the running sum." @@ -9793,7 +9793,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:555 +#: website/public/showcase/ctf/index.html:557 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9803,7 +9803,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:559 +#: website/public/showcase/ctf/index.html:561 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9813,7 +9813,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/ctf/index.html:563 +#: website/public/showcase/ctf/index.html:565 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9825,7 +9825,7 @@ msgstr "" #. {ph1}: #. {ph2}: EAX #. {ph3}: Incorrect! -#: website/public/showcase/ctf/index.html:568 +#: website/public/showcase/ctf/index.html:570 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9833,19 +9833,19 @@ msgid "" " mismatch jumps to {ph3}." msgstr "" -#: website/public/showcase/ctf/index.html:575 +#: website/public/showcase/ctf/index.html:577 msgctxt "page:showcase/ctf/index.html" msgid "" "The instructions come from the summing helper and its caller. The C is an explanatory " "summary with descriptive names and a flattened 36-cell loop." msgstr "" -#: website/public/showcase/ctf/index.html:583 +#: website/public/showcase/ctf/index.html:585 msgctxt "page:showcase/ctf/index.html" msgid "Solve the 26 equations" msgstr "" -#: website/public/showcase/ctf/index.html:584 +#: website/public/showcase/ctf/index.html:586 msgctxt "page:showcase/ctf/index.html" msgid "" "Most masks select several cells. For example, the first check adds 16 character codes " @@ -9853,13 +9853,13 @@ msgid "" "Python script can solve together." msgstr "" -#: website/public/showcase/ctf/index.html:592 +#: website/public/showcase/ctf/index.html:594 msgctxt "page:showcase/ctf/index.html" msgid "Python · solver excerpt" msgstr "" #. {ph0}: DUCTF{…} -#: website/public/showcase/ctf/index.html:620 +#: website/public/showcase/ctf/index.html:622 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9868,19 +9868,19 @@ msgid "" "braces. The complete download includes all 26 masks and targets." msgstr "" -#: website/public/showcase/ctf/index.html:626 +#: website/public/showcase/ctf/index.html:628 msgctxt "page:showcase/ctf/index.html" msgid "Download the complete solver" msgstr "" -#: website/public/showcase/ctf/index.html:632 +#: website/public/showcase/ctf/index.html:634 msgctxt "page:showcase/ctf/index.html" msgid "Check the answer with the original program" msgstr "" #. {ph0}: z #. {ph1}: y -#: website/public/showcase/ctf/index.html:633 +#: website/public/showcase/ctf/index.html:635 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9889,71 +9889,71 @@ msgid "" "of 1441, and the program rejects it." msgstr "" -#: website/public/showcase/ctf/index.html:643 +#: website/public/showcase/ctf/index.html:645 msgctxt "page:showcase/ctf/index.html" msgid "Input" msgstr "" -#: website/public/showcase/ctf/index.html:644 +#: website/public/showcase/ctf/index.html:646 msgctxt "page:showcase/ctf/index.html" msgid "Observed output" msgstr "" -#: website/public/showcase/ctf/index.html:645 +#: website/public/showcase/ctf/index.html:647 msgctxt "page:showcase/ctf/index.html" msgid "Exit code" msgstr "" -#: website/public/showcase/ctf/index.html:650 +#: website/public/showcase/ctf/index.html:652 msgctxt "page:showcase/ctf/index.html" msgid "Solver's flag" msgstr "" -#: website/public/showcase/ctf/index.html:655 +#: website/public/showcase/ctf/index.html:657 msgctxt "page:showcase/ctf/index.html" msgid "One character changed" msgstr "" -#: website/public/showcase/ctf/index.html:663 +#: website/public/showcase/ctf/index.html:665 msgctxt "page:showcase/ctf/index.html" msgid "Show the recovered flag and captured output" msgstr "" -#: website/public/showcase/ctf/index.html:666 +#: website/public/showcase/ctf/index.html:668 msgctxt "page:showcase/ctf/index.html" msgid "REA · original program output" msgstr "" -#: website/public/showcase/ctf/index.html:667 +#: website/public/showcase/ctf/index.html:669 msgctxt "page:showcase/ctf/index.html" msgid "Copy flag" msgstr "" -#: website/public/showcase/ctf/index.html:679 +#: website/public/showcase/ctf/index.html:681 msgctxt "page:showcase/ctf/index.html" msgid "" "The recovered value also matches the flag in the organizers' published challenge " "metadata, checked after solving the binary." msgstr "" -#: website/public/showcase/ctf/index.html:685 +#: website/public/showcase/ctf/index.html:687 msgctxt "page:showcase/ctf/index.html" msgid "Source, target identity and analysis details" msgstr "" -#: website/public/showcase/ctf/index.html:686 +#: website/public/showcase/ctf/index.html:688 msgctxt "page:showcase/ctf/index.html" msgid "" "Fresh analysis and two process captures on 8 October 2026, using REA 4.1.0 with Ghidra" " 12.1.4 on Linux x64. The binary is a stripped x86-64 ELF, 15,248 bytes." msgstr "" -#: website/public/showcase/ctf/index.html:693 +#: website/public/showcase/ctf/index.html:695 msgctxt "page:showcase/ctf/index.html" msgid "Original executable · SHA-256" msgstr "" -#: website/public/showcase/ctf/index.html:697 +#: website/public/showcase/ctf/index.html:699 msgctxt "page:showcase/ctf/index.html" msgid "" "The string references, functions and constants were inspected before reading the " @@ -9972,7 +9972,7 @@ msgstr "" #. {ph4}: #. {ph5}: -#: website/public/showcase/ctf/index.html:702 +#: website/public/showcase/ctf/index.html:704 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -9980,35 +9980,35 @@ msgid "" "· {ph4}REA evidence notes{ph5}" msgstr "" -#: website/public/showcase/ctf/index.html:722 +#: website/public/showcase/ctf/index.html:724 msgctxt "page:showcase/ctf/index.html" msgid "Try it yourself" msgstr "" -#: website/public/showcase/ctf/index.html:723 +#: website/public/showcase/ctf/index.html:725 msgctxt "page:showcase/ctf/index.html" msgid "" "Download the original challenge and the solver into one folder. Use the prompt above " "to investigate with your agent, or run the included script." msgstr "" -#: website/public/showcase/ctf/index.html:729 +#: website/public/showcase/ctf/index.html:731 msgctxt "page:showcase/ctf/index.html" msgid "Download the original challenge" msgstr "" -#: website/public/showcase/ctf/index.html:733 +#: website/public/showcase/ctf/index.html:735 msgctxt "page:showcase/ctf/index.html" msgid "Download solver" msgstr "" -#: website/public/showcase/ctf/index.html:739 +#: website/public/showcase/ctf/index.html:741 msgctxt "page:showcase/ctf/index.html" msgid "Terminal · solve and run" msgstr "" #. {ph0}: z3-solver -#: website/public/showcase/ctf/index.html:756 +#: website/public/showcase/ctf/index.html:758 #, python-brace-format msgctxt "page:showcase/ctf/index.html" msgid "" @@ -10016,7 +10016,7 @@ msgid "" "Python and {ph0}. Running the original executable needs Linux x86-64." msgstr "" -#: website/public/showcase/ctf/index.html:761 +#: website/public/showcase/ctf/index.html:763 msgctxt "page:showcase/ctf/index.html" msgid "Set up REA with your coding agent" msgstr "" @@ -10033,27 +10033,27 @@ msgid "" "functions, extract the masks and compare a recovered flag with the original program." msgstr "" -#: website/public/showcase/ctf/index.html:254 +#: website/public/showcase/ctf/index.html:256 msgctxt "page:showcase/ctf/index.html" msgid "On this page" msgstr "" -#: website/public/showcase/ctf/index.html:265 +#: website/public/showcase/ctf/index.html:267 msgctxt "page:showcase/ctf/index.html" msgid "CTF flag-checker case study" msgstr "" -#: website/public/showcase/ctf/index.html:280 +#: website/public/showcase/ctf/index.html:282 msgctxt "page:showcase/ctf/index.html" msgid "Copy CTF example prompt" msgstr "" -#: website/public/showcase/ctf/index.html:391 +#: website/public/showcase/ctf/index.html:393 msgctxt "page:showcase/ctf/index.html" msgid "CTF mask equation; scroll horizontally on smaller screens" msgstr "" -#: website/public/showcase/ctf/index.html:397 +#: website/public/showcase/ctf/index.html:399 msgctxt "page:showcase/ctf/index.html" msgid "" "The seventh mask skips 21 cells, selects position 21, then skips 14. Only that cell " @@ -10061,42 +10061,42 @@ msgid "" "is 7." msgstr "" -#: website/public/showcase/ctf/index.html:449 +#: website/public/showcase/ctf/index.html:451 msgctxt "page:showcase/ctf/index.html" msgid "Follow the CTF check" msgstr "" -#: website/public/showcase/ctf/index.html:499 +#: website/public/showcase/ctf/index.html:501 msgctxt "page:showcase/ctf/index.html" msgid "Copy CTF assembly" msgstr "" -#: website/public/showcase/ctf/index.html:523 +#: website/public/showcase/ctf/index.html:525 msgctxt "page:showcase/ctf/index.html" msgid "Copy readable CTF check" msgstr "" -#: website/public/showcase/ctf/index.html:593 +#: website/public/showcase/ctf/index.html:595 msgctxt "page:showcase/ctf/index.html" msgid "Copy CTF solver excerpt" msgstr "" -#: website/public/showcase/ctf/index.html:667 +#: website/public/showcase/ctf/index.html:669 msgctxt "page:showcase/ctf/index.html" msgid "Copy recovered flag" msgstr "" -#: website/public/showcase/ctf/index.html:740 +#: website/public/showcase/ctf/index.html:742 msgctxt "page:showcase/ctf/index.html" msgid "Copy CTF solver commands" msgstr "" -#: website/public/showcase/ctf/index.html:783 +#: website/public/showcase/ctf/index.html:785 msgctxt "page:showcase/ctf/index.html" msgid "Back to top" msgstr "" -#: website/public/showcase/dx-ball/index.html:107 +#: website/public/showcase/dx-ball/index.html:109 msgctxt "page:showcase/dx-ball/index.html" msgid "Skip to content" msgstr "" @@ -10105,39 +10105,39 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/dx-ball/index.html:199 +#: website/public/showcase/dx-ball/index.html:201 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / DX-Ball" msgstr "" -#: website/public/showcase/dx-ball/index.html:202 +#: website/public/showcase/dx-ball/index.html:204 msgctxt "page:showcase/dx-ball/index.html" msgid "Case study · DX-Ball 1.07" msgstr "" #. {ph0}:
-#: website/public/showcase/dx-ball/index.html:203 +#: website/public/showcase/dx-ball/index.html:205 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "Rebuilding DX-Ball{ph0}from its executable." msgstr "" -#: website/public/showcase/dx-ball/index.html:204 +#: website/public/showcase/dx-ball/index.html:206 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The goal is a maintainable C version of the 1996 Windows game. REA helps the agent " "inspect the original, one function at a time." msgstr "" -#: website/public/showcase/dx-ball/index.html:208 +#: website/public/showcase/dx-ball/index.html:210 msgctxt "page:showcase/dx-ball/index.html" msgid "Windows i386 · C · REA" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:225 +#: website/public/showcase/dx-ball/index.html:227 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10146,14 +10146,14 @@ msgid "" "figure{ph1}" msgstr "" -#: website/public/showcase/dx-ball/index.html:236 +#: website/public/showcase/dx-ball/index.html:238 msgctxt "page:showcase/dx-ball/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:238 +#: website/public/showcase/dx-ball/index.html:240 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}The project{ph1}" @@ -10161,7 +10161,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:239 +#: website/public/showcase/dx-ball/index.html:241 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Sound pan{ph1}" @@ -10169,7 +10169,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:240 +#: website/public/showcase/dx-ball/index.html:242 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Checking the result{ph1}" @@ -10177,23 +10177,23 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:241 +#: website/public/showcase/dx-ball/index.html:243 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Continue the work{ph1}" msgstr "" -#: website/public/showcase/dx-ball/index.html:249 +#: website/public/showcase/dx-ball/index.html:251 msgctxt "page:showcase/dx-ball/index.html" msgid "maintained C functions" msgstr "" -#: website/public/showcase/dx-ball/index.html:253 +#: website/public/showcase/dx-ball/index.html:255 msgctxt "page:showcase/dx-ball/index.html" msgid "comparisons with original code" msgstr "" -#: website/public/showcase/dx-ball/index.html:257 +#: website/public/showcase/dx-ball/index.html:259 msgctxt "page:showcase/dx-ball/index.html" msgid "functions with matching compiled bytes" msgstr "" @@ -10204,7 +10204,7 @@ msgstr "" #. {ph2}: #. {ph3}: -#: website/public/showcase/dx-ball/index.html:260 +#: website/public/showcase/dx-ball/index.html:262 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10212,12 +10212,12 @@ msgid "" "coverage{ph3}" msgstr "" -#: website/public/showcase/dx-ball/index.html:272 +#: website/public/showcase/dx-ball/index.html:274 msgctxt "page:showcase/dx-ball/index.html" msgid "The project so far" msgstr "" -#: website/public/showcase/dx-ball/index.html:273 +#: website/public/showcase/dx-ball/index.html:275 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The recovered code covers board and resource handling, brick hits, animations, " @@ -10226,12 +10226,12 @@ msgid "" "power-up handling and Windows integration." msgstr "" -#: website/public/showcase/dx-ball/index.html:283 +#: website/public/showcase/dx-ball/index.html:285 msgctxt "page:showcase/dx-ball/index.html" msgid "Finding the sound-pan calculation" msgstr "" -#: website/public/showcase/dx-ball/index.html:284 +#: website/public/showcase/dx-ball/index.html:286 msgctxt "page:showcase/dx-ball/index.html" msgid "" "When a brick is hit, its horizontal position is passed to the sound code. The " @@ -10247,17 +10247,17 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/showcase/dx-ball/index.html:291 +#: website/public/showcase/dx-ball/index.html:293 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" -#: website/public/showcase/dx-ball/index.html:295 -#: website/public/showcase/dx-ball/index.html:486 -#: website/public/showcase/dx-ball/index.html:507 -#: website/public/showcase/dx-ball/index.html:578 -#: website/public/showcase/dx-ball/index.html:732 +#: website/public/showcase/dx-ball/index.html:297 +#: website/public/showcase/dx-ball/index.html:488 +#: website/public/showcase/dx-ball/index.html:509 +#: website/public/showcase/dx-ball/index.html:580 +#: website/public/showcase/dx-ball/index.html:734 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy" msgstr "" @@ -10268,7 +10268,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/showcase/dx-ball/index.html:304 +#: website/public/showcase/dx-ball/index.html:306 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10276,14 +10276,14 @@ msgid "" "calculation and show the code.{ph3}{ph4}{ph5}" msgstr "" -#: website/public/showcase/dx-ball/index.html:312 +#: website/public/showcase/dx-ball/index.html:314 msgctxt "page:showcase/dx-ball/index.html" msgid "" "An example prompt for your coding agent, with the local executable available. The " "investigation below shows the REA queries and evidence behind the answer." msgstr "" -#: website/public/showcase/dx-ball/index.html:317 +#: website/public/showcase/dx-ball/index.html:319 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The agent used REA to inspect the function, follow its brick-hit caller and read the " @@ -10294,7 +10294,7 @@ msgstr "" #. {ph0}: 0x406400 #. {ph1}: FUN_00406400(void) #. {ph2}: __ftol() -#: website/public/showcase/dx-ball/index.html:323 +#: website/public/showcase/dx-ball/index.html:325 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10303,48 +10303,48 @@ msgid "" "discrepancy gave the agent a concrete reason to keep investigating." msgstr "" -#: website/public/showcase/dx-ball/index.html:331 +#: website/public/showcase/dx-ball/index.html:333 msgctxt "page:showcase/dx-ball/index.html" msgid "The first decompiler view" msgstr "" -#: website/public/showcase/dx-ball/index.html:334 +#: website/public/showcase/dx-ball/index.html:336 msgctxt "page:showcase/dx-ball/index.html" msgid "REA result · pseudocode excerpt" msgstr "" -#: website/public/showcase/dx-ball/index.html:344 +#: website/public/showcase/dx-ball/index.html:346 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The output shows a conversion call. Reading the instructions below reveals the input " "and the calculation feeding that call." msgstr "" -#: website/public/showcase/dx-ball/index.html:350 +#: website/public/showcase/dx-ball/index.html:352 msgctxt "page:showcase/dx-ball/index.html" msgid "Three questions answered through REA" msgstr "" -#: website/public/showcase/dx-ball/index.html:353 +#: website/public/showcase/dx-ball/index.html:355 msgctxt "page:showcase/dx-ball/index.html" msgid "Recover the missing input" msgstr "" #. {ph0}: analyze_function -#: website/public/showcase/dx-ball/index.html:357 -#: website/public/showcase/dx-ball/index.html:381 +#: website/public/showcase/dx-ball/index.html:359 +#: website/public/showcase/dx-ball/index.html:383 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "Agent → REA · {ph0}" msgstr "" -#: website/public/showcase/dx-ball/index.html:363 +#: website/public/showcase/dx-ball/index.html:365 msgctxt "page:showcase/dx-ball/index.html" msgid "REA → agent · instruction excerpt" msgstr "" #. {ph0}: [EBP+8] -#: website/public/showcase/dx-ball/index.html:370 +#: website/public/showcase/dx-ball/index.html:372 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10352,19 +10352,19 @@ msgid "" "{ph0} exposes the integer input missing from the decompiler view." msgstr "" -#: website/public/showcase/dx-ball/index.html:377 +#: website/public/showcase/dx-ball/index.html:379 msgctxt "page:showcase/dx-ball/index.html" msgid "Follow the caller to understand the input" msgstr "" -#: website/public/showcase/dx-ball/index.html:387 +#: website/public/showcase/dx-ball/index.html:389 msgctxt "page:showcase/dx-ball/index.html" msgid "REA → agent · caller excerpt" msgstr "" #. {ph0}: tile_x #. {ph1}: 20 + 30 × tile_x -#: website/public/showcase/dx-ball/index.html:394 +#: website/public/showcase/dx-ball/index.html:396 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10372,36 +10372,36 @@ msgid "" " by 30; adding 20 gives the brick's screen coordinate, {ph1}." msgstr "" -#: website/public/showcase/dx-ball/index.html:401 +#: website/public/showcase/dx-ball/index.html:403 msgctxt "page:showcase/dx-ball/index.html" msgid "Read the values behind the memory addresses" msgstr "" #. {ph0}: read_bytes -#: website/public/showcase/dx-ball/index.html:405 +#: website/public/showcase/dx-ball/index.html:407 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "Agent → REA · two {ph0} requests" msgstr "" -#: website/public/showcase/dx-ball/index.html:415 +#: website/public/showcase/dx-ball/index.html:417 msgctxt "page:showcase/dx-ball/index.html" msgid "REA byte results · decoded as doubles" msgstr "" -#: website/public/showcase/dx-ball/index.html:422 +#: website/public/showcase/dx-ball/index.html:424 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The returned bytes establish the two arithmetic constants and initial pan scale. The " "agent now has the values needed for the C expression." msgstr "" -#: website/public/showcase/dx-ball/index.html:430 +#: website/public/showcase/dx-ball/index.html:432 msgctxt "page:showcase/dx-ball/index.html" msgid "From REA's findings to C" msgstr "" -#: website/public/showcase/dx-ball/index.html:431 +#: website/public/showcase/dx-ball/index.html:433 msgctxt "page:showcase/dx-ball/index.html" msgid "" "Follow the five steps below. Each selection highlights the original instructions and " @@ -10410,7 +10410,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:441 +#: website/public/showcase/dx-ball/index.html:443 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}01{ph1} Input" @@ -10418,7 +10418,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:449 +#: website/public/showcase/dx-ball/index.html:451 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}02{ph1} Multiply" @@ -10426,7 +10426,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:457 +#: website/public/showcase/dx-ball/index.html:459 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}03{ph1} Subtract" @@ -10434,7 +10434,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:465 +#: website/public/showcase/dx-ball/index.html:467 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}04{ph1} Scale" @@ -10442,18 +10442,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:473 +#: website/public/showcase/dx-ball/index.html:475 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}05{ph1} Return" msgstr "" -#: website/public/showcase/dx-ball/index.html:485 +#: website/public/showcase/dx-ball/index.html:487 msgctxt "page:showcase/dx-ball/index.html" msgid "Original x86 · excerpt" msgstr "" -#: website/public/showcase/dx-ball/index.html:506 +#: website/public/showcase/dx-ball/index.html:508 msgctxt "page:showcase/dx-ball/index.html" msgid "Reconstructed C" msgstr "" @@ -10463,7 +10463,7 @@ msgstr "" #. {ph2}: [EBP+8] #. {ph3}: FILD #. {ph4}: x -#: website/public/showcase/dx-ball/index.html:533 +#: website/public/showcase/dx-ball/index.html:535 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10478,7 +10478,7 @@ msgstr "" #. {ph3}: 0x420068 #. {ph4}: read_bytes #. {ph5}: 1.5625 -#: website/public/showcase/dx-ball/index.html:540 +#: website/public/showcase/dx-ball/index.html:542 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10492,7 +10492,7 @@ msgstr "" #. {ph3}: 0x420070 #. {ph4}: 500.0 #. {ph5}: 320 -#: website/public/showcase/dx-ball/index.html:546 +#: website/public/showcase/dx-ball/index.html:548 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10506,7 +10506,7 @@ msgstr "" #. {ph3}: 0x4210a0 #. {ph4}: dxball_pan_scale #. {ph5}: 1.0 -#: website/public/showcase/dx-ball/index.html:552 +#: website/public/showcase/dx-ball/index.html:554 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10520,7 +10520,7 @@ msgstr "" #. {ph2}: 0x406430 #. {ph3}: __ftol #. {ph4}: DxBallInt -#: website/public/showcase/dx-ball/index.html:559 +#: website/public/showcase/dx-ball/index.html:561 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10529,30 +10529,30 @@ msgid "" "returned value." msgstr "" -#: website/public/showcase/dx-ball/index.html:568 +#: website/public/showcase/dx-ball/index.html:570 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The assembly excerpt selects the input, arithmetic and return instructions. The full " "listing below also includes the intervening stores and function setup and cleanup." msgstr "" -#: website/public/showcase/dx-ball/index.html:574 +#: website/public/showcase/dx-ball/index.html:576 msgctxt "page:showcase/dx-ball/index.html" msgid "Full assembly and supporting evidence" msgstr "" -#: website/public/showcase/dx-ball/index.html:577 +#: website/public/showcase/dx-ball/index.html:579 msgctxt "page:showcase/dx-ball/index.html" msgid "REA result · 0x406400–0x40643e" msgstr "" -#: website/public/showcase/dx-ball/index.html:611 +#: website/public/showcase/dx-ball/index.html:613 msgctxt "page:showcase/dx-ball/index.html" msgid "What the caller supplies" msgstr "" #. {ph0}: 0x411f40 -#: website/public/showcase/dx-ball/index.html:612 +#: website/public/showcase/dx-ball/index.html:614 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10560,54 +10560,54 @@ msgid "" " it before the call:" msgstr "" -#: website/public/showcase/dx-ball/index.html:626 +#: website/public/showcase/dx-ball/index.html:628 msgctxt "page:showcase/dx-ball/index.html" msgid "What the data reads establish" msgstr "" -#: website/public/showcase/dx-ball/index.html:629 +#: website/public/showcase/dx-ball/index.html:631 msgctxt "page:showcase/dx-ball/index.html" msgid "REA byte reads, decoded as little-endian doubles" msgstr "" -#: website/public/showcase/dx-ball/index.html:634 +#: website/public/showcase/dx-ball/index.html:636 msgctxt "page:showcase/dx-ball/index.html" msgid "Address" msgstr "" -#: website/public/showcase/dx-ball/index.html:635 +#: website/public/showcase/dx-ball/index.html:637 msgctxt "page:showcase/dx-ball/index.html" msgid "Value" msgstr "" -#: website/public/showcase/dx-ball/index.html:636 +#: website/public/showcase/dx-ball/index.html:638 msgctxt "page:showcase/dx-ball/index.html" msgid "Used for" msgstr "" -#: website/public/showcase/dx-ball/index.html:643 +#: website/public/showcase/dx-ball/index.html:645 msgctxt "page:showcase/dx-ball/index.html" msgid "First multiplication" msgstr "" -#: website/public/showcase/dx-ball/index.html:648 +#: website/public/showcase/dx-ball/index.html:650 msgctxt "page:showcase/dx-ball/index.html" msgid "Subtraction" msgstr "" #. {ph0}: 1.0 -#: website/public/showcase/dx-ball/index.html:652 +#: website/public/showcase/dx-ball/index.html:654 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0} initially" msgstr "" -#: website/public/showcase/dx-ball/index.html:653 +#: website/public/showcase/dx-ball/index.html:655 msgctxt "page:showcase/dx-ball/index.html" msgid "Stored pan scale" msgstr "" -#: website/public/showcase/dx-ball/index.html:658 +#: website/public/showcase/dx-ball/index.html:660 msgctxt "page:showcase/dx-ball/index.html" msgid "" "Recorded with REA 4.1.0 for the hash-pinned DX-Ball 1.07 target. The linked " @@ -10620,31 +10620,31 @@ msgstr "" #. {ph2}: #. {ph3}: -#: website/public/showcase/dx-ball/index.html:663 +#: website/public/showcase/dx-ball/index.html:665 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" "{ph0}Maintained source{ph1} · {ph2}Investigation notes and evidence references{ph3}" msgstr "" -#: website/public/showcase/dx-ball/index.html:677 +#: website/public/showcase/dx-ball/index.html:679 msgctxt "page:showcase/dx-ball/index.html" msgid "Checking the recovered function" msgstr "" -#: website/public/showcase/dx-ball/index.html:678 +#: website/public/showcase/dx-ball/index.html:680 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The recovered function passes two checks: its return values match the original, and " "its compiled bytes match the executable." msgstr "" -#: website/public/showcase/dx-ball/index.html:684 +#: website/public/showcase/dx-ball/index.html:686 msgctxt "page:showcase/dx-ball/index.html" msgid "3,205 behavior cases" msgstr "" -#: website/public/showcase/dx-ball/index.html:685 +#: website/public/showcase/dx-ball/index.html:687 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The tests execute the original x86 function and compare its return value with the " @@ -10652,12 +10652,12 @@ msgid "" "0.5, 1, 20 and −1." msgstr "" -#: website/public/showcase/dx-ball/index.html:693 +#: website/public/showcase/dx-ball/index.html:695 msgctxt "page:showcase/dx-ball/index.html" msgid "63 matching bytes" msgstr "" -#: website/public/showcase/dx-ball/index.html:694 +#: website/public/showcase/dx-ball/index.html:696 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The C function is compiled with the pinned VC4.0 toolchain. Compiler replay matches " @@ -10665,7 +10665,7 @@ msgid "" "referenced constants." msgstr "" -#: website/public/showcase/dx-ball/index.html:702 +#: website/public/showcase/dx-ball/index.html:704 msgctxt "page:showcase/dx-ball/index.html" msgid "" "At a scale of 1, the recovered calculation returns −500 at the left edge, 0 at the " @@ -10676,18 +10676,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/dx-ball/index.html:708 +#: website/public/showcase/dx-ball/index.html:710 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}Read the compiler replay details{ph1}" msgstr "" -#: website/public/showcase/dx-ball/index.html:717 +#: website/public/showcase/dx-ball/index.html:719 msgctxt "page:showcase/dx-ball/index.html" msgid "Continue the investigation" msgstr "" -#: website/public/showcase/dx-ball/index.html:718 +#: website/public/showcase/dx-ball/index.html:720 msgctxt "page:showcase/dx-ball/index.html" msgid "" "The same approach is being used for particle updates, explosion queues and bonus " @@ -10695,14 +10695,14 @@ msgid "" " compare the implementation with the original." msgstr "" -#: website/public/showcase/dx-ball/index.html:724 +#: website/public/showcase/dx-ball/index.html:726 msgctxt "page:showcase/dx-ball/index.html" msgid "" "To inspect the sound-pan function yourself, follow the DX-Ball project's setup " "instructions and supply its matching original target. Then run:" msgstr "" -#: website/public/showcase/dx-ball/index.html:731 +#: website/public/showcase/dx-ball/index.html:733 msgctxt "page:showcase/dx-ball/index.html" msgid "In the DX-Ball checkout" msgstr "" @@ -10711,7 +10711,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/dx-ball/index.html:745 +#: website/public/showcase/dx-ball/index.html:747 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "{ph0}DX-Ball repository{ph1}{ph2}Current source, progress and local setup.{ph3}" @@ -10721,7 +10721,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/dx-ball/index.html:750 +#: website/public/showcase/dx-ball/index.html:752 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10734,7 +10734,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/dx-ball/index.html:757 +#: website/public/showcase/dx-ball/index.html:759 #, python-brace-format msgctxt "page:showcase/dx-ball/index.html" msgid "" @@ -10742,7 +10742,7 @@ msgid "" " and pixel writes.{ph3}" msgstr "" -#: website/public/showcase/dx-ball/index.html:768 +#: website/public/showcase/dx-ball/index.html:770 msgctxt "page:showcase/dx-ball/index.html" msgid "Start with your own target" msgstr "" @@ -10759,12 +10759,12 @@ msgid "" "original-x86 tests and matching compiled function bytes." msgstr "" -#: website/public/showcase/dx-ball/index.html:211 +#: website/public/showcase/dx-ball/index.html:213 msgctxt "page:showcase/dx-ball/index.html" msgid "DX-Ball sound-pan investigation; scroll horizontally on smaller screens" msgstr "" -#: website/public/showcase/dx-ball/index.html:217 +#: website/public/showcase/dx-ball/index.html:219 msgctxt "page:showcase/dx-ball/index.html" msgid "" "DXBALL.EXE function 0x00406400 is inspected with REA. A brick-hit caller supplies 20 " @@ -10773,170 +10773,170 @@ msgid "" " original x86 in 3,205 cases and by VC4.0 compiler replay matching 63 bytes." msgstr "" -#: website/public/showcase/dx-ball/index.html:235 +#: website/public/showcase/dx-ball/index.html:237 msgctxt "page:showcase/dx-ball/index.html" msgid "On this page" msgstr "" -#: website/public/showcase/dx-ball/index.html:244 +#: website/public/showcase/dx-ball/index.html:246 msgctxt "page:showcase/dx-ball/index.html" msgid "DX-Ball reconstruction case study" msgstr "" -#: website/public/showcase/dx-ball/index.html:295 +#: website/public/showcase/dx-ball/index.html:297 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy example prompt" msgstr "" -#: website/public/showcase/dx-ball/index.html:436 +#: website/public/showcase/dx-ball/index.html:438 msgctxt "page:showcase/dx-ball/index.html" msgid "Follow the sound-pan calculation" msgstr "" -#: website/public/showcase/dx-ball/index.html:486 +#: website/public/showcase/dx-ball/index.html:488 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy original assembly excerpt" msgstr "" -#: website/public/showcase/dx-ball/index.html:507 +#: website/public/showcase/dx-ball/index.html:509 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy sound-pan function" msgstr "" -#: website/public/showcase/dx-ball/index.html:578 +#: website/public/showcase/dx-ball/index.html:580 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy complete sound-pan assembly" msgstr "" -#: website/public/showcase/dx-ball/index.html:732 +#: website/public/showcase/dx-ball/index.html:734 msgctxt "page:showcase/dx-ball/index.html" msgid "Copy DX-Ball analysis command" msgstr "" -#: website/public/showcase/dx-ball/index.html:791 +#: website/public/showcase/dx-ball/index.html:793 msgctxt "page:showcase/dx-ball/index.html" msgid "Back to top" msgstr "" -#: website/public/showcase/index.html:107 +#: website/public/showcase/index.html:109 msgctxt "page:showcase/index.html" msgid "Skip to content" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/index.html:199 +#: website/public/showcase/index.html:201 #, python-brace-format msgctxt "page:showcase/index.html" msgid "{ph0}Home{ph1} / Showcases" msgstr "" -#: website/public/showcase/index.html:200 +#: website/public/showcase/index.html:202 msgctxt "page:showcase/index.html" msgid "REA case studies." msgstr "" -#: website/public/showcase/index.html:201 +#: website/public/showcase/index.html:203 msgctxt "page:showcase/index.html" msgid "" "Android, games, Electron and a CTF challenge, with code, figures and checked results." msgstr "" -#: website/public/showcase/index.html:208 +#: website/public/showcase/index.html:210 msgctxt "page:showcase/index.html" msgid "Android · APK analysis" msgstr "" -#: website/public/showcase/index.html:210 +#: website/public/showcase/index.html:212 msgctxt "page:showcase/index.html" msgid "How an authenticator generates a login code" msgstr "" -#: website/public/showcase/index.html:211 +#: website/public/showcase/index.html:213 msgctxt "page:showcase/index.html" msgid "" "Find Aegis's six-digit code calculation in its released APK. Trace the generating " "methods with REA, then move a demo clock to see why the code changes every 30 seconds." msgstr "" -#: website/public/showcase/index.html:217 +#: website/public/showcase/index.html:219 msgctxt "page:showcase/index.html" msgid "APK" msgstr "" -#: website/public/showcase/index.html:218 +#: website/public/showcase/index.html:220 msgctxt "page:showcase/index.html" msgid "Generating code" msgstr "" -#: website/public/showcase/index.html:219 +#: website/public/showcase/index.html:221 msgctxt "page:showcase/index.html" msgid "Recovered rule" msgstr "" -#: website/public/showcase/index.html:220 +#: website/public/showcase/index.html:222 msgctxt "page:showcase/index.html" msgid "Adjustable clock" msgstr "" -#: website/public/showcase/index.html:222 +#: website/public/showcase/index.html:224 msgctxt "page:showcase/index.html" msgid "Read the Android case study" msgstr "" -#: website/public/showcase/index.html:226 +#: website/public/showcase/index.html:228 msgctxt "page:showcase/index.html" msgid "CTF · Native analysis" msgstr "" -#: website/public/showcase/index.html:228 +#: website/public/showcase/index.html:230 msgctxt "page:showcase/index.html" msgid "Solve a CTF flag checker" msgstr "" -#: website/public/showcase/index.html:229 +#: website/public/showcase/index.html:231 msgctxt "page:showcase/index.html" msgid "" "Inspect an easy DownUnderCTF challenge with REA. Find its checking functions, turn " "masks and sums into equations, then verify the solved flag with the original program." msgstr "" -#: website/public/showcase/index.html:235 +#: website/public/showcase/index.html:237 msgctxt "page:showcase/index.html" msgid "Binary" msgstr "" -#: website/public/showcase/index.html:236 +#: website/public/showcase/index.html:238 msgctxt "page:showcase/index.html" msgid "Checking code" msgstr "" -#: website/public/showcase/index.html:237 +#: website/public/showcase/index.html:239 msgctxt "page:showcase/index.html" msgid "Equations" msgstr "" -#: website/public/showcase/index.html:238 +#: website/public/showcase/index.html:240 msgctxt "page:showcase/index.html" msgid "Correct!" msgstr "" -#: website/public/showcase/index.html:240 +#: website/public/showcase/index.html:242 msgctxt "page:showcase/index.html" msgid "Read the CTF case study" msgstr "" -#: website/public/showcase/index.html:244 +#: website/public/showcase/index.html:246 msgctxt "page:showcase/index.html" msgid "Native · Reconstruction" msgstr "" -#: website/public/showcase/index.html:246 +#: website/public/showcase/index.html:248 msgctxt "page:showcase/index.html" msgid "DX-Ball's sound-pan calculation" msgstr "" -#: website/public/showcase/index.html:247 +#: website/public/showcase/index.html:249 msgctxt "page:showcase/index.html" msgid "" "Recover a sound-pan calculation from a 1996 Windows game. REA's instructions, caller " @@ -10944,42 +10944,42 @@ msgid "" "original behavior and all 63 compiled bytes." msgstr "" -#: website/public/showcase/index.html:254 +#: website/public/showcase/index.html:256 msgctxt "page:showcase/index.html" msgid "Executable" msgstr "" -#: website/public/showcase/index.html:255 +#: website/public/showcase/index.html:257 msgctxt "page:showcase/index.html" msgid "REA findings" msgstr "" -#: website/public/showcase/index.html:256 +#: website/public/showcase/index.html:258 msgctxt "page:showcase/index.html" msgid "Recovered C" msgstr "" -#: website/public/showcase/index.html:257 +#: website/public/showcase/index.html:259 msgctxt "page:showcase/index.html" msgid "Validation" msgstr "" -#: website/public/showcase/index.html:259 +#: website/public/showcase/index.html:261 msgctxt "page:showcase/index.html" msgid "Read the DX-Ball case study" msgstr "" -#: website/public/showcase/index.html:263 +#: website/public/showcase/index.html:265 msgctxt "page:showcase/index.html" msgid "Electron · Feature tracing" msgstr "" -#: website/public/showcase/index.html:265 +#: website/public/showcase/index.html:267 msgctxt "page:showcase/index.html" msgid "How Notion copies text and HTML" msgstr "" -#: website/public/showcase/index.html:266 +#: website/public/showcase/index.html:268 msgctxt "page:showcase/index.html" msgid "" "Trace a page-facing API through Notion's packaged JavaScript. Follow its IPC wrappers " @@ -10987,42 +10987,42 @@ msgid "" "connected to a copy." msgstr "" -#: website/public/showcase/index.html:272 +#: website/public/showcase/index.html:274 msgctxt "page:showcase/index.html" msgid "Packaged app" msgstr "" -#: website/public/showcase/index.html:273 +#: website/public/showcase/index.html:275 msgctxt "page:showcase/index.html" msgid "Exposed API" msgstr "" -#: website/public/showcase/index.html:274 +#: website/public/showcase/index.html:276 msgctxt "page:showcase/index.html" msgid "IPC wrappers" msgstr "" -#: website/public/showcase/index.html:275 +#: website/public/showcase/index.html:277 msgctxt "page:showcase/index.html" msgid "Clipboard" msgstr "" -#: website/public/showcase/index.html:277 +#: website/public/showcase/index.html:279 msgctxt "page:showcase/index.html" msgid "Read the Notion case study" msgstr "" -#: website/public/showcase/index.html:281 +#: website/public/showcase/index.html:283 msgctxt "page:showcase/index.html" msgid "PC-98 DOS · Reconstruction" msgstr "" -#: website/public/showcase/index.html:283 +#: website/public/showcase/index.html:285 msgctxt "page:showcase/index.html" msgid "How TH04 aims a ring of bullets" msgstr "" -#: website/public/showcase/index.html:284 +#: website/public/showcase/index.html:286 msgctxt "page:showcase/index.html" msgid "" "Inspect the original 16-bit angle helper with REA. Match its multiply, divide and " @@ -11030,44 +11030,44 @@ msgid "" "player." msgstr "" -#: website/public/showcase/index.html:290 +#: website/public/showcase/index.html:292 msgctxt "page:showcase/index.html" msgid "Original DOS code" msgstr "" -#: website/public/showcase/index.html:291 +#: website/public/showcase/index.html:293 msgctxt "page:showcase/index.html" msgid "REA instructions" msgstr "" -#: website/public/showcase/index.html:292 +#: website/public/showcase/index.html:294 msgctxt "page:showcase/index.html" msgid "Angle calculation" msgstr "" -#: website/public/showcase/index.html:293 +#: website/public/showcase/index.html:295 msgctxt "page:showcase/index.html" msgid "Bullet ring" msgstr "" -#: website/public/showcase/index.html:295 +#: website/public/showcase/index.html:297 msgctxt "page:showcase/index.html" msgid "Read the TH04 case study" msgstr "" -#: website/public/showcase/index.html:300 +#: website/public/showcase/index.html:302 msgctxt "page:showcase/index.html" msgid "Step-by-step guides" msgstr "" -#: website/public/showcase/index.html:301 +#: website/public/showcase/index.html:303 msgctxt "page:showcase/index.html" msgid "" "The guides walk through a native calculation, an Electron export and a browser " "request. Each starts with a prompt and a concrete target." msgstr "" -#: website/public/showcase/index.html:305 +#: website/public/showcase/index.html:307 msgctxt "page:showcase/index.html" msgid "Read the guides" msgstr "" @@ -11084,12 +11084,12 @@ msgid "" "DX-Ball, Notion, TH04 and a DownUnderCTF flag checker." msgstr "" -#: website/public/showcase/index.html:323 +#: website/public/showcase/index.html:325 msgctxt "page:showcase/index.html" msgid "Back to top" msgstr "" -#: website/public/showcase/notion/index.html:107 +#: website/public/showcase/notion/index.html:109 msgctxt "page:showcase/notion/index.html" msgid "Skip to content" msgstr "" @@ -11098,37 +11098,37 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/notion/index.html:199 +#: website/public/showcase/notion/index.html:201 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / Notion" msgstr "" -#: website/public/showcase/notion/index.html:202 +#: website/public/showcase/notion/index.html:204 msgctxt "page:showcase/notion/index.html" msgid "Case study · Electron" msgstr "" #. {ph0}:
-#: website/public/showcase/notion/index.html:203 +#: website/public/showcase/notion/index.html:205 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "How Notion copies{ph0}text and HTML." msgstr "" -#: website/public/showcase/notion/index.html:204 +#: website/public/showcase/notion/index.html:206 msgctxt "page:showcase/notion/index.html" msgid "" "Trace a clipboard call from Notion's page API, through the preload and main process, " "to Electron's clipboard writer." msgstr "" -#: website/public/showcase/notion/index.html:208 +#: website/public/showcase/notion/index.html:210 msgctxt "page:showcase/notion/index.html" msgid "Notion Desktop 7.6.1 · JavaScript · REA" msgstr "" -#: website/public/showcase/notion/index.html:212 +#: website/public/showcase/notion/index.html:214 msgctxt "page:showcase/notion/index.html" msgid "The bridge inside Notion's desktop package" msgstr "" @@ -11140,7 +11140,7 @@ msgstr "" #. {ph4}: #. {ph5}: #. {ph6}: -#: website/public/showcase/notion/index.html:214 +#: website/public/showcase/notion/index.html:216 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11155,7 +11155,7 @@ msgstr "" #. {ph4}: #. {ph5}: #. {ph6}: -#: website/public/showcase/notion/index.html:221 +#: website/public/showcase/notion/index.html:223 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11170,7 +11170,7 @@ msgstr "" #. {ph4}: #. {ph5}: #. {ph6}: -#: website/public/showcase/notion/index.html:228 +#: website/public/showcase/notion/index.html:230 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11185,7 +11185,7 @@ msgstr "" #. {ph4}: #. {ph5}: #. {ph6}: -#: website/public/showcase/notion/index.html:235 +#: website/public/showcase/notion/index.html:237 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11194,27 +11194,27 @@ msgid "" msgstr "" #. {ph0}: notion:clipboard:write -#: website/public/showcase/notion/index.html:243 +#: website/public/showcase/notion/index.html:245 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "One channel joins the two sides: {ph0}" msgstr "" -#: website/public/showcase/notion/index.html:247 +#: website/public/showcase/notion/index.html:249 msgctxt "page:showcase/notion/index.html" msgid "" "The packaged code uses the same channel in the preload and main process. Resolving the" " wrappers reveals the Electron calls behind those names." msgstr "" -#: website/public/showcase/notion/index.html:256 +#: website/public/showcase/notion/index.html:258 msgctxt "page:showcase/notion/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/notion/index.html:258 +#: website/public/showcase/notion/index.html:260 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}Follow the clipboard bridge{ph1}" @@ -11222,7 +11222,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/notion/index.html:259 +#: website/public/showcase/notion/index.html:261 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}Keeping a block's structure{ph1}" @@ -11230,19 +11230,19 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/notion/index.html:260 +#: website/public/showcase/notion/index.html:262 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}More examples and sources{ph1}" msgstr "" -#: website/public/showcase/notion/index.html:265 +#: website/public/showcase/notion/index.html:267 msgctxt "page:showcase/notion/index.html" msgid "Where does the copy operation go?" msgstr "" #. {ph0}: clipboard.write -#: website/public/showcase/notion/index.html:266 +#: website/public/showcase/notion/index.html:268 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11258,17 +11258,17 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/showcase/notion/index.html:273 +#: website/public/showcase/notion/index.html:275 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" -#: website/public/showcase/notion/index.html:277 -#: website/public/showcase/notion/index.html:350 -#: website/public/showcase/notion/index.html:379 -#: website/public/showcase/notion/index.html:410 -#: website/public/showcase/notion/index.html:438 +#: website/public/showcase/notion/index.html:279 +#: website/public/showcase/notion/index.html:352 +#: website/public/showcase/notion/index.html:381 +#: website/public/showcase/notion/index.html:412 +#: website/public/showcase/notion/index.html:440 msgctxt "page:showcase/notion/index.html" msgid "Copy" msgstr "" @@ -11279,7 +11279,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/showcase/notion/index.html:286 +#: website/public/showcase/notion/index.html:288 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11287,19 +11287,19 @@ msgid "" "clipboard. Show the code at each step.{ph3}{ph4}{ph5}" msgstr "" -#: website/public/showcase/notion/index.html:294 +#: website/public/showcase/notion/index.html:296 msgctxt "page:showcase/notion/index.html" msgid "" "An example prompt with Notion's local application package available to your coding " "agent." msgstr "" -#: website/public/showcase/notion/index.html:299 +#: website/public/showcase/notion/index.html:301 msgctxt "page:showcase/notion/index.html" msgid "REA finds where to start reading" msgstr "" -#: website/public/showcase/notion/index.html:300 +#: website/public/showcase/notion/index.html:302 msgctxt "page:showcase/notion/index.html" msgid "" "Analyzing the tab preload with REA locates the API exposed to the page and the call " @@ -11307,23 +11307,23 @@ msgid "" "bundle:" msgstr "" -#: website/public/showcase/notion/index.html:306 +#: website/public/showcase/notion/index.html:308 msgctxt "page:showcase/notion/index.html" msgid "REA findings → two places to open" msgstr "" -#: website/public/showcase/notion/index.html:309 +#: website/public/showcase/notion/index.html:311 msgctxt "page:showcase/notion/index.html" msgid "Exposed page API" msgstr "" -#: website/public/showcase/notion/index.html:315 +#: website/public/showcase/notion/index.html:317 msgctxt "page:showcase/notion/index.html" msgid "Renderer IPC call" msgstr "" #. {ph0}: analyze_javascript_application -#: website/public/showcase/notion/index.html:321 +#: website/public/showcase/notion/index.html:323 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11333,7 +11333,7 @@ msgstr "" #. {ph0}: invokerInMain #. {ph1}: notion:clipboard:write -#: website/public/showcase/notion/index.html:328 +#: website/public/showcase/notion/index.html:330 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11342,32 +11342,32 @@ msgid "" " to look for in the main bundle. The four excerpts below show the route it connects." msgstr "" -#: website/public/showcase/notion/index.html:337 +#: website/public/showcase/notion/index.html:339 msgctxt "page:showcase/notion/index.html" msgid "Four short pieces of code" msgstr "" -#: website/public/showcase/notion/index.html:338 +#: website/public/showcase/notion/index.html:340 msgctxt "page:showcase/notion/index.html" msgid "" "Simplified from the packaged JavaScript, with readable variable names. Unrelated " "members are omitted." msgstr "" -#: website/public/showcase/notion/index.html:344 +#: website/public/showcase/notion/index.html:346 msgctxt "page:showcase/notion/index.html" msgid "Start at the API exposed to the page" msgstr "" #. {ph0}: preload.js -#: website/public/showcase/notion/index.html:347 +#: website/public/showcase/notion/index.html:349 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "tab_browser_view/{ph0} · API member" msgstr "" #. {ph0}: invokerInMain -#: website/public/showcase/notion/index.html:366 +#: website/public/showcase/notion/index.html:368 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11375,20 +11375,20 @@ msgid "" "request leaves the page's process." msgstr "" -#: website/public/showcase/notion/index.html:373 +#: website/public/showcase/notion/index.html:375 msgctxt "page:showcase/notion/index.html" msgid "Resolve the preload's wrapper" msgstr "" #. {ph0}: preload.js -#: website/public/showcase/notion/index.html:376 +#: website/public/showcase/notion/index.html:378 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "tab_browser_view/{ph0} · IPC helper" msgstr "" #. {ph0}: notion:clipboard:write -#: website/public/showcase/notion/index.html:396 +#: website/public/showcase/notion/index.html:398 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11396,13 +11396,13 @@ msgid "" "IPC. We can now look for {ph0} on the main-process side." msgstr "" -#: website/public/showcase/notion/index.html:404 +#: website/public/showcase/notion/index.html:406 msgctxt "page:showcase/notion/index.html" msgid "Check how the receiver is registered" msgstr "" #. {ph0}: index.js -#: website/public/showcase/notion/index.html:407 +#: website/public/showcase/notion/index.html:409 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "main/{ph0} · handler helper" @@ -11410,7 +11410,7 @@ msgstr "" #. {ph0}: addListener #. {ph1}: ipcMain.handle -#: website/public/showcase/notion/index.html:425 +#: website/public/showcase/notion/index.html:427 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11418,19 +11418,19 @@ msgid "" "for that channel." msgstr "" -#: website/public/showcase/notion/index.html:432 +#: website/public/showcase/notion/index.html:434 msgctxt "page:showcase/notion/index.html" msgid "Find the write and its sender check" msgstr "" #. {ph0}: index.js -#: website/public/showcase/notion/index.html:435 +#: website/public/showcase/notion/index.html:437 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "main/{ph0} · clipboard receiver" msgstr "" -#: website/public/showcase/notion/index.html:455 +#: website/public/showcase/notion/index.html:457 msgctxt "page:showcase/notion/index.html" msgid "" "This is the destination. After checking the sender, the handler passes the supplied " @@ -11438,13 +11438,13 @@ msgid "" "the exposed method to this call." msgstr "" -#: website/public/showcase/notion/index.html:466 +#: website/public/showcase/notion/index.html:468 msgctxt "page:showcase/notion/index.html" msgid "How does a copied block keep its structure?" msgstr "" #. {ph0}: electronApi.clipboard.write -#: website/public/showcase/notion/index.html:467 +#: website/public/showcase/notion/index.html:469 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11452,100 +11452,100 @@ msgid "" " and puts an ID in the copied HTML to connect them." msgstr "" -#: website/public/showcase/notion/index.html:473 +#: website/public/showcase/notion/index.html:475 msgctxt "page:showcase/notion/index.html" msgid "HTML links to saved block data" msgstr "" -#: website/public/showcase/notion/index.html:477 +#: website/public/showcase/notion/index.html:479 msgctxt "page:showcase/notion/index.html" msgid "Sent to the system clipboard" msgstr "" -#: website/public/showcase/notion/index.html:485 +#: website/public/showcase/notion/index.html:487 msgctxt "page:showcase/notion/index.html" msgid "Saved locally by Notion" msgstr "" -#: website/public/showcase/notion/index.html:497 +#: website/public/showcase/notion/index.html:499 msgctxt "page:showcase/notion/index.html" msgid "Read the HTML ID" msgstr "" -#: website/public/showcase/notion/index.html:498 +#: website/public/showcase/notion/index.html:500 msgctxt "page:showcase/notion/index.html" msgid "Find the same local ID" msgstr "" -#: website/public/showcase/notion/index.html:499 +#: website/public/showcase/notion/index.html:501 msgctxt "page:showcase/notion/index.html" msgid "Restore Notion block data" msgstr "" -#: website/public/showcase/notion/index.html:501 +#: website/public/showcase/notion/index.html:503 msgctxt "page:showcase/notion/index.html" msgid "" "Illustrative text and ID. The recorded module test restores the block data when IDs " "match; a stale entry returns only text and HTML." msgstr "" -#: website/public/showcase/notion/index.html:507 +#: website/public/showcase/notion/index.html:509 msgctxt "page:showcase/notion/index.html" msgid "" "On paste, Notion looks for the HTML ID and checks it against the saved copy. Matching " "IDs restore the block data." msgstr "" -#: website/public/showcase/notion/index.html:511 +#: website/public/showcase/notion/index.html:513 msgctxt "page:showcase/notion/index.html" msgid "Clipboard format recorded from web assets cached on July 13, 2026." msgstr "" -#: website/public/showcase/notion/index.html:517 +#: website/public/showcase/notion/index.html:519 msgctxt "page:showcase/notion/index.html" msgid "More examples and sources" msgstr "" -#: website/public/showcase/notion/index.html:519 +#: website/public/showcase/notion/index.html:521 msgctxt "page:showcase/notion/index.html" msgid "Another example: Markdown tables" msgstr "" -#: website/public/showcase/notion/index.html:520 +#: website/public/showcase/notion/index.html:522 msgctxt "page:showcase/notion/index.html" msgid "" "Notion parses Markdown into block data. This example shows how a table becomes header " "and data rows." msgstr "" -#: website/public/showcase/notion/index.html:525 +#: website/public/showcase/notion/index.html:527 msgctxt "page:showcase/notion/index.html" msgid "A table through Notion's Markdown parser" msgstr "" -#: website/public/showcase/notion/index.html:530 +#: website/public/showcase/notion/index.html:532 msgctxt "page:showcase/notion/index.html" msgid "Markdown input" msgstr "" -#: website/public/showcase/notion/index.html:537 +#: website/public/showcase/notion/index.html:539 msgctxt "page:showcase/notion/index.html" msgid "Structured parser output · excerpt" msgstr "" -#: website/public/showcase/notion/index.html:546 +#: website/public/showcase/notion/index.html:548 msgctxt "page:showcase/notion/index.html" msgid "" "Recorded output from an extracted Markdown parser. The table becomes rows and cells." msgstr "" -#: website/public/showcase/notion/index.html:553 +#: website/public/showcase/notion/index.html:555 msgctxt "page:showcase/notion/index.html" msgid "Another path: the offline SQLite connection" msgstr "" #. {ph0}: getSqliteMeta -#: website/public/showcase/notion/index.html:554 +#: website/public/showcase/notion/index.html:556 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11554,14 +11554,14 @@ msgid "" "Subsequent statement batches and results travel over that port." msgstr "" -#: website/public/showcase/notion/index.html:560 +#: website/public/showcase/notion/index.html:562 msgctxt "page:showcase/notion/index.html" msgid "" "Following this handoff explains where the database work runs, and why tracing only the" " initial IPC request misses the later conversation." msgstr "" -#: website/public/showcase/notion/index.html:567 +#: website/public/showcase/notion/index.html:569 msgctxt "page:showcase/notion/index.html" msgid "Sources and how to read the excerpts" msgstr "" @@ -11569,7 +11569,7 @@ msgstr "" #. {ph0}: app.asar #. {ph1}: main/index.js #. {ph2}: isNotionWebContents -#: website/public/showcase/notion/index.html:568 +#: website/public/showcase/notion/index.html:570 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11582,7 +11582,7 @@ msgstr "" #. {ph1}: 58169 #. {ph2}: 736810 #. {ph3}: 422457 -#: website/public/showcase/notion/index.html:576 +#: website/public/showcase/notion/index.html:578 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11592,7 +11592,7 @@ msgid "" "describe those probes rather than a captured desktop UI session." msgstr "" -#: website/public/showcase/notion/index.html:584 +#: website/public/showcase/notion/index.html:586 msgctxt "page:showcase/notion/index.html" msgid "" "The REA result shown here is a focused analysis of the saved tab preload, recorded " @@ -11602,7 +11602,7 @@ msgid "" msgstr "" #. {ph0}: 422457 -#: website/public/showcase/notion/index.html:591 +#: website/public/showcase/notion/index.html:593 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11615,7 +11615,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/notion/index.html:599 +#: website/public/showcase/notion/index.html:601 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11627,7 +11627,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/notion/index.html:606 +#: website/public/showcase/notion/index.html:608 #, python-brace-format msgctxt "page:showcase/notion/index.html" msgid "" @@ -11635,7 +11635,7 @@ msgid "" "function.{ph3}" msgstr "" -#: website/public/showcase/notion/index.html:614 +#: website/public/showcase/notion/index.html:616 msgctxt "page:showcase/notion/index.html" msgid "Analyze your own app" msgstr "" @@ -11652,52 +11652,52 @@ msgid "" "process, with short code excerpts and a look at its rich clipboard format." msgstr "" -#: website/public/showcase/notion/index.html:255 +#: website/public/showcase/notion/index.html:257 msgctxt "page:showcase/notion/index.html" msgid "On this page" msgstr "" -#: website/public/showcase/notion/index.html:263 +#: website/public/showcase/notion/index.html:265 msgctxt "page:showcase/notion/index.html" msgid "Notion Electron case study" msgstr "" -#: website/public/showcase/notion/index.html:277 +#: website/public/showcase/notion/index.html:279 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion analysis prompt" msgstr "" -#: website/public/showcase/notion/index.html:350 +#: website/public/showcase/notion/index.html:352 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion preload excerpt" msgstr "" -#: website/public/showcase/notion/index.html:379 +#: website/public/showcase/notion/index.html:381 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion invoke wrapper excerpt" msgstr "" -#: website/public/showcase/notion/index.html:410 +#: website/public/showcase/notion/index.html:412 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion handler wrapper excerpt" msgstr "" -#: website/public/showcase/notion/index.html:438 +#: website/public/showcase/notion/index.html:440 msgctxt "page:showcase/notion/index.html" msgid "Copy Notion clipboard receiver excerpt" msgstr "" -#: website/public/showcase/notion/index.html:493 +#: website/public/showcase/notion/index.html:495 msgctxt "page:showcase/notion/index.html" msgid "Restoring rich clipboard data on paste" msgstr "" -#: website/public/showcase/notion/index.html:637 +#: website/public/showcase/notion/index.html:639 msgctxt "page:showcase/notion/index.html" msgid "Back to top" msgstr "" -#: website/public/showcase/th04/index.html:107 +#: website/public/showcase/th04/index.html:109 msgctxt "page:showcase/th04/index.html" msgid "Skip to content" msgstr "" @@ -11706,42 +11706,42 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/th04/index.html:199 +#: website/public/showcase/th04/index.html:201 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / TH04" msgstr "" -#: website/public/showcase/th04/index.html:202 +#: website/public/showcase/th04/index.html:204 msgctxt "page:showcase/th04/index.html" msgid "Case study · Touhou 4: Lotus Land Story" msgstr "" #. {ph0}:
-#: website/public/showcase/th04/index.html:203 +#: website/public/showcase/th04/index.html:205 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "Reconstructing TH04's{ph0}bullet patterns." msgstr "" -#: website/public/showcase/th04/index.html:204 +#: website/public/showcase/th04/index.html:206 msgctxt "page:showcase/th04/index.html" msgid "" "A ring of bullets starts with a short angle calculation. Use REA to inspect the " "original DOS function, then follow its instructions into readable C++." msgstr "" -#: website/public/showcase/th04/index.html:209 +#: website/public/showcase/th04/index.html:211 msgctxt "page:showcase/th04/index.html" msgid "PC-98 · 16-bit DOS · C++ and assembly" msgstr "" -#: website/public/showcase/th04/index.html:210 +#: website/public/showcase/th04/index.html:212 msgctxt "page:showcase/th04/index.html" msgid "View the TH04 reconstruction" msgstr "" -#: website/public/showcase/th04/index.html:216 +#: website/public/showcase/th04/index.html:218 msgctxt "page:showcase/th04/index.html" msgid "From original instructions to checked source" msgstr "" @@ -11752,7 +11752,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/th04/index.html:218 +#: website/public/showcase/th04/index.html:220 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -11766,7 +11766,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/th04/index.html:225 +#: website/public/showcase/th04/index.html:227 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -11780,7 +11780,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/th04/index.html:233 +#: website/public/showcase/th04/index.html:235 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -11794,7 +11794,7 @@ msgstr "" #. {ph3}: #. {ph4}: #. {ph5}: -#: website/public/showcase/th04/index.html:240 +#: website/public/showcase/th04/index.html:242 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -11802,21 +11802,21 @@ msgid "" "checks cover the bullet-generation code that contains this helper.{ph5}" msgstr "" -#: website/public/showcase/th04/index.html:249 +#: website/public/showcase/th04/index.html:251 msgctxt "page:showcase/th04/index.html" msgid "" "REA returns the original code and its analysis evidence. The TH04 project supplies the" " maintained source and compiler checks." msgstr "" -#: website/public/showcase/th04/index.html:257 +#: website/public/showcase/th04/index.html:259 msgctxt "page:showcase/th04/index.html" msgid "In this case study" msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:259 +#: website/public/showcase/th04/index.html:261 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}The bullet ring{ph1}" @@ -11824,7 +11824,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:260 +#: website/public/showcase/th04/index.html:262 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}What REA returns{ph1}" @@ -11832,7 +11832,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:261 +#: website/public/showcase/th04/index.html:263 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}Assembly to C++{ph1}" @@ -11840,7 +11840,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:262 +#: website/public/showcase/th04/index.html:264 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}Checking the source{ph1}" @@ -11848,18 +11848,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:263 +#: website/public/showcase/th04/index.html:265 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}The full project{ph1}" msgstr "" -#: website/public/showcase/th04/index.html:268 +#: website/public/showcase/th04/index.html:270 msgctxt "page:showcase/th04/index.html" msgid "How a ring aims at the player" msgstr "" -#: website/public/showcase/th04/index.html:269 +#: website/public/showcase/th04/index.html:271 msgctxt "page:showcase/th04/index.html" msgid "" "Elly's attack requests an aimed ring with an initial count of 16. One helper " @@ -11875,16 +11875,16 @@ msgstr "" #. {ph5}: #. {ph6}: #. {ph7}: -#: website/public/showcase/th04/index.html:276 +#: website/public/showcase/th04/index.html:278 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" msgstr "" -#: website/public/showcase/th04/index.html:281 -#: website/public/showcase/th04/index.html:337 -#: website/public/showcase/th04/index.html:514 -#: website/public/showcase/th04/index.html:548 +#: website/public/showcase/th04/index.html:283 +#: website/public/showcase/th04/index.html:339 +#: website/public/showcase/th04/index.html:516 +#: website/public/showcase/th04/index.html:550 msgctxt "page:showcase/th04/index.html" msgid "Copy" msgstr "" @@ -11895,7 +11895,7 @@ msgstr "" #. {ph3}: #. {ph4}: -#: website/public/showcase/th04/index.html:290 +#: website/public/showcase/th04/index.html:292 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -11903,7 +11903,7 @@ msgid "" "player. Explain the calculation and show the code.{ph3}{ph4}{ph5}" msgstr "" -#: website/public/showcase/th04/index.html:299 +#: website/public/showcase/th04/index.html:301 msgctxt "page:showcase/th04/index.html" msgid "" "An example prompt, with the original executable and reconstruction checkout available " @@ -11911,7 +11911,7 @@ msgid "" msgstr "" #. {ph0}: 0, 16, 32, …, 240 -#: website/public/showcase/th04/index.html:303 +#: website/public/showcase/th04/index.html:305 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -11921,7 +11921,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:323 +#: website/public/showcase/th04/index.html:325 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -11929,12 +11929,12 @@ msgid "" "template rotation 0. {ph0}Open figure{ph1}" msgstr "" -#: website/public/showcase/th04/index.html:331 +#: website/public/showcase/th04/index.html:333 msgctxt "page:showcase/th04/index.html" msgid "The firing template in the recovered source" msgstr "" -#: website/public/showcase/th04/index.html:336 +#: website/public/showcase/th04/index.html:338 msgctxt "page:showcase/th04/index.html" msgid "Elly's ring attack · source excerpt" msgstr "" @@ -11943,7 +11943,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/src/main/boss/elly_phase_ring16.cpp#L26" #. > #. {ph1}: -#: website/public/showcase/th04/index.html:351 +#: website/public/showcase/th04/index.html:353 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -11951,13 +11951,13 @@ msgid "" " attack's source{ph1}." msgstr "" -#: website/public/showcase/th04/index.html:362 +#: website/public/showcase/th04/index.html:364 msgctxt "page:showcase/th04/index.html" msgid "What REA returns" msgstr "" #. {ph0}: bullet_velocity_and_angle_set() -#: website/public/showcase/th04/index.html:363 +#: website/public/showcase/th04/index.html:365 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -11966,41 +11966,41 @@ msgid "" "pattern." msgstr "" -#: website/public/showcase/th04/index.html:371 +#: website/public/showcase/th04/index.html:373 msgctxt "page:showcase/th04/index.html" msgid "Check the DOS image before reading its code" msgstr "" -#: website/public/showcase/th04/index.html:374 +#: website/public/showcase/th04/index.html:376 msgctxt "page:showcase/th04/index.html" msgid "Agent → REA" msgstr "" -#: website/public/showcase/th04/index.html:383 +#: website/public/showcase/th04/index.html:385 msgctxt "page:showcase/th04/index.html" msgid "REA → agent · selected fields" msgstr "" -#: website/public/showcase/th04/index.html:392 +#: website/public/showcase/th04/index.html:394 msgctxt "page:showcase/th04/index.html" msgid "" "The check ties the loaded code and relocation records to the supplied executable. The " "path above is shortened for display." msgstr "" -#: website/public/showcase/th04/index.html:398 +#: website/public/showcase/th04/index.html:400 msgctxt "page:showcase/th04/index.html" msgid "Read the ring's multiply and divide" msgstr "" #. {ph0}: analyze_function -#: website/public/showcase/th04/index.html:402 +#: website/public/showcase/th04/index.html:404 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "Agent → REA · {ph0}" msgstr "" -#: website/public/showcase/th04/index.html:408 +#: website/public/showcase/th04/index.html:410 msgctxt "page:showcase/th04/index.html" msgid "REA → agent · instruction excerpt" msgstr "" @@ -12008,7 +12008,7 @@ msgstr "" #. {ph0}: SI #. {ph1}: DS:53AF #. {ph2}: bullet_template.count -#: website/public/showcase/th04/index.html:416 +#: website/public/showcase/th04/index.html:418 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12017,22 +12017,22 @@ msgid "" "sequence appears below." msgstr "" -#: website/public/showcase/th04/index.html:425 +#: website/public/showcase/th04/index.html:427 msgctxt "page:showcase/th04/index.html" msgid "Find where the pattern turns toward the player" msgstr "" -#: website/public/showcase/th04/index.html:429 +#: website/public/showcase/th04/index.html:431 msgctxt "page:showcase/th04/index.html" msgid "Same function result · aim excerpt" msgstr "" -#: website/public/showcase/th04/index.html:438 +#: website/public/showcase/th04/index.html:440 msgctxt "page:showcase/th04/index.html" msgid "Corresponding maintained C++" msgstr "" -#: website/public/showcase/th04/index.html:446 +#: website/public/showcase/th04/index.html:448 msgctxt "page:showcase/th04/index.html" msgid "" "The instruction operands expose two coordinate differences and a direction helper. Its" @@ -12040,12 +12040,12 @@ msgid "" "readable; REA lets the agent check the original operations behind them." msgstr "" -#: website/public/showcase/th04/index.html:457 +#: website/public/showcase/th04/index.html:459 msgctxt "page:showcase/th04/index.html" msgid "From assembly to readable C++" msgstr "" -#: website/public/showcase/th04/index.html:458 +#: website/public/showcase/th04/index.html:460 msgctxt "page:showcase/th04/index.html" msgid "" "Select a step to match the original instructions with the angle calculation. This " @@ -12055,7 +12055,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:469 +#: website/public/showcase/th04/index.html:471 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}01{ph1} Index" @@ -12063,7 +12063,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:477 +#: website/public/showcase/th04/index.html:479 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}02{ph1} Space" @@ -12071,7 +12071,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:485 +#: website/public/showcase/th04/index.html:487 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}03{ph1} Aim" @@ -12079,7 +12079,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:493 +#: website/public/showcase/th04/index.html:495 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}04{ph1} Rotate" @@ -12087,18 +12087,18 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:501 +#: website/public/showcase/th04/index.html:503 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}05{ph1} Store" msgstr "" -#: website/public/showcase/th04/index.html:513 +#: website/public/showcase/th04/index.html:515 msgctxt "page:showcase/th04/index.html" msgid "REA · original 16-bit instructions" msgstr "" -#: website/public/showcase/th04/index.html:547 +#: website/public/showcase/th04/index.html:549 msgctxt "page:showcase/th04/index.html" msgid "Readable C++ · aimed-ring summary" msgstr "" @@ -12106,7 +12106,7 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: SI -#: website/public/showcase/th04/index.html:576 +#: website/public/showcase/th04/index.html:578 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12118,7 +12118,7 @@ msgstr "" #. {ph1}: #. {ph2}: SHL AX,8 #. {ph3}: IDIV -#: website/public/showcase/th04/index.html:581 +#: website/public/showcase/th04/index.html:583 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12130,7 +12130,7 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: AX -#: website/public/showcase/th04/index.html:588 +#: website/public/showcase/th04/index.html:590 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12142,7 +12142,7 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: ADD AL,[0x53ad] -#: website/public/showcase/th04/index.html:594 +#: website/public/showcase/th04/index.html:596 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12154,7 +12154,7 @@ msgstr "" #. {ph0}: #. {ph1}: #. {ph2}: AL -#: website/public/showcase/th04/index.html:600 +#: website/public/showcase/th04/index.html:602 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12163,7 +12163,7 @@ msgid "" "surrounding source also converts this angle and speed into velocity." msgstr "" -#: website/public/showcase/th04/index.html:609 +#: website/public/showcase/th04/index.html:611 msgctxt "page:showcase/th04/index.html" msgid "" "The assembly selects the aimed-ring branch, aim calculation and final store. The C++ " @@ -12171,17 +12171,17 @@ msgid "" "the linked project." msgstr "" -#: website/public/showcase/th04/index.html:615 +#: website/public/showcase/th04/index.html:617 msgctxt "page:showcase/th04/index.html" msgid "Read the maintained ring and aim source" msgstr "" -#: website/public/showcase/th04/index.html:618 +#: website/public/showcase/th04/index.html:620 msgctxt "page:showcase/th04/index.html" msgid "Ring macro · TH04 branch, excerpt" msgstr "" -#: website/public/showcase/th04/index.html:628 +#: website/public/showcase/th04/index.html:630 msgctxt "page:showcase/th04/index.html" msgid "Angle and velocity · source excerpt" msgstr "" @@ -12198,7 +12198,7 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/src/main/bullet/types.hpp#L6" #. > #. {ph5}: -#: website/public/showcase/th04/index.html:644 +#: website/public/showcase/th04/index.html:646 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12206,36 +12206,36 @@ msgid "" "representation{ph5}" msgstr "" -#: website/public/showcase/th04/index.html:664 +#: website/public/showcase/th04/index.html:666 msgctxt "page:showcase/th04/index.html" msgid "Checking the maintained source" msgstr "" -#: website/public/showcase/th04/index.html:665 +#: website/public/showcase/th04/index.html:667 msgctxt "page:showcase/th04/index.html" msgid "" "The TH04 project's recorded checks compile the bullet-generation code, including this " "helper, with its pinned Turbo C++ 4.0J toolchain." msgstr "" -#: website/public/showcase/th04/index.html:672 +#: website/public/showcase/th04/index.html:674 msgctxt "page:showcase/th04/index.html" msgid "2,139 matching bytes" msgstr "" -#: website/public/showcase/th04/index.html:673 +#: website/public/showcase/th04/index.html:675 msgctxt "page:showcase/th04/index.html" msgid "" "The compiled bullet-generation code matches a 2,139-byte section of the original " "executable." msgstr "" -#: website/public/showcase/th04/index.html:679 +#: website/public/showcase/th04/index.html:681 msgctxt "page:showcase/th04/index.html" msgid "Two clean builds" msgstr "" -#: website/public/showcase/th04/index.html:680 +#: website/public/showcase/th04/index.html:682 msgctxt "page:showcase/th04/index.html" msgid "" "Two separate builds produce the same matching bytes. The recorded input hashes match " @@ -12246,65 +12246,65 @@ msgstr "" #. href="https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/docs/reconstruction/product/TH04_SEMANTIC_BULLET_GENERATION_V1236.md#validation" #. > #. {ph1}: -#: website/public/showcase/th04/index.html:686 +#: website/public/showcase/th04/index.html:688 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "Recorded on 3 October 2026. {ph0}Read the compiler checks{ph1}." msgstr "" -#: website/public/showcase/th04/index.html:694 +#: website/public/showcase/th04/index.html:696 msgctxt "page:showcase/th04/index.html" msgid "Target identity and analysis scope" msgstr "" -#: website/public/showcase/th04/index.html:699 +#: website/public/showcase/th04/index.html:701 msgctxt "page:showcase/th04/index.html" msgid "Original target" msgstr "" #. {ph0}: MAIN.EXE -#: website/public/showcase/th04/index.html:700 +#: website/public/showcase/th04/index.html:702 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}, 156,258 bytes, DOS MZ" msgstr "" -#: website/public/showcase/th04/index.html:703 +#: website/public/showcase/th04/index.html:705 msgctxt "page:showcase/th04/index.html" msgid "Helper entry" msgstr "" #. {ph0}: 0x2cfc8 -#: website/public/showcase/th04/index.html:704 +#: website/public/showcase/th04/index.html:706 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0} in REA's loaded image" msgstr "" -#: website/public/showcase/th04/index.html:707 +#: website/public/showcase/th04/index.html:709 msgctxt "page:showcase/th04/index.html" msgid "Original file offset" msgstr "" #. {ph0}: 0x1e7c8 #. {ph1}: address_to_file_offset -#: website/public/showcase/th04/index.html:708 +#: website/public/showcase/th04/index.html:710 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}, returned by {ph1}" msgstr "" -#: website/public/showcase/th04/index.html:714 +#: website/public/showcase/th04/index.html:716 msgctxt "page:showcase/th04/index.html" msgid "Recorded code inspection" msgstr "" -#: website/public/showcase/th04/index.html:715 +#: website/public/showcase/th04/index.html:717 msgctxt "page:showcase/th04/index.html" msgid "REA 4.1.0 · 7 October 2026" msgstr "" -#: website/public/showcase/th04/index.html:720 +#: website/public/showcase/th04/index.html:722 msgctxt "page:showcase/th04/index.html" msgid "" "Compiler checks cover the complete bullet-add code section, including this helper. " @@ -12312,7 +12312,7 @@ msgid "" msgstr "" #. {ph0}: 0x1000 -#: website/public/showcase/th04/index.html:725 +#: website/public/showcase/th04/index.html:727 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12322,7 +12322,7 @@ msgid "" msgstr "" #. {ph0}: 0d72e980 -#: website/public/showcase/th04/index.html:732 +#: website/public/showcase/th04/index.html:734 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12333,19 +12333,19 @@ msgid "" "open." msgstr "" -#: website/public/showcase/th04/index.html:740 +#: website/public/showcase/th04/index.html:742 msgctxt "page:showcase/th04/index.html" msgid "" "The figure illustrates the angle calculation. Full-game controls, timing and PC-98 " "hardware behavior have separate runtime checks in the reconstruction project." msgstr "" -#: website/public/showcase/th04/index.html:749 +#: website/public/showcase/th04/index.html:751 msgctxt "page:showcase/th04/index.html" msgid "The full TH04 reconstruction" msgstr "" -#: website/public/showcase/th04/index.html:750 +#: website/public/showcase/th04/index.html:752 msgctxt "page:showcase/th04/index.html" msgid "" "The project builds the game's four DOS products from maintained C++ and assembly. " @@ -12355,7 +12355,7 @@ msgstr "" #. {ph0}: #. {ph1}: -#: website/public/showcase/th04/index.html:756 +#: website/public/showcase/th04/index.html:758 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "{ph0}Explore the TH04 repository{ph1}" @@ -12367,7 +12367,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/th04/index.html:762 +#: website/public/showcase/th04/index.html:764 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12381,7 +12381,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/th04/index.html:771 +#: website/public/showcase/th04/index.html:773 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12395,7 +12395,7 @@ msgstr "" #. {ph1}: #. {ph2}: #. {ph3}: -#: website/public/showcase/th04/index.html:780 +#: website/public/showcase/th04/index.html:782 #, python-brace-format msgctxt "page:showcase/th04/index.html" msgid "" @@ -12415,27 +12415,27 @@ msgid "" "C++ to see how a ring of bullets is spaced and aimed at the player." msgstr "" -#: website/public/showcase/th04/index.html:256 +#: website/public/showcase/th04/index.html:258 msgctxt "page:showcase/th04/index.html" msgid "On this page" msgstr "" -#: website/public/showcase/th04/index.html:266 +#: website/public/showcase/th04/index.html:268 msgctxt "page:showcase/th04/index.html" msgid "TH04 bullet-pattern case study" msgstr "" -#: website/public/showcase/th04/index.html:281 +#: website/public/showcase/th04/index.html:283 msgctxt "page:showcase/th04/index.html" msgid "Copy TH04 example prompt" msgstr "" -#: website/public/showcase/th04/index.html:309 +#: website/public/showcase/th04/index.html:311 msgctxt "page:showcase/th04/index.html" msgid "TH04 fixed and aimed bullet rings; scroll horizontally on smaller screens" msgstr "" -#: website/public/showcase/th04/index.html:315 +#: website/public/showcase/th04/index.html:317 msgctxt "page:showcase/th04/index.html" msgid "" "Two diagrams of a 16-bullet ring. The fixed ring starts at angle zero. Adding a player" @@ -12444,27 +12444,27 @@ msgid "" "degrees." msgstr "" -#: website/public/showcase/th04/index.html:337 +#: website/public/showcase/th04/index.html:339 msgctxt "page:showcase/th04/index.html" msgid "Copy TH04 firing template" msgstr "" -#: website/public/showcase/th04/index.html:464 +#: website/public/showcase/th04/index.html:466 msgctxt "page:showcase/th04/index.html" msgid "Follow the TH04 aimed-ring calculation" msgstr "" -#: website/public/showcase/th04/index.html:514 +#: website/public/showcase/th04/index.html:516 msgctxt "page:showcase/th04/index.html" msgid "Copy TH04 assembly excerpt" msgstr "" -#: website/public/showcase/th04/index.html:548 +#: website/public/showcase/th04/index.html:550 msgctxt "page:showcase/th04/index.html" msgid "Copy readable aimed-ring calculation" msgstr "" -#: website/public/showcase/th04/index.html:806 +#: website/public/showcase/th04/index.html:808 msgctxt "page:showcase/th04/index.html" msgid "Back to top" msgstr "" diff --git a/website/locales/ur-Latn/messages.po b/website/locales/ur-Latn/messages.po new file mode 100644 index 0000000000..a3d98c529e --- /dev/null +++ b/website/locales/ur-Latn/messages.po @@ -0,0 +1,12931 @@ +# +msgid "" +msgstr "" +"Project-Id-Version: REA website\n" +"Language: ur-Latn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: website/public/blog/index.html:109 +msgctxt "page:blog/index.html" +msgid "Skip to content" +msgstr "" + +#: website/public/blog/index.html:119 +#: website/public/blog/reverse-engineering-models/index.html:119 +#: website/public/blog/touhou-reconstruction/index.html:119 +#: website/public/contributors/index.html:120 +#: website/public/examples/dino-lab/index.html:120 website/public/faq/index.html:119 +#: website/public/first-investigation/index.html:119 +#: website/public/get-started/index.html:119 +#: website/public/guides/browser/index.html:119 website/public/guides/index.html:119 +#: website/public/guides/javascript/index.html:119 +#: website/public/guides/native/index.html:119 website/public/index.html:121 +#: website/public/showcase/aegis/index.html:120 +#: website/public/showcase/ctf/index.html:119 +#: website/public/showcase/dx-ball/index.html:119 website/public/showcase/index.html:119 +#: website/public/showcase/notion/index.html:119 +#: website/public/showcase/th04/index.html:119 +msgctxt "shared" +msgid "Get started" +msgstr "" + +#: website/public/blog/index.html:120 +#: website/public/blog/reverse-engineering-models/index.html:120 +#: website/public/blog/touhou-reconstruction/index.html:120 +#: website/public/contributors/index.html:121 +#: website/public/examples/dino-lab/index.html:121 website/public/faq/index.html:120 +#: website/public/first-investigation/index.html:120 +#: website/public/get-started/index.html:120 +#: website/public/guides/browser/index.html:120 website/public/guides/index.html:120 +#: website/public/guides/javascript/index.html:120 +#: website/public/guides/native/index.html:120 website/public/index.html:122 +#: website/public/showcase/aegis/index.html:121 +#: website/public/showcase/ctf/index.html:120 +#: website/public/showcase/dx-ball/index.html:120 website/public/showcase/index.html:120 +#: website/public/showcase/notion/index.html:120 +#: website/public/showcase/th04/index.html:120 +msgctxt "shared" +msgid "Showcases" +msgstr "" + +#: website/public/blog/index.html:121 +#: website/public/blog/reverse-engineering-models/index.html:121 +#: website/public/blog/touhou-reconstruction/index.html:121 +#: website/public/contributors/index.html:122 +#: website/public/examples/dino-lab/index.html:122 website/public/faq/index.html:121 +#: website/public/first-investigation/index.html:121 +#: website/public/get-started/index.html:121 +#: website/public/guides/browser/index.html:121 website/public/guides/index.html:121 +#: website/public/guides/javascript/index.html:121 +#: website/public/guides/native/index.html:121 website/public/index.html:123 +#: website/public/showcase/aegis/index.html:122 +#: website/public/showcase/ctf/index.html:121 +#: website/public/showcase/dx-ball/index.html:121 website/public/showcase/index.html:121 +#: website/public/showcase/notion/index.html:121 +#: website/public/showcase/th04/index.html:121 +msgctxt "shared" +msgid "Blog" +msgstr "" + +#: website/public/blog/index.html:122 +#: website/public/blog/reverse-engineering-models/index.html:122 +#: website/public/blog/touhou-reconstruction/index.html:122 +#: website/public/contributors/index.html:123 +#: website/public/examples/dino-lab/index.html:123 website/public/faq/index.html:122 +#: website/public/first-investigation/index.html:122 +#: website/public/get-started/index.html:122 +#: website/public/guides/browser/index.html:122 website/public/guides/index.html:122 +#: website/public/guides/javascript/index.html:122 +#: website/public/guides/native/index.html:122 website/public/index.html:124 +#: website/public/showcase/aegis/index.html:123 +#: website/public/showcase/ctf/index.html:122 +#: website/public/showcase/dx-ball/index.html:122 website/public/showcase/index.html:122 +#: website/public/showcase/notion/index.html:122 +#: website/public/showcase/th04/index.html:122 +msgctxt "shared" +msgid "Guides" +msgstr "" + +#: website/public/blog/index.html:124 website/public/blog/index.html:243 +#: website/public/blog/reverse-engineering-models/index.html:124 +#: website/public/blog/reverse-engineering-models/index.html:882 +#: website/public/blog/touhou-reconstruction/index.html:124 +#: website/public/blog/touhou-reconstruction/index.html:1079 +#: website/public/contributors/index.html:125 +#: website/public/contributors/index.html:1130 +#: website/public/examples/dino-lab/index.html:125 +#: website/public/examples/dino-lab/index.html:474 website/public/faq/index.html:124 +#: website/public/faq/index.html:572 website/public/first-investigation/index.html:124 +#: website/public/first-investigation/index.html:533 +#: website/public/get-started/index.html:124 website/public/get-started/index.html:1816 +#: website/public/guides/browser/index.html:124 +#: website/public/guides/browser/index.html:506 website/public/guides/index.html:124 +#: website/public/guides/index.html:281 website/public/guides/javascript/index.html:124 +#: website/public/guides/javascript/index.html:502 +#: website/public/guides/native/index.html:124 +#: website/public/guides/native/index.html:508 website/public/index.html:126 +#: website/public/index.html:1221 website/public/showcase/aegis/index.html:125 +#: website/public/showcase/aegis/index.html:807 +#: website/public/showcase/ctf/index.html:124 website/public/showcase/ctf/index.html:776 +#: website/public/showcase/dx-ball/index.html:124 +#: website/public/showcase/dx-ball/index.html:784 website/public/showcase/index.html:124 +#: website/public/showcase/index.html:316 website/public/showcase/notion/index.html:124 +#: website/public/showcase/notion/index.html:630 +#: website/public/showcase/th04/index.html:124 +#: website/public/showcase/th04/index.html:799 +msgctxt "shared" +msgid "Contributors" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/index.html:201 +#, python-brace-format +msgctxt "page:blog/index.html" +msgid "{ph0}Home{ph1} / Blog" +msgstr "" + +#: website/public/blog/index.html:202 +msgctxt "page:blog/index.html" +msgid "Blog." +msgstr "" + +#: website/public/blog/index.html:203 +msgctxt "page:blog/index.html" +msgid "Thoughts on reverse engineering." +msgstr "" + +#. {ph0}:
+#: website/public/blog/index.html:207 +#, python-brace-format +msgctxt "page:blog/index.html" +msgid "Model specialization{ph0}Essay" +msgstr "" + +#: website/public/blog/index.html:209 +msgctxt "page:blog/index.html" +msgid "Does reverse engineering need a bigger model?" +msgstr "" + +#: website/public/blog/index.html:210 +msgctxt "page:blog/index.html" +msgid "" +"What Touhou reconstruction suggests about general models, specialist models and " +"learning from compiler feedback." +msgstr "" + +#: website/public/blog/index.html:214 website/public/blog/index.html:229 +msgctxt "page:blog/index.html" +msgid "Read the article" +msgstr "" + +#: website/public/blog/index.html:217 +msgctxt "page:blog/index.html" +msgid "By N0zoM1z0 · 13 October 2026" +msgstr "" + +#. {ph0}:
+#: website/public/blog/index.html:221 +#, python-brace-format +msgctxt "page:blog/index.html" +msgid "Game reconstruction{ph0}Essay" +msgstr "" + +#: website/public/blog/index.html:223 +msgctxt "page:blog/index.html" +msgid "The industrial revolution in reverse engineering" +msgstr "" + +#: website/public/blog/index.html:224 +msgctxt "page:blog/index.html" +msgid "" +"What manual RE and reconstructing TH08, TH095 and TH04 taught me about agents, " +"verification and knowledge that compounds across projects." +msgstr "" + +#: website/public/blog/index.html:232 +msgctxt "page:blog/index.html" +msgid "By N0zoM1z0 · 10 October 2026" +msgstr "" + +#: website/public/blog/index.html:244 +#: website/public/blog/reverse-engineering-models/index.html:883 +#: website/public/blog/touhou-reconstruction/index.html:1080 +#: website/public/contributors/index.html:1131 +#: website/public/examples/dino-lab/index.html:475 website/public/faq/index.html:573 +#: website/public/first-investigation/index.html:534 +#: website/public/get-started/index.html:1817 +#: website/public/guides/browser/index.html:507 website/public/guides/index.html:282 +#: website/public/guides/javascript/index.html:503 +#: website/public/guides/native/index.html:509 website/public/index.html:1222 +#: website/public/showcase/aegis/index.html:808 +#: website/public/showcase/ctf/index.html:777 +#: website/public/showcase/dx-ball/index.html:785 website/public/showcase/index.html:317 +#: website/public/showcase/notion/index.html:631 +#: website/public/showcase/th04/index.html:800 +msgctxt "shared" +msgid "Source" +msgstr "" + +#: website/public/blog/index.html:245 +#: website/public/blog/reverse-engineering-models/index.html:884 +#: website/public/blog/touhou-reconstruction/index.html:1081 +#: website/public/contributors/index.html:1132 +#: website/public/examples/dino-lab/index.html:476 website/public/faq/index.html:574 +#: website/public/first-investigation/index.html:535 +#: website/public/get-started/index.html:1818 +#: website/public/guides/browser/index.html:508 website/public/guides/index.html:283 +#: website/public/guides/javascript/index.html:504 +#: website/public/guides/native/index.html:510 website/public/index.html:1223 +#: website/public/showcase/aegis/index.html:809 +#: website/public/showcase/ctf/index.html:778 +#: website/public/showcase/dx-ball/index.html:786 website/public/showcase/index.html:318 +#: website/public/showcase/notion/index.html:632 +#: website/public/showcase/th04/index.html:801 +msgctxt "shared" +msgid "MIT license" +msgstr "" + +#: website/public/blog/index.html:246 +#: website/public/blog/reverse-engineering-models/index.html:885 +#: website/public/blog/touhou-reconstruction/index.html:1082 +#: website/public/contributors/index.html:1133 +#: website/public/examples/dino-lab/index.html:477 website/public/faq/index.html:575 +#: website/public/first-investigation/index.html:536 +#: website/public/get-started/index.html:1819 +#: website/public/guides/browser/index.html:509 website/public/guides/index.html:284 +#: website/public/guides/javascript/index.html:505 +#: website/public/guides/native/index.html:511 website/public/index.html:1224 +#: website/public/showcase/aegis/index.html:810 +#: website/public/showcase/ctf/index.html:779 +#: website/public/showcase/dx-ball/index.html:787 website/public/showcase/index.html:319 +#: website/public/showcase/notion/index.html:633 +#: website/public/showcase/th04/index.html:802 +msgctxt "shared" +msgid "Join the community" +msgstr "" + +#: website/public/blog/index.html:247 +#: website/public/blog/reverse-engineering-models/index.html:886 +#: website/public/blog/touhou-reconstruction/index.html:1083 +#: website/public/contributors/index.html:1134 +#: website/public/examples/dino-lab/index.html:478 website/public/faq/index.html:576 +#: website/public/first-investigation/index.html:537 +#: website/public/get-started/index.html:1820 +#: website/public/guides/browser/index.html:510 website/public/guides/index.html:285 +#: website/public/guides/javascript/index.html:506 +#: website/public/guides/native/index.html:512 website/public/index.html:1225 +#: website/public/showcase/aegis/index.html:811 +#: website/public/showcase/ctf/index.html:780 +#: website/public/showcase/dx-ball/index.html:788 website/public/showcase/index.html:320 +#: website/public/showcase/notion/index.html:634 +#: website/public/showcase/th04/index.html:803 +msgctxt "shared" +msgid "Follow us on X" +msgstr "" + +#. {ph0}: +#: website/public/blog/index.html:252 +#: website/public/blog/reverse-engineering-models/index.html:891 +#: website/public/blog/touhou-reconstruction/index.html:1088 +#: website/public/contributors/index.html:1139 +#: website/public/examples/dino-lab/index.html:483 website/public/faq/index.html:581 +#: website/public/first-investigation/index.html:542 +#: website/public/get-started/index.html:1825 +#: website/public/guides/browser/index.html:515 website/public/guides/index.html:290 +#: website/public/guides/javascript/index.html:511 +#: website/public/guides/native/index.html:517 website/public/index.html:1230 +#: website/public/showcase/aegis/index.html:816 +#: website/public/showcase/ctf/index.html:785 +#: website/public/showcase/dx-ball/index.html:793 website/public/showcase/index.html:325 +#: website/public/showcase/notion/index.html:639 +#: website/public/showcase/th04/index.html:808 +#, python-brace-format +msgctxt "shared" +msgid "{ph0}↑{ph1} Top" +msgstr "" + +#: website/public/blog/index.html:6 +msgctxt "page:blog/index.html" +msgid "REA Blog — Thoughts on Reverse Engineering" +msgstr "" + +#: website/public/blog/index.html:7 +msgctxt "page:blog/index.html" +msgid "" +"Thoughts on reverse engineering, drawing on practical experience with REA and AI " +"agents." +msgstr "" + +#: website/public/blog/index.html:81 website/public/blog/index.html:94 +#: website/public/blog/reverse-engineering-models/index.html:81 +#: website/public/blog/reverse-engineering-models/index.html:94 +#: website/public/blog/touhou-reconstruction/index.html:81 +#: website/public/blog/touhou-reconstruction/index.html:94 +#: website/public/contributors/index.html:81 website/public/contributors/index.html:94 +#: website/public/examples/dino-lab/index.html:81 +#: website/public/examples/dino-lab/index.html:94 website/public/faq/index.html:81 +#: website/public/faq/index.html:94 website/public/first-investigation/index.html:81 +#: website/public/first-investigation/index.html:94 +#: website/public/get-started/index.html:81 website/public/get-started/index.html:94 +#: website/public/guides/browser/index.html:81 +#: website/public/guides/browser/index.html:94 website/public/guides/index.html:81 +#: website/public/guides/index.html:94 website/public/guides/javascript/index.html:81 +#: website/public/guides/javascript/index.html:94 +#: website/public/guides/native/index.html:81 website/public/guides/native/index.html:94 +#: website/public/index.html:81 website/public/index.html:94 +#: website/public/showcase/aegis/index.html:81 +#: website/public/showcase/aegis/index.html:94 website/public/showcase/ctf/index.html:81 +#: website/public/showcase/ctf/index.html:94 +#: website/public/showcase/dx-ball/index.html:81 +#: website/public/showcase/dx-ball/index.html:94 website/public/showcase/index.html:81 +#: website/public/showcase/index.html:94 website/public/showcase/notion/index.html:81 +#: website/public/showcase/notion/index.html:94 +#: website/public/showcase/th04/index.html:81 website/public/showcase/th04/index.html:94 +msgctxt "shared" +msgid "REA — Find out how software works. Reverse engineering with your coding agent." +msgstr "" + +#: website/public/blog/index.html:114 +#: website/public/blog/reverse-engineering-models/index.html:114 +#: website/public/blog/touhou-reconstruction/index.html:114 +#: website/public/contributors/index.html:115 +#: website/public/examples/dino-lab/index.html:115 website/public/faq/index.html:114 +#: website/public/first-investigation/index.html:114 +#: website/public/get-started/index.html:114 +#: website/public/guides/browser/index.html:114 website/public/guides/index.html:114 +#: website/public/guides/javascript/index.html:114 +#: website/public/guides/native/index.html:114 website/public/index.html:116 +#: website/public/showcase/aegis/index.html:115 +#: website/public/showcase/ctf/index.html:114 +#: website/public/showcase/dx-ball/index.html:114 website/public/showcase/index.html:114 +#: website/public/showcase/notion/index.html:114 +#: website/public/showcase/th04/index.html:114 +msgctxt "shared" +msgid "REA home" +msgstr "" + +#: website/public/blog/index.html:118 +#: website/public/blog/reverse-engineering-models/index.html:118 +#: website/public/blog/touhou-reconstruction/index.html:118 +#: website/public/contributors/index.html:119 +#: website/public/examples/dino-lab/index.html:119 website/public/faq/index.html:118 +#: website/public/first-investigation/index.html:118 +#: website/public/get-started/index.html:118 +#: website/public/guides/browser/index.html:118 website/public/guides/index.html:118 +#: website/public/guides/javascript/index.html:118 +#: website/public/guides/native/index.html:118 website/public/index.html:120 +#: website/public/showcase/aegis/index.html:119 +#: website/public/showcase/ctf/index.html:118 +#: website/public/showcase/dx-ball/index.html:118 website/public/showcase/index.html:118 +#: website/public/showcase/notion/index.html:118 +#: website/public/showcase/th04/index.html:118 +msgctxt "shared" +msgid "Main navigation" +msgstr "" + +#: website/public/blog/index.html:137 +#: website/public/blog/reverse-engineering-models/index.html:137 +#: website/public/blog/touhou-reconstruction/index.html:137 +#: website/public/contributors/index.html:138 +#: website/public/examples/dino-lab/index.html:138 website/public/faq/index.html:137 +#: website/public/first-investigation/index.html:137 +#: website/public/get-started/index.html:137 +#: website/public/guides/browser/index.html:137 website/public/guides/index.html:137 +#: website/public/guides/javascript/index.html:137 +#: website/public/guides/native/index.html:137 website/public/index.html:139 +#: website/public/showcase/aegis/index.html:138 +#: website/public/showcase/ctf/index.html:137 +#: website/public/showcase/dx-ball/index.html:137 website/public/showcase/index.html:137 +#: website/public/showcase/notion/index.html:137 +#: website/public/showcase/th04/index.html:137 +msgctxt "shared" +msgid "REA on GitHub" +msgstr "" + +#: website/public/blog/index.html:157 +#: website/public/blog/reverse-engineering-models/index.html:157 +#: website/public/blog/touhou-reconstruction/index.html:157 +#: website/public/contributors/index.html:158 +#: website/public/examples/dino-lab/index.html:158 website/public/faq/index.html:157 +#: website/public/first-investigation/index.html:157 +#: website/public/get-started/index.html:157 +#: website/public/guides/browser/index.html:157 website/public/guides/index.html:157 +#: website/public/guides/javascript/index.html:157 +#: website/public/guides/native/index.html:157 website/public/index.html:159 +#: website/public/showcase/aegis/index.html:158 +#: website/public/showcase/ctf/index.html:157 +#: website/public/showcase/dx-ball/index.html:157 website/public/showcase/index.html:157 +#: website/public/showcase/notion/index.html:157 +#: website/public/showcase/th04/index.html:157 +msgctxt "shared" +msgid "Join REA on Discord" +msgstr "" + +#: website/public/blog/index.html:176 +#: website/public/blog/reverse-engineering-models/index.html:176 +#: website/public/blog/touhou-reconstruction/index.html:176 +#: website/public/contributors/index.html:177 +#: website/public/examples/dino-lab/index.html:177 website/public/faq/index.html:176 +#: website/public/first-investigation/index.html:176 +#: website/public/get-started/index.html:176 +#: website/public/guides/browser/index.html:176 website/public/guides/index.html:176 +#: website/public/guides/javascript/index.html:176 +#: website/public/guides/native/index.html:176 website/public/index.html:178 +#: website/public/showcase/aegis/index.html:177 +#: website/public/showcase/ctf/index.html:176 +#: website/public/showcase/dx-ball/index.html:176 website/public/showcase/index.html:176 +#: website/public/showcase/notion/index.html:176 +#: website/public/showcase/th04/index.html:176 +msgctxt "shared" +msgid "Follow REA on X" +msgstr "" + +#: website/public/blog/index.html:252 +msgctxt "page:blog/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:109 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/reverse-engineering-models/index.html:201 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "{ph0}Home{ph1} / {ph2}Blog{ph3} / Models and RE" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:204 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Essay" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:205 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Does reverse engineering need a bigger model?" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:206 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "By N0zoM1z0 · 13 October 2026" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:208 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Takeaway" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:210 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}Model capability changes the hypotheses an agent can find.{ph1} Later sessions " +"have solved problems that earlier work left unresolved." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:218 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}A familiar compiler gives specialization something concrete to learn.{ph1} Some " +"exact matches depend on narrow, reusable source patterns." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:225 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}Give repository knowledge a fair comparison.{ph1} A smaller model with good " +"retrieval may already know enough to make progress." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:230 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}Train the next useful experiment, and test its oracle.{ph1} The value of feedback" +" depends on what the checker actually verifies." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:237 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}Measure accepted reconstruction against time and cost.{ph1} That is the result I " +"want from the whole agent." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:248 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "In this article" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:250 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "{ph0}What better models changed{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:251 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "{ph0}Why specialize?{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:252 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "{ph0}Where experience lives{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:253 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "{ph0}Learning the next experiment{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:254 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "{ph0}RE and reinforcement learning{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:255 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "{ph0}When the oracle is wrong{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:256 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "{ph0}A comparison worth running{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:257 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "{ph0}What kind of agent?{ph1}" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:265 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "What better models changed" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:266 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Since August 2026, I have been exploring how much reverse engineering an agent can " +"carry out with access to a program and a way to check its work. Most of my experience " +"comes from reconstructing games, especially Touhou. As I have changed models, the " +"repositories have kept a record of what each session managed to recover." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:274 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Much of that work aims at exact reconstruction: we compile the maintained source under" +" a pinned historical toolchain and check whether it reproduces the target function. " +"When a later model succeeds where earlier work stalled, the source changes show what " +"made that progress possible." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:281 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "The temporary values had to stay alive together" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:282 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Much of a TH09 attack function's logic had already been reconstructed, but the " +"compiler still stored temporary results differently from the original. The remaining " +"problem was how long those results needed to stay alive and when their storage could " +"be reused." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/reverse-engineering-models/index.html:289 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"A {ph0}GPT-6-Sol checkpoint{ph1} recorded this mismatch after testing several ordinary" +" source arrangements. When {ph2}GPT-6.1-Sol returned to the problem{ph3}, it found a " +"useful hypothesis about how long those temporary values needed to stay alive." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:303 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"The function produced temporary results and copied them into animation positions. In " +"C++, a temporary result stays alive until the expression using it finishes. Grouping " +"the real operations into one expression kept those results alive together, so the " +"compiler could no longer reuse the same storage for all of them." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:310 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"One result still shared storage with a value used later for collision checks. Giving " +"that value its own lifetime resolved the remaining overlap. After several targeted " +"experiments, {ph0}a clean rebuild confirmed that the full function matched{ph1}." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:319 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"What interests me is how the discovery and the tests worked together. The lifetime " +"hypothesis gave the agent a new direction; compiler feedback helped it refine that " +"hypothesis into a source arrangement that matched." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:325 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "A different control-flow graph" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:326 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"A second TH09 function shows why that new direction can matter. Here, the obstacle was" +" how several branches shared their final work. {ph0}GPT-6.1-Sol's earlier work{ph1} " +"got parts of the function to match, but the branches still joined up differently from " +"the original." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/reverse-engineering-models/index.html:337 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}GPT-6-Astra changed the surrounding control-flow graph{ph1}. The main paths now " +"led to a shared final update and return. In that source structure, the compiler " +"combined the branches in the same way as the original. The complete function matched, " +"and a {ph2}separate rebuild check confirmed it{ph3}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:349 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}Changing the representation opened a more productive search space.{ph1} Both " +"cases give me a reason to take general model capability seriously: an agent can keep " +"trying local variations for a long time before finding a better way to express the " +"surrounding work." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:358 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"At the same time, the later sessions started with earlier source and recorded " +"failures. That accumulated work was part of their advantage. The history lets us " +"inspect the discoveries and their checks; a controlled comparison would help separate " +"the effect of the model from the experience it inherited." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:365 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"This is where the question becomes interesting to me. Some of the progress came from " +"finding a new representation, while much of the remaining work involved testing source" +" forms against a familiar compiler. How much needs broad reasoning ability, and how " +"much could a model learn through repeated experience with that compiler and code?" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:375 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Why might a specialist do well?" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:376 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Touhou gives us a concrete reason to expect that experience to help. Much of the game " +"code comes from the same author, ZUN, so recurring habits are a reasonable starting " +"assumption. The repositories back that up with useful examples: related loops and " +"helper arrangements have supplied hypotheses across games." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:383 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Those source patterns become more specific when we include the compiler. Under a " +"particular version and set of options, small changes in source can produce repeatable " +"differences in machine code. Some of those differences are surprisingly obscure." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: Supervisor::LoadDat +#. {ph4}: +#: website/public/blog/reverse-engineering-models/index.html:389 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"In TH095, for example, {ph0}even the name used for a local variable could change where" +" VC7.1 stored it{ph1}. Moving the declaration alone did not solve the layout, but an " +"earlier background function had revealed a naming pattern that affected the compiler's" +" choice. That gave us a more promising hypothesis for {ph2}the reconstruction of " +"{ph3}{ph4}." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:403 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Reusing that pattern for the file-size variable produced the required layout without " +"adding storage. The full function then matched." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:408 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"This is the sort of narrow detail a general model may not know when it arrives. A " +"specialist trained on this compiler could encounter many such cases and learn which " +"source variations are worth testing first." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:414 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"The opportunity is especially clear in final matching problems where we already " +"understand the behavior. We are then asking which ordinary source form this compiler " +"turns into the observed instructions. Specialization could help the model propose " +"those forms more efficiently, while the target still determines which hypotheses " +"survive." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:422 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"The useful patterns would have to retain their context, though. TH08 uses an earlier " +"Visual C++ version than TH095 and TH09. TH04 uses a different DOS-era compiler, and " +"its {ph0}player reconstruction{ph1} needed different hypotheses about source patterns " +"and how the compiled code was combined into an executable. Shared authorship gives us " +"a prior, but each target tells us whether it applies. Distinguishing those contexts is" +" part of what a specialist would need to learn." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:438 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Where should that experience live?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:439 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Before deciding to teach those patterns through model training, I would look at the " +"knowledge we already keep in the repository. In the {ph0}previous essay{ph1}, I wrote " +"about it becoming the project's working memory. That memory includes compiler lessons," +" along with the source and failed experiments that made them useful." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:448 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"By retrieving that record, an agent can start with a known result and inspect how we " +"reached it. It can also avoid alternatives that have already failed in the same " +"context. The starting point improves without changing the model's weights." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:454 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"When reconstructing TH09's enemy-spawn function, a {ph0}GPT-6-Luna-max session{ph1} " +"drew a hypothesis from TH08's corresponding source family. That earlier source " +"suggested how to structure the loop and handle failures within it. TH09's own evidence" +" supplied the game-specific details, and clean rebuilds confirmed the complete match." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:465 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}\"The model did not know that compiler quirk\" and \"the model could not use it\"" +" are different problems.{ph1} Retrieval may solve the first, but turning that fact " +"into a useful candidate still takes work. And if the candidate fails, the model must " +"decide what the result means for its next attempt. Knowing the relevant pattern is " +"only the beginning of that process." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:475 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"For that reason, I would include a smaller general model with good retrieval in any " +"comparison. Giving it the same library of experience would help us identify what " +"training adds: better candidate generation, better decisions after feedback, or both." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:483 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Learning the next useful experiment" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:484 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Those decisions after feedback are what I would most like to study. In agentic " +"reconstruction, the model proposes an explanation and tests it against the program. " +"Even when the candidate fails, the result can narrow the remaining possibilities and " +"suggest a more useful next experiment." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:491 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Consider the temporary-results example again. Its final source shows the arrangement " +"that worked, but the route to that source contains more information. Each of the " +"following experiments helped identify what still needed to change." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:504 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Experiment" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:505 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "What its result taught us" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:510 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Try a different way to copy the results" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:511 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "The copy code changes, but the function still differs." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:516 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Use the returned values directly" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:517 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Copying follows the original pattern, but temporary storage still differs." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:523 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Keep the temporary results alive together" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:524 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"They get separate storage, but one still overlaps a value used later for collision " +"checks." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:530 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Keep the collision-check value separate" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:531 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "A clean rebuild confirms the complete match." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:536 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Selected experiments from the attack-function reconstruction above, grouped by what " +"they taught us." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:540 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"A training record that keeps this sequence can teach more than the final source alone." +" It connects each proposed change to an observed result and the next decision. Keeping" +" ineffective variations matters too: they tell a later agent which hypotheses have " +"already been tested in that context." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:547 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}I would want the model to learn how to use feedback.{ph1} A neutral result is a " +"reason to reconsider the variation; a changed mismatch may point to another cause. " +"When local edits stop being informative, the agent should be able to revisit the " +"source representation or inspect the evidence again." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:556 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Learning to make those choices requires autonomy. Sometimes the useful next step is " +"inspecting another caller rather than compiling another edit. A rigid sequence of " +"required rewrites would remove that choice, along with part of the behavior we want " +"the model to learn." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:565 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Why RE is interesting for reinforcement learning" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:566 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Bounded reconstruction gives us a practical environment for studying these choices. " +"Once the target and compiler are pinned, many source experiments produce quick, " +"repeatable feedback. The agent can compile a candidate, inspect the mismatch and use " +"that observation to choose its next step." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:573 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Reinforcement learning could train that decision-making process through the feedback " +"it receives. A candidate accepted by a defined check gives us a concrete outcome, " +"while the sequence of attempts lets us observe how much work it took to reach it." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/reverse-engineering-models/index.html:579 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"There is already research supporting this direction. {ph0}LLM4Decompile{ph1} studies " +"models specialized for decompilation. {ph2}AutoDecompiler{ph3} trains multi-turn " +"refinement using compiler and execution feedback. Their studies focus on functional " +"recovery. For this work, I would use them as a starting point for the related task of " +"finding source that matches a historical compiler's output." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:591 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"To reach such a well-defined task, though, we may first need to establish what a " +"function owns or devise a new runtime measurement. In TH08, for example, a " +"{ph0}collision difference led back to how the original program handled floating-point " +"calculations{ph1}. Before the agent could test a useful correction, it had to work out" +" what to measure." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:602 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"This suggests another role for a broadly capable model: helping make the problem " +"checkable in the first place. Once that check exists, we can investigate how far a " +"learned search policy can get with it." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:610 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "When the oracle is wrong" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:611 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Once we train against that check, its coverage becomes part of what the model learns. " +"I call the reference or checker an oracle. Even if it gives a repeatable answer, we " +"still need to understand what that answer covers." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:617 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"TH08 showed how much can hide outside that coverage. Some reconstructed functions " +"passed their exact comparisons with wrong floating constants. The comparator adjusted " +"relocated addresses before checking instructions, but it checked the values behind " +"those addresses only when they had been explicitly recorded for verification. Other " +"literal references could pass without their values being examined." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: 1.0f +#. {ph3}: 32.0f +#: website/public/blog/reverse-engineering-models/index.html:626 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"To close that gap, a {ph0}wider audit{ph1} found incorrect constants in functions that" +" had already been accepted. In one calculation, the reconstructed source added {ph2} " +"where the original added {ph3}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:636 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}A learner rewarded by the old check could learn to produce the wrong " +"reconstruction.{ph1} We had not trained an RL model against this oracle; the observed " +"failure was in the check itself. But using that check as a reward would have made the " +"same blind spot part of the learning environment." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:646 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"A functional test can have a similar blind spot. {ph0}Differential-fuzzing research on" +" LLM decompilers{ph1} has found behavior differences beyond the supplied tests. " +"Passing those tests therefore needs to be read in terms of the cases they exercise, " +"just as an instruction match needs to be read in terms of the bytes and data it " +"checks." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:656 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Before using either kind of check as a reward, I would test it with deliberate " +"failures. I would also keep final acceptance outside the candidate's editable source, " +"so the model has to satisfy the check through its reconstruction. Otherwise, something" +" like a byte array copied from the target could satisfy a naive score without " +"recovering useful source." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:664 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}Improving the learner and improving its oracle belong to the same research " +"problem.{ph1} As the learner gets better at optimizing the feedback we give it, " +"understanding that feedback becomes more important too." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:674 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "A comparison worth running" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:675 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"With those checks in place, I would start the comparison on a fixed VC7.1 task family." +" First, I would establish baselines for a strong general model and a smaller one. " +"Adding repository knowledge to the smaller model would show what retrieval changes. " +"From there, supervised specialization and an RL-trained version would let us examine " +"what training adds." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:683 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"To make those comparisons informative, each model would receive the same target " +"evidence and tools. For the training-specific comparisons, I would keep the base model" +" and available knowledge fixed as well. Repeated trials would help distinguish a " +"reliable search strategy from a lucky candidate." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:690 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"I would then separate two starting conditions: reconstructing a function from its " +"instructions, and closing the last few differences in maintained source. A specialist " +"might be excellent at the second task while a general model does much of the work " +"needed to reach it. Measuring them separately would reveal that division of work." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:698 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Both tasks need genuinely held-out examples. Because related Touhou games share engine" +" code, holding out a game's name would still allow nearly identical functions to " +"appear in training. I would instead hold out source families and keep their accepted " +"answers out of both training and retrieval." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:705 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"On those examples, the outcome would be complete, independently validated matches. " +"Giving each model the same candidate or compile budget would help compare search " +"quality. Measuring elapsed time and total cost, including compilation, would tell us " +"whether that quality produces an efficient workflow. Training costs would need their " +"own accounting too." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:713 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Both views matter because a cheaper proposal can become an expensive workflow if it " +"causes more uninformative compiles. Conversely, a slower model may pay for itself by " +"finding a useful experiment sooner. The comparison should capture those costs." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:719 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"Counting accepted results also keeps intermediate progress in perspective. One TH09 " +"{ph0}replay-save candidate{ph1} looked promising because the compiled function had the" +" expected size, but a full comparison still found substantial differences. Changes in " +"how the compiler arranges instructions can also make a candidate look closer without " +"resolving the underlying problem. Such diagnostics can guide the next experiment, but " +"I would validate any reward for \"getting closer\" against the full acceptance check." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:734 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"I would be interested in the pattern across these results. If a specialist does well " +"within a familiar compiler family, does that advantage survive a toolchain change? And" +" once both models have good retrieval, how much does training still add? The answers " +"would help us decide where each kind of model is most useful." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:743 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "What kind of agent does this suggest?" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:744 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"If the models turn out to help at different stages, a useful arrangement might be a " +"broad agent with access to a specialist. Once a task becomes a familiar compiler " +"search, it could ask the specialist for candidates. If the results stop making sense, " +"the broader agent could return to the target evidence or investigate the measurement " +"itself." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:752 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"In that arrangement, specialization becomes a tool the agent can choose as the " +"investigation develops. The agent keeps the freedom to change direction that made the " +"earlier breakthroughs possible." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:757 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"This follows naturally from the industrial shift I described in the previous essay. " +"Being able to run many more experiments changes how we organize the work. It also " +"gives us a reason to ask which decisions need broad judgment and which improve through" +" repeated experience with a particular craft." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:764 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"For now, the strongest general model has earned its place in my workflow by opening " +"problems I had left unresolved. Those successes are what make me want to examine the " +"work more closely: how much depended on the model's breadth, and how much could be " +"handled by a model trained in this particular kind of reconstruction?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:772 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}The repositories give us a way to test the question.{ph1} I would like to use " +"that record to build the comparison and see what we learn." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:782 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Evidence and model attribution" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/reverse-engineering-models/index.html:783 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}Detailed evidence notes{ph1} include the recorded comparisons and experiment " +"context." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:790 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"The examples describe historical function-level comparisons recorded in the linked " +"commits. Whole-game runtime checks are separate milestones. Source and matching " +"records were reviewed on 13 October 2026." +msgstr "" + +#. {ph0}: gpt-dots +#. {ph1}: gpt-web +#: website/public/blog/reverse-engineering-models/index.html:796 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"The TH09 label {ph0} identifies GPT-6-Astra. {ph1} changed with the model used at the " +"time, so that label alone does not identify an individual run. Explicit model names in" +" the other cited commits establish their recorded attribution; the histories do not " +"contain uniform per-run cost or effort measurements." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/blog/reverse-engineering-models/index.html:805 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}TH09 temporary lifetimes:{ph1} the {ph2}earlier context review{ph3} and " +"{ph4}complete cold reconstruction{ph5}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#. {ph6}: +#. {ph7}: +#: website/public/blog/reverse-engineering-models/index.html:817 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}TH09 Front callback:{ph1} {ph2}non-exact diagnostic regions{ph3}, {ph4}Astra's " +"new graph{ph5} and its {ph6}accepted recompile replay{ph7}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#. {ph6}: +#. {ph7}: +#: website/public/blog/reverse-engineering-models/index.html:833 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}Compiler knowledge:{ph1} {ph2}TH095 identifier-bucket reuse{ph3}, {ph4}TH04 " +"player source and linker order{ph5} and {ph6}Luna's TH09 enemy-spawn closure{ph7}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#. {ph6}: +#. {ph7}: +#: website/public/blog/reverse-engineering-models/index.html:849 +#, python-brace-format +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"{ph0}Checks and diagnostics:{ph1} {ph2}TH08 floating-literal audit{ph3}, {ph4}TH08 " +"numerical investigation{ph5} and {ph6}TH09 replay-save reconstruction{ph7}." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:866 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"The proposed specialist and RL comparisons are future experiments. The project " +"histories motivate them; no trained specialist was evaluated for this essay." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:6 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Does reverse engineering need a bigger model? | REA" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:7 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "" +"What Touhou reconstruction taught me about general models, specialist models and " +"learning to propose better hypotheses from compiler feedback." +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:247 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "On this page" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:260 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Models and reverse engineering essay" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:498 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Selected reconstruction experiments" +msgstr "" + +#: website/public/blog/reverse-engineering-models/index.html:891 +msgctxt "page:blog/reverse-engineering-models/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:109 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/touhou-reconstruction/index.html:201 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}Home{ph1} / {ph2}Blog{ph3} / Touhou reconstruction" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:205 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Essay · Touhou reconstruction" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:206 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "The industrial revolution in reverse engineering." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:207 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "By N0zoM1z0 · 10 October 2026" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:209 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Takeaway" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:211 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Give agents autonomy over the investigation.{ph1} Set a clear goal and acceptance" +" criteria, then let the agent decide what to try next." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:216 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Use the repository and Git as working memory.{ph1} Keep the reasoning with the " +"code. Git checkpoints let the next session continue after the conversation ends." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:221 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Let evidence decide what you claim.{ph1} A confident explanation still needs " +"testing. “Unknown” is a valid answer when the evidence is incomplete." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:226 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Test the oracle too.{ph1} Try cases it should reject. If it misses a bug, revisit" +" the earlier results that depended on it." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:231 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}We are in the early days of RE's industrial revolution.{ph1} The methods are " +"still taking shape. There is plenty left to explore." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:243 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "How experience compounds" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:244 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}Human direction{ph1} · Goal and acceptance criteria" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:332 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Autonomy" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:333 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Agent" +msgstr "" + +#. {ph0}:
+#: website/public/blog/touhou-reconstruction/index.html:334 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Choose an experiment.{ph0}Propose a hypothesis." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:337 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Verification" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:338 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Oracle" +msgstr "" + +#. {ph0}:
+#: website/public/blog/touhou-reconstruction/index.html:339 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Test against a{ph0}concrete reference." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:342 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Repository" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:343 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Working memory" +msgstr "" + +#. {ph0}:
+#: website/public/blog/touhou-reconstruction/index.html:344 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Code, evidence,{ph0}checks and lessons." +msgstr "" + +#. {ph0}:
+#. {ph1}: +#. {ph2}: +#: website/public/blog/touhou-reconstruction/index.html:346 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Mismatch{ph0}{ph1}Revise the hypothesis{ph2}" +msgstr "" + +#. {ph0}:
+#. {ph1}: +#. {ph2}: +#: website/public/blog/touhou-reconstruction/index.html:349 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "A better{ph0}{ph1}starting point{ph2}" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:352 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Reuse" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:353 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}Pass{ph1} · Keep the result and its evidence" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:365 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Each project leaves the next with a better starting point. That includes fixing the " +"checks when we discover a gap." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:372 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "In this article" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:374 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}August 2026{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:375 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}TH08: the continuation{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:376 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}Two approaches{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:377 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}TH095: compounding{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:378 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}TH04: across architectures{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:379 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}From exact to readable{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:382 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}The industrial shift{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:383 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}What becomes possible{ph1}" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:388 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "What changed in August 2026" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:389 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Before this work, I had done a lot of manual reverse engineering. I would inspect a " +"function until I had an explanation, then test that explanation against the program. " +"Getting further meant spending more of my own time on the next function. It also meant" +" keeping an increasingly large picture in my head." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:396 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Most of my RE work is on games. I reconstruct them so their behavior can be understood" +" and eventually carried into a port or a mod. That is the experience behind this " +"article. The method can be useful elsewhere, but each field needs to establish what it" +" can check against a reliable reference." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:403 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"In August 2026, I started exploring agent-driven RE seriously. I wanted to see how far" +" an agent could get with access to the program and ordinary development tools. Touhou " +"reconstruction gave me a substantial project in which to find out." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:409 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The early progress was startling. An investigation could keep moving without me " +"choosing every individual step. A failed comparison might send the agent to another " +"caller. It could write a small diagnostic and use the result to decide what to try " +"next. Giving it that freedom made a difference: I could spend more attention on the " +"project's direction and on whether its checks were trustworthy." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:418 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The pace got my attention first. Then I began wondering what would survive beyond the " +"current project. Would the next game benefit from everything we had just learned?" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:425 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "TH08: building on human work" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/touhou-reconstruction/index.html:426 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}TH08{ph1}, Imperishable Night, began as a continuation of {ph2}GensokyoClub's " +"reconstruction{ph3}. Their public source gave me a substantial foundation. It came " +"with knowledge of the build and a history of contributions that I preserved in the " +"continuation." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:435 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The imported history ends at the public 10 August checkpoint. My independent " +"continuation began on 13 August. By 19 August, the ledger recorded source for all " +"1,107 identified game functions." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:440 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"A playable Linux reconstruction port was committed on 24 August, roughly eleven days " +"after the continuation began. A Web edition followed. The native Linux 64-bit release " +"arrived on 30 August." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:445 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"What struck me was that the work had reached a program people could run. Getting there" +" required following problems beyond an individual function. Even when two functions " +"looked correct in isolation, they could accidentally use separate copies of state that" +" should have been shared." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:452 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"This made reference checks central to the work. I call them {ph0}oracles{ph1}. A code " +"comparison can tell us whether a reconstructed function reproduces the original " +"instructions. A runtime check can tell us whether an exercised route reaches the " +"expected state. The agent proposes an explanation and tests it; a mismatch gives it " +"something specific to investigate." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:460 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "An exact match with the wrong constant" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:461 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"An oracle is software someone wrote. TH08 gave me a clear reminder of how much can " +"depend on that software." +msgstr "" + +#. {ph0}: 0.0 +#. {ph1}: 128.0 +#: website/public/blog/touhou-reconstruction/index.html:465 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"In September, a bug reported by a downstream Switch port led back to item auto-" +"collection. The reconstructed source checked player power against {ph0}. The original " +"used {ph1}, the maximum-power threshold." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:471 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Normal power is non-negative, so the reconstructed power check was effectively always " +"satisfied. Above the collection line, the game could attract items without requiring " +"maximum power. The other exceptions in the condition were correct. This one constant " +"changed the behavior." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:478 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}Yet the function had already passed the exact comparison.{ph1}" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:484 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"A rebuild can put a constant at a different address. The comparison tool accounted for" +" that by adjusting addresses in the compiled instructions before comparing them with " +"the original. But it never checked the floating-point value stored at the referenced " +"address." +msgstr "" + +#. {ph0}: 128.0 +#. {ph1}: 0.0 +#: website/public/blog/touhou-reconstruction/index.html:491 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"That left a hole in the check. It could point the reconstructed instruction at the " +"original's {ph0} while the source still said {ph1}. The instruction bytes matched. The" +" source meant something different." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/touhou-reconstruction/index.html:497 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The {ph0}2 September fix{ph1} corrected the source and made the comparison check the " +"referenced constant's actual bytes. A {ph2}wider audit{ph3} then examined 1,548 " +"floating-literal references. It found another twelve incorrect references across five " +"accepted functions." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:508 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The comparison now checks every such floating literal. Its tests include deliberately " +"wrong values to make sure they are rejected. We also had to revisit results that had " +"passed the weaker check." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:513 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}The oracle needed reconstructing too.{ph1} Repairing it was part of repairing the" +" game." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:517 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"That matters when the team is mostly one person working with agents. I cannot " +"personally inspect every line they produce, so much of my confidence rests on their " +"checks. A shared oracle's blind spot can affect many investigations before I notice " +"it. I have to understand what the checker actually verifies and test it against cases " +"that ought to fail." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:525 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"As the work continued, those checks became part of the repository. So did the reasons " +"for source changes and notes that let a later session pick up where an earlier one " +"stopped. {ph0}The repository was becoming the project's working memory.{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:534 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}A successful batch gave us both recovered code and a better environment for the " +"next batch.{ph1}" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:542 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Two different ideas of reconstruction" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:543 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"GensokyoClub's {ph0}public README{ph1} makes its disagreement with this kind of work " +"explicit. The notice announces that further development will happen privately until " +"completion. One passage reads:" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:554 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The rise of grifters (AI decompilations and ports) in this space taking from our work " +"paints a bad image for future decompilation efforts…" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:560 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The notice also describes the psychological toll on the maintainers. Their " +"contribution policy excludes pull requests produced primarily with AI. They have put " +"their free time into difficult work, and that work helped make my continuation " +"possible. I respect the effort behind it. The disagreement I want to discuss is about " +"how reconstruction should proceed and how a contribution should be judged." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:569 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"In the manual workflow I knew, developing an understanding of a function and " +"reconstructing it usually fell to the same person. A project relied heavily on that " +"person's expertise. Trust in the contributor mattered because so much of the reasoning" +" happened while they worked." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:576 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Existing projects already preserve knowledge in their source and build tools. What " +"changed for me was that an agent could use that knowledge to pursue the next " +"investigation on its own." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:581 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"In my continuation, I decide the objective and the standard for accepting a result. " +"The agent has broad freedom to investigate. Its proposed reconstruction then has to " +"survive the relevant checks. I want another person to be able to examine why we chose " +"an implementation, even if an agent did most of the work." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:588 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"This can be a difficult transition. Years of careful work may become the foundation " +"for a continuation that moves much faster. That raises real questions about credit. It" +" also changes what maintainers need to know before accepting a contribution." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:594 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The industrial analogy helps me think about this. In a craft, much of the process " +"depends on the skill of the person carrying it out. Machinery changes where that skill" +" is needed. Someone still has to design the process and recognize when its output is " +"wrong. Different communities can choose how much of that change they want to take on." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:602 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"My choice is to continue openly, with the inherited work credited and its history " +"preserved. I want the new work to be reviewable. That gives us a way to ask how far " +"this approach can go and to learn from what goes wrong along the way." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/blog/touhou-reconstruction/index.html:608 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Source: GensokyoClub's {ph0}README notice{ph1}, checked on 10 October 2026, and its " +"{ph2}contribution policy{ph3}. The quotation is a shortened excerpt. TH08's " +"{ph4}credits and provenance{ph5} record the continuation boundary." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:626 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "TH095: experience starts compounding" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:627 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}TH095{ph1}, Shoot the Bullet, made the value of that experience much easier to " +"see. Its repository began on 29 August with zero confirmed game functions in the " +"ledger. We still had to learn the game. But we already knew much more about how to " +"begin a reconstruction and how to keep it moving." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:635 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"By 7 September, all 697 identified game functions had source. By 8 September, 696 had " +"been accepted as exact comparisons. The whole program linked on 9 September. The " +"Windows i386 reconstruction was marked playable on 10 September, about twelve days " +"after initialization." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:642 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"I found this more exciting than the first project's speed. A fresh target could " +"benefit from work done on another game. The experience was already present in the " +"tools and in the way the project was organized." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:648 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"For example, TH08 had taught us to pay attention to the assembled program early. If " +"several recovered functions depend on the same state, their isolated comparisons leave" +" an important question open. We need to see them working together. That lesson helped " +"shape how we approached TH095's whole-program build." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:655 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"A lesson that stays in my head is useful while I am there. Once it becomes a check " +"that another session can run, it can keep helping after I have moved on. The next " +"agent can use the result without repeating the investigation that led to it." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:661 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The floating-literal bug belongs in that memory too. It explains why checking a " +"reference also requires checking the data behind it. Keeping that correction with the " +"code helps later projects avoid inheriting the old check's blind spot." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:667 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}The method becomes part of the starting material for the next game.{ph1} We can " +"spend more of the next project's effort on what is actually new about its target." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:675 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The same benefit is available to people joining later. They can inspect a decision and" +" rerun its check before continuing the work. They do not have to reconstruct the " +"entire project's history to find out why the source looks the way it does." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:683 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "TH04: the workflow survives a different architecture" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/touhou-reconstruction/index.html:684 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}TH04{ph1}, Lotus Land Story, took this work into the PC-98 DOS era. The target " +"was now a 16-bit environment with four cooperating programs. Understanding its " +"hardware behavior required different evidence from the Windows games. Existing " +"{ph2}ReC98 work{ph3} gave us valuable knowledge and source material here too." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:693 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The DOS reconstruction is now working. In my manual testing, I played complete Normal " +"routes through their endings and checked saves. The current work is a native 64-bit " +"port. Establishing a working DOS version first gives that port a reference." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:699 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The architecture changed what we needed to investigate. It also changed the compiler " +"and runtime against which we checked our work. But the agent could still follow a " +"question through to a result and let that result guide the next experiment." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:705 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Consider the transition from gameplay to an ending. We need to know what state carries" +" across that boundary and which program is responsible for it. That is something we " +"can investigate against the DOS product. Once the evidence and checks are available, " +"an agent can work through the question much as it did on a Windows title." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:713 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"This is why TH04 matters to the argument. A substantial platform change did not force " +"us to start over with a new way of working. The architecture defined the problem; the " +"workflow still gave us a way to solve it." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:719 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"For the 64-bit port, we can now examine the new implementation against behavior " +"already recovered on DOS. The knowledge from reconstruction gives the port something " +"to build on." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/touhou-reconstruction/index.html:724 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Project state as of 10 October 2026: {ph0}DOS reconstruction and manual testing{ph1} ·" +" {ph2}64-bit port{ph3}. The port remains in development." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:737 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "From exact code to readable code" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:738 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Once a reconstruction works, I want someone else to be able to understand it." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:742 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"To me, assembly and raw offsets can feel like old friends. I realise this is a " +"slightly unusual definition of “readable.” Most people would prefer to follow the " +"game's logic without keeping the executable's memory layout in their head." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:748 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"That is where {ph0}semantic reconstruction{ph1} comes in. A recovered field may still " +"be known mainly by its offset. We follow how the game uses it until we can explain its" +" role. Then we can give it a meaningful name and a type that fits the evidence. We " +"keep the reasoning with the source so the next person can see where that " +"interpretation came from." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:756 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"This becomes especially important for a port. An absolute address tells me where " +"something lived in the old executable. It gives a 64-bit implementation little help in" +" deciding which object should own that state. To move the behavior safely, we need to " +"recover the relationship behind the old memory access." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:763 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "The order I now use is:" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:765 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Recover an exact baseline.{ph1} Compile the reconstructed pieces with the " +"historical compiler. Compare the relevant code and data with the original executable. " +"Record unresolved differences so the next phase has a clear starting point." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:772 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Build and play it on the original platform.{ph1} Link those pieces into the real " +"program using the original architecture and compiler. Exercise important gameplay " +"paths. This is where we can find problems with shared state or initialization that an " +"isolated function comparison missed." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:779 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Reconstruct the semantics against both references.{ph1} Take one coherent part of" +" the game at a time and establish what its recovered source means. Improve its " +"representation while preserving the exact comparisons and the playable historical " +"build." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:788 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Make the modern port.{ph1} Move the established behavior into the new " +"environment, such as a native 64-bit build. The reconstructed original-platform game " +"remains a reference for comparing how the port behaves." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:795 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The playable build from the second stage becomes a {ph0}second oracle{ph1} during the " +"third. The first oracle checks whether our changed source still reproduces the " +"relevant original code and data. The second checks that the reconstructed program " +"still builds and behaves correctly along the paths we exercise." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:803 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"They catch different mistakes. A type change can alter the generated instructions. An " +"ownership change can leave two parts of the game using different copies of state. " +"Keeping both checks available gives the agent a concrete failure to investigate before" +" carrying a refactor further." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:810 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"A name needs evidence of its own. An exact comparison cannot tell us whether a field " +"really means “invulnerability time.” We have to establish that from how the game " +"writes and uses it. If the meaning remains uncertain, a neutral name is more helpful " +"to the next reader than a confident guess." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:817 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"We learned this order through the projects. TH08 already had playable ports before " +"some of its later historical-platform audits. That made certain defects harder to see." +" The {ph0}Factory's current workflow{ph1} puts the original-platform build first, so " +"semantic work can use it as a reference before porting begins." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:828 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Exact reconstruction gives us a reference. Semantic reconstruction makes the " +"recovered knowledge usable.{ph1} A port can then build on both." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:837 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "What makes this an industrial shift" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:838 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"These projects changed where I spent my attention. Once agents could carry much of an " +"investigation forward, improving their working environment became one of the most " +"useful things I could do. A better tool could help with every later function that " +"needed it." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:845 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Autonomy matters here. The useful next step often becomes clear only after a failed " +"experiment. An agent needs enough freedom to follow that result somewhere unexpected. " +"If it has to wait for me to prescribe each step, much of the work remains tied to my " +"attention." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:852 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"I expect the agent to make wrong hypotheses. What matters is whether we can test them " +"and learn from the result. A failed check should help it understand the mistake well " +"enough to try again. I still have to decide whether the accumulated evidence supports " +"a project milestone." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:859 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"REA gives the agent access to analysis tools. A question about a function's caller can" +" lead straight into inspecting that caller. The reconstruction project supplies the " +"compiler and its own reference checks. The agent can use those to test the source it " +"proposes and see where its explanation holds up." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:866 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The TH08 bug shows why those checks deserve engineering attention of their own. When " +"the same comparison is used across hundreds of functions, a gap in it can spread much " +"further than a mistake in one implementation. Testing the checker improves the " +"feedback available to all that later work." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:873 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The industrial analogy has a useful historical example here. Boulton and Watt " +"introduced a {ph0}steam-engine indicator in 1796{ph1} to help adjust engine valves. A " +"recording version traced pressure through the piston stroke. It made the engine's " +"internal behavior available for inspection. Our comparison tools serve a similar " +"purpose: they let us examine what the machinery is doing while we improve it." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:886 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}We are in the early stages of this industrial shift.{ph1} Much of the " +"infrastructure is still immature. Agents can move faster than our checks were designed" +" to support, so the process has to develop alongside them. When we find a defect in a " +"shared tool, we have to repair it and revisit the results it affected. The next " +"project can then inherit a stronger tool." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:896 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"There is also a practical limit to any one conversation. It will end before a large " +"reconstruction is finished. The repository has to make it possible for another session" +" to continue without losing the reason for the last decision." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:902 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The {ph0}Touhou Reconstruction Factory{ph1} grew out of that need. It gives projects a" +" shared way to carry their checks and lessons forward. Work on one game can improve " +"the starting conditions for another." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:912 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"That is what makes the industrial analogy meaningful to me. Experience starts becoming" +" part of tools that others can use. Improving those tools changes how much the next " +"person—or the next agent—can get done." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:920 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "The projects we can now consider" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:921 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The pace matters because it changes the decision to begin. A game could be fascinating" +" to reverse engineer and still demand more of my own attention than I could " +"realistically give it. Many projects would stay ideas." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:927 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"Now I can see a way to keep such a project moving through repeated investigations. " +"Getting a working reconstruction makes a port more practical. Recovering readable " +"semantics makes it easier for someone else to explore a mod. The effort put into " +"understanding the game can keep paying off after the first version runs." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/blog/touhou-reconstruction/index.html:934 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"I now look at an unfamiliar program and ask: {ph0}what access, feedback and " +"accumulated knowledge would let an agent work on this reliably?{ph1}" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:941 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"That question makes me consider projects I would previously have left alone. Each one " +"can improve the way we approach the next. I want to keep exploring how far that can " +"take us." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:949 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Project milestones and sources" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:950 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"The dates describe recorded project checkpoints, checked against public GitHub history" +" on 10 October 2026. Elapsed time is calendar time between commits. Source presence, " +"exact comparisons, a build and a runtime result each name a different milestone." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#. {ph6}: +#. {ph7}: +#. {ph8}: +#. {ph9}: +#. {ph10}: +#. {ph11}: +#: website/public/blog/touhou-reconstruction/index.html:958 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}TH08:{ph1} {ph2}13 August continuation{ph3}, {ph4}19 August source ledger{ph5}, " +"{ph6}24 August Linux port{ph7}, {ph8}26 August Web edition{ph9}, and {ph10}30 August " +"64-bit Linux release{ph11}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#. {ph6}: +#. {ph7}: +#. {ph8}: +#. {ph9}: +#. {ph10}: +#. {ph11}: +#: website/public/blog/touhou-reconstruction/index.html:981 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}TH095:{ph1} {ph2}29 August initial ledger{ph3}, {ph4}7 September source " +"ledger{ph5}, {ph6}8 September comparisons{ph7}, {ph8}9 September linkage{ph9}, and " +"{ph10}10 September playable-build record{ph11}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/touhou-reconstruction/index.html:1004 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}TH04:{ph1} {ph2}10 October handoff{ph3} records the working DOS reconstruction, " +"the maintainer's complete Normal-route testing and the current 64-bit phase." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#. {ph6}: +#. {ph7}: +#: website/public/blog/touhou-reconstruction/index.html:1013 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}TH08 oracle correction:{ph1} {ph2}the reported auto-collection bug{ph3}, {ph4}the" +" source and comparison fix{ph5}, and {ph6}the full floating-literal audit{ph7}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/blog/touhou-reconstruction/index.html:1027 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Semantic reconstruction:{ph1} {ph2}TH08's readability playbook{ph3} and {ph4}the " +"Factory's phase order and two validation paths{ph5}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/touhou-reconstruction/index.html:1039 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Industrial history:{ph1} {ph2}the Science Museum Group's steam-engine indicator " +"record{ph3} describes the 1796 introduction and the pressure-recording mechanism." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/blog/touhou-reconstruction/index.html:1048 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"{ph0}Method:{ph1} the Factory's {ph2}agent autonomy{ph3} and {ph4}cross-game " +"knowledge{ph5} documents retain the working principles and lessons." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/blog/touhou-reconstruction/index.html:1063 +#, python-brace-format +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "{ph0}More articles{ph1} · {ph2}Explore a TH04 investigation{ph3}" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:6 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Reverse Engineering’s Industrial Revolution — REA" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:7 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "" +"N0zoM1z0 reflects on manual reverse engineering, Touhou reconstruction with AI agents," +" and how knowledge compounds across TH08, TH095 and PC-98 TH04." +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:357 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Experience carried between projects" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:371 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "On this page" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:386 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Touhou reconstruction essay" +msgstr "" + +#: website/public/blog/touhou-reconstruction/index.html:1088 +msgctxt "page:blog/touhou-reconstruction/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/contributors/index.html:110 +msgctxt "page:contributors/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/contributors/index.html:202 +#, python-brace-format +msgctxt "page:contributors/index.html" +msgid "{ph0}Home{ph1} / Contributors" +msgstr "" + +#: website/public/contributors/index.html:203 +msgctxt "page:contributors/index.html" +msgid "Built together." +msgstr "" + +#: website/public/contributors/index.html:204 +msgctxt "page:contributors/index.html" +msgid "Thank you to everyone who helps make REA better." +msgstr "" + +#: website/public/contributors/index.html:205 +msgctxt "page:contributors/index.html" +msgid "" +"Code, documentation, tests, translations and ideas — there are many ways to " +"contribute." +msgstr "" + +#: website/public/contributors/index.html:210 +msgctxt "page:contributors/index.html" +msgid "How to contribute" +msgstr "" + +#: website/public/contributors/index.html:215 +msgctxt "page:contributors/index.html" +msgid "Join the conversation →" +msgstr "" + +#: website/public/contributors/index.html:225 +msgctxt "page:contributors/index.html" +msgid "Contributors" +msgstr "" + +#: website/public/contributors/index.html:227 +msgctxt "page:contributors/index.html" +msgid "Find a contributor" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#: website/public/contributors/index.html:1114 +#, python-brace-format +msgctxt "page:contributors/index.html" +msgid "From {ph0}GitHub’s contributor list{ph1} · Updated {ph2}." +msgstr "" + +#: website/public/contributors/index.html:1119 +msgctxt "page:contributors/index.html" +msgid "No matching contributors. Try another username." +msgstr "" + +#: website/public/contributors/index.html:6 +msgctxt "page:contributors/index.html" +msgid "Contributors · REA" +msgstr "" + +#: website/public/contributors/index.html:7 +msgctxt "page:contributors/index.html" +msgid "Meet the people who contribute code, documentation, tests and ideas to REA." +msgstr "" + +#: website/public/contributors/index.html:228 +msgctxt "page:contributors/index.html" +msgid "GitHub username" +msgstr "" + +#: website/public/contributors/index.html:1139 +msgctxt "page:contributors/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/examples/dino-lab/index.html:110 +msgctxt "page:examples/dino-lab/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/examples/dino-lab/index.html:202 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "{ph0}Home{ph1}{ph2}/{ph3}Dinosaur speed lab" +msgstr "" + +#: website/public/examples/dino-lab/index.html:205 +msgctxt "page:examples/dino-lab/index.html" +msgid "Inspect → rebuild → change" +msgstr "" + +#: website/public/examples/dino-lab/index.html:206 +msgctxt "page:examples/dino-lab/index.html" +msgid "Rebuild the dinosaur’s speed rule." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/examples/dino-lab/index.html:207 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"To recreate the game’s acceleration, first find the rule that controls its speed. " +"{ph0}REA returned the running script;{ph1} we used its rule to build this mini-game " +"with {ph2}adjustable speed.{ph3}" +msgstr "" + +#: website/public/examples/dino-lab/index.html:216 +#: website/public/examples/dino-lab/index.html:215 +msgctxt "page:examples/dino-lab/index.html" +msgid "On this page" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/examples/dino-lab/index.html:218 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "{ph0}Play and change the speed{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/examples/dino-lab/index.html:219 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "{ph0}Read the recovered rule{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/examples/dino-lab/index.html:220 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "{ph0}Check the reconstruction{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/examples/dino-lab/index.html:221 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "{ph0}Try the analysis{ph1}" +msgstr "" + +#: website/public/examples/dino-lab/index.html:226 +msgctxt "page:examples/dino-lab/index.html" +msgid "Play and change the speed" +msgstr "" + +#: website/public/examples/dino-lab/index.html:227 +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"Press Play, then jump over the cactus. Move the speed slider to try a slower or faster" +" game; it switches to a fixed speed. Select the recovered rule to start at 6 and " +"gradually accelerate again." +msgstr "" + +#: website/public/examples/dino-lab/index.html:233 +msgctxt "page:examples/dino-lab/index.html" +msgid "Play the reconstruction" +msgstr "" + +#: website/public/examples/dino-lab/index.html:265 +msgctxt "page:examples/dino-lab/index.html" +msgid "Play" +msgstr "" + +#: website/public/examples/dino-lab/index.html:268 +msgctxt "page:examples/dino-lab/index.html" +msgid "Jump ↑" +msgstr "" + +#: website/public/examples/dino-lab/index.html:269 +msgctxt "page:examples/dino-lab/index.html" +msgid "Restart" +msgstr "" + +#: website/public/examples/dino-lab/index.html:272 +msgctxt "page:examples/dino-lab/index.html" +msgid "Speed" +msgstr "" + +#: website/public/examples/dino-lab/index.html:282 +msgctxt "page:examples/dino-lab/index.html" +msgid "Use the recovered acceleration rule" +msgstr "" + +#: website/public/examples/dino-lab/index.html:286 +msgctxt "page:examples/dino-lab/index.html" +msgid "Original rule: start at 6, then increase toward 13." +msgstr "" + +#: website/public/examples/dino-lab/index.html:289 +msgctxt "page:examples/dino-lab/index.html" +msgid "Move the slider to set your own speed. Space or Jump clears a cactus." +msgstr "" + +#: website/public/examples/dino-lab/index.html:294 +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"Enable JavaScript to play the reconstruction. The code and explanation above remain " +"readable." +msgstr "" + +#: website/public/examples/dino-lab/index.html:302 +msgctxt "page:examples/dino-lab/index.html" +msgid "Read the script REA returned" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: index.js +#: website/public/examples/dino-lab/index.html:303 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"We inspected {ph0}wayou’s Chromium-derived browser edition{ph1} with REA. It returned " +"the loaded {ph2}, including this branch in the game’s update function:" +msgstr "" + +#: website/public/examples/dino-lab/index.html:313 +msgctxt "page:examples/dino-lab/index.html" +msgid "REA · selected script source" +msgstr "" + +#. {ph0}: SPEED: 6 +#. {ph1}: ACCELERATION: 0.001 +#. {ph2}: MAX_SPEED: 13 +#: website/public/examples/dino-lab/index.html:319 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"The settings are {ph0}, {ph1} and {ph2}. The game runs this branch on an update " +"without a collision." +msgstr "" + +#: website/public/examples/dino-lab/index.html:324 +msgctxt "page:examples/dino-lab/index.html" +msgid "Use the same rule in the new game" +msgstr "" + +#. {ph0}: dino-speed.js +#: website/public/examples/dino-lab/index.html:327 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "Reconstruction · {ph0}" +msgstr "" + +#: website/public/examples/dino-lab/index.html:330 +#: website/public/examples/dino-lab/index.html:429 +msgctxt "page:examples/dino-lab/index.html" +msgid "Copy" +msgstr "" + +#: website/public/examples/dino-lab/index.html:343 +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"The mini-game uses this function for automatic acceleration. Moving the slider " +"supplies a fixed speed instead. Drawing, jump physics and rectangle collision checks " +"are new code for this teaching game; its simulation advances at 60 updates per second." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/examples/dino-lab/index.html:349 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "{ph0}Download the speed rule{ph1} · {ph2}Read the game code{ph3}" +msgstr "" + +#: website/public/examples/dino-lab/index.html:357 +msgctxt "page:examples/dino-lab/index.html" +msgid "Check the reconstruction" +msgstr "" + +#: website/public/examples/dino-lab/index.html:358 +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"We called the original game’s update function with obstacles and automatic scheduling " +"disabled. Compare those recorded speeds with a replay of the recovered rule." +msgstr "" + +#: website/public/examples/dino-lab/index.html:367 +msgctxt "page:examples/dino-lab/index.html" +msgid "Updates" +msgstr "" + +#: website/public/examples/dino-lab/index.html:368 +msgctxt "page:examples/dino-lab/index.html" +msgid "Original game" +msgstr "" + +#: website/public/examples/dino-lab/index.html:369 +msgctxt "page:examples/dino-lab/index.html" +msgid "Reconstructed rule" +msgstr "" + +#: website/public/examples/dino-lab/index.html:396 +msgctxt "page:examples/dino-lab/index.html" +msgid "Run the speed check" +msgstr "" + +#: website/public/examples/dino-lab/index.html:399 +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"Values rounded to three decimals. The branch checks before adding, so the final " +"increment can take speed just above 13." +msgstr "" + +#: website/public/examples/dino-lab/index.html:405 +msgctxt "page:examples/dino-lab/index.html" +msgid "Try the analysis yourself" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/examples/dino-lab/index.html:407 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "{ph0}Set up REA{ph1} with your coding agent." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: https://wayou.github.io/t-rex-runner/ +#: website/public/examples/dino-lab/index.html:411 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "Follow the {ph0}browser connection steps{ph1}, using {ph2} as the page URL." +msgstr "" + +#: website/public/examples/dino-lab/index.html:418 +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"Give your agent the page URL and local debugging endpoint, then copy this prompt." +msgstr "" + +#. {ph0}: +#: website/public/examples/dino-lab/index.html:425 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/examples/dino-lab/index.html:438 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to inspect this dinosaur game. Why does it get faster? Show " +"the speed rule, then build a small version with an adjustable speed.{ph3}{ph4}{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/examples/dino-lab/index.html:447 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"Ask a follow-up: {ph0}“Where is jump height calculated? Add a jump-height control to " +"the new version.”{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/examples/dino-lab/index.html:454 +#, python-brace-format +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"Source: {ph0}inspected speed code{ph1}, Chromium Authors. {ph2}Copyright and BSD " +"license{ph3}. REA 4.1.0 inspected the running HTTP edition in Chrome 150." +msgstr "" + +#: website/public/examples/dino-lab/index.html:6 +msgctxt "page:examples/dino-lab/index.html" +msgid "Chrome Dinosaur Game: Rebuild Its Speed Rule — REA" +msgstr "" + +#: website/public/examples/dino-lab/index.html:7 +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"Read the dinosaur game’s speed rule with REA, rebuild it, then change the speed and " +"play." +msgstr "" + +#: website/public/examples/dino-lab/index.html:224 +msgctxt "page:examples/dino-lab/index.html" +msgid "Dinosaur speed reconstruction" +msgstr "" + +#: website/public/examples/dino-lab/index.html:255 +msgctxt "page:examples/dino-lab/index.html" +msgid "" +"Dinosaur mini-game. Use the Jump button or press Space while the game is focused." +msgstr "" + +#: website/public/examples/dino-lab/index.html:330 +msgctxt "page:examples/dino-lab/index.html" +msgid "Copy reconstructed speed rule" +msgstr "" + +#: website/public/examples/dino-lab/index.html:429 +msgctxt "page:examples/dino-lab/index.html" +msgid "Copy dinosaur analysis prompt" +msgstr "" + +#: website/public/examples/dino-lab/index.html:483 +msgctxt "page:examples/dino-lab/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/faq/index.html:109 +msgctxt "page:faq/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:201 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "{ph0}Home{ph1} / FAQ" +msgstr "" + +#: website/public/faq/index.html:202 +msgctxt "page:faq/index.html" +msgid "REA FAQ." +msgstr "" + +#: website/public/faq/index.html:203 +msgctxt "page:faq/index.html" +msgid "Setup, updates, analysis and troubleshooting." +msgstr "" + +#: website/public/faq/index.html:207 +msgctxt "page:faq/index.html" +msgid "Topics" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:209 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "{ph0}Setup and updates{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:210 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "{ph0}Analysis{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:211 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "{ph0}Troubleshooting{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:212 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "{ph0}Data and sharing{ph1}" +msgstr "" + +#: website/public/faq/index.html:221 +msgctxt "page:faq/index.html" +msgid "Setup and updates" +msgstr "" + +#: website/public/faq/index.html:224 +msgctxt "page:faq/index.html" +msgid "How do I install REA?" +msgstr "" + +#. {ph0}: Node.js +#: website/public/faq/index.html:225 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"With {ph0} and npm available, run setup, choose your coding agent and review the " +"proposed changes." +msgstr "" + +#: website/public/faq/index.html:232 +msgctxt "page:faq/index.html" +msgid "Terminal · agent setup" +msgstr "" + +#: website/public/faq/index.html:233 website/public/faq/index.html:274 +#: website/public/faq/index.html:292 website/public/faq/index.html:376 +#: website/public/faq/index.html:423 website/public/faq/index.html:463 +#: website/public/faq/index.html:483 +msgctxt "page:faq/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:244 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Setup registers REA's MCP connection and installs the matching investigation skill. " +"Restart your agent when it finishes, then give it a target path and a question. " +"{ph0}Follow the setup guide{ph1} for prerequisites and your first analysis." +msgstr "" + +#: website/public/faq/index.html:253 +msgctxt "page:faq/index.html" +msgid "Which coding agents can use REA?" +msgstr "" + +#: website/public/faq/index.html:254 +msgctxt "page:faq/index.html" +msgid "" +"Any agent that supports local MCP servers. Setup includes Claude Code, Claude Desktop," +" Codex, Cursor, Gemini CLI, Windsurf, Devin, OpenCode, Antigravity, GitHub Copilot " +"CLI, Command Code, Grok Build, OMP, and VS Code. Grok Bot's connector is added from " +"its chat." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:261 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "{ph0}Connect your coding agent{ph1}." +msgstr "" + +#: website/public/faq/index.html:266 +msgctxt "page:faq/index.html" +msgid "How do I update REA?" +msgstr "" + +#: website/public/faq/index.html:267 +msgctxt "page:faq/index.html" +msgid "REA releases frequently, including bug fixes. If you installed the CLI with npm:" +msgstr "" + +#: website/public/faq/index.html:273 +msgctxt "page:faq/index.html" +msgid "Terminal · installed CLI" +msgstr "" + +#. {ph0}: npx +#: website/public/faq/index.html:285 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Follow the setup refresh command printed by the update. If you set up your agent " +"through {ph0}, run:" +msgstr "" + +#: website/public/faq/index.html:291 +msgctxt "page:faq/index.html" +msgid "Terminal · refresh agent setup" +msgstr "" + +#. {ph0}: npx -y rea-agents@latest +#: website/public/faq/index.html:303 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Review the changes and restart your agent. Its REA connection pins a package version, " +"so refreshing setup makes it use the new release. For one-off CLI commands, use {ph0} " +"followed by the command." +msgstr "" + +#: website/public/faq/index.html:311 +msgctxt "page:faq/index.html" +msgid "Is installing the skill from skills.sh enough?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:314 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"The skill gives your agent investigation instructions. Run {ph0}REA setup{ph1} to " +"connect the MCP server and install the matching skill, then restart your agent so it " +"can call the tools." +msgstr "" + +#: website/public/faq/index.html:325 +msgctxt "page:faq/index.html" +msgid "Analysis" +msgstr "" + +#: website/public/faq/index.html:328 +msgctxt "page:faq/index.html" +msgid "What can I analyze with REA?" +msgstr "" + +#: website/public/faq/index.html:329 +msgctxt "page:faq/index.html" +msgid "Start with the kind of software you have:" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:331 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"{ph0}Native executables and libraries{ph1}: functions, assembly, pseudocode and " +"references." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:336 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"{ph0}JavaScript and Electron apps{ph1}: modules, imports, IPC and source locations." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:341 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "{ph0}Browser pages{ph1}: scripts, requests and runtime observations." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:346 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"REA also has workflows for managed assemblies, Android APKs, firmware and packaged " +"resources. {ph0}See the case studies{ph1} for worked investigations." +msgstr "" + +#: website/public/faq/index.html:354 +msgctxt "page:faq/index.html" +msgid "Do I need Hopper, Ghidra or IDA?" +msgstr "" + +#: website/public/faq/index.html:355 +msgctxt "page:faq/index.html" +msgid "" +"Deep native analysis uses one of them. Static JavaScript and .NET inspection work with" +" the supplied files and do not need a native analysis engine." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:360 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Connect your existing Ghidra or IDA installation, or let setup detect Hopper and " +"propose an installation. Your host and target determine which provider can be used. " +"{ph0}Set up native analysis{ph1}." +msgstr "" + +#: website/public/faq/index.html:368 +msgctxt "page:faq/index.html" +msgid "Can I use REA without a coding agent?" +msgstr "" + +#: website/public/faq/index.html:369 +msgctxt "page:faq/index.html" +msgid "" +"Yes. The CLI uses the same analysis workflows. For a local JavaScript or Electron app:" +msgstr "" + +#: website/public/faq/index.html:375 +msgctxt "page:faq/index.html" +msgid "Terminal · static application analysis" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:388 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Replace the path with an extracted application folder or ASAR file. {ph0}Use the " +"CLI{ph1} for installation options." +msgstr "" + +#: website/public/faq/index.html:395 +msgctxt "page:faq/index.html" +msgid "What code does REA return?" +msgstr "" + +#: website/public/faq/index.html:396 +msgctxt "page:faq/index.html" +msgid "" +"Native analysis returns assembly and pseudocode, with calls, references and relevant " +"constants. JavaScript analysis returns modules, their relationships and source " +"locations." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/faq/index.html:401 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Your agent uses these findings to explain the behavior or write and test an " +"implementation. The {ph0}DX-Ball calculation{ph1} and {ph2}CTF flag checker{ph3} show " +"how that process works." +msgstr "" + +#: website/public/faq/index.html:412 +msgctxt "page:faq/index.html" +msgid "What should I ask my agent?" +msgstr "" + +#: website/public/faq/index.html:413 +msgctxt "page:faq/index.html" +msgid "" +"Give it a local target and one behavior to investigate. For a JavaScript or Electron " +"app:" +msgstr "" + +#. {ph0}: +#: website/public/faq/index.html:419 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: /absolute/path/to/app +#. {ph4}: +#. {ph5}: +#: website/public/faq/index.html:432 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to analyze {ph3} and explain how it exports data. Show the " +"relevant code and source locations.{ph4}{ph5}{ph6}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:442 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Replace the path with your target. The {ph0}guides{ph1} provide prompts for native, " +"Electron and browser examples." +msgstr "" + +#: website/public/faq/index.html:452 +msgctxt "page:faq/index.html" +msgid "Troubleshooting" +msgstr "" + +#: website/public/faq/index.html:455 +msgctxt "page:faq/index.html" +msgid "Why can't my agent see the REA tools?" +msgstr "" + +#. {ph0}: doctor +#: website/public/faq/index.html:456 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Restart or reconnect your agent after setup. Check its REA registration with {ph0}; " +"for Codex:" +msgstr "" + +#: website/public/faq/index.html:462 +msgctxt "page:faq/index.html" +msgid "Terminal · check one client" +msgstr "" + +#. {ph0}: codex +#. {ph1}: claude_code +#. {ph2}: cursor +#: website/public/faq/index.html:474 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Replace {ph0} with your client ID, such as {ph1} or {ph2}. If the report shows a " +"missing or stale registration, run setup for that client:" +msgstr "" + +#: website/public/faq/index.html:482 +msgctxt "page:faq/index.html" +msgid "Terminal · repair one client's setup" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:494 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Review its plan and restart the client. If registration is healthy but tools remain " +"absent, check the client's MCP connection error. {ph0}More setup diagnostics{ph1}." +msgstr "" + +#: website/public/faq/index.html:502 +msgctxt "page:faq/index.html" +msgid "Do I need to start Hopper first?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:503 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"REA starts Hopper when an operation needs it. On macOS, complete the first-run choice " +"of demo mode or license activation before unattended analysis. {ph0}See native " +"provider setup{ph1}." +msgstr "" + +#: website/public/faq/index.html:512 +msgctxt "page:faq/index.html" +msgid "What should I do if I hit a bug?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:513 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"{ph0}Update REA{ph1}, restart your agent and retry the same task. A recent release may" +" already fix the problem." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:517 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"If it persists, {ph0}open an issue{ph1} with your REA version, operating system, " +"target type, steps to reproduce and error output. Include the provider name when the " +"problem involves native analysis." +msgstr "" + +#: website/public/faq/index.html:531 +msgctxt "page:faq/index.html" +msgid "Data and sharing" +msgstr "" + +#: website/public/faq/index.html:534 +msgctxt "page:faq/index.html" +msgid "Does REA upload my app?" +msgstr "" + +#: website/public/faq/index.html:535 +msgctxt "page:faq/index.html" +msgid "" +"REA analyzes targets on your machine. Your agent receives the results, and its model " +"provider's data policy applies to those results." +msgstr "" + +#: website/public/faq/index.html:542 +msgctxt "page:faq/index.html" +msgid "How can I share an example or contribute?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/faq/index.html:543 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Have a useful REA example? We'd love to see it. Share the target, your question, the " +"findings and how you checked them in an {ph0}issue{ph1} or {ph2}pull request{ph3}. " +"Short code excerpts and figures help others follow the investigation." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/faq/index.html:555 +#, python-brace-format +msgctxt "page:faq/index.html" +msgid "" +"Bug reports, feature requests, documentation and code improvements are welcome too. " +"You can also discuss an example in the {ph0}community{ph1}." +msgstr "" + +#: website/public/faq/index.html:6 +msgctxt "page:faq/index.html" +msgid "REA FAQ: Setup, Updates and Troubleshooting" +msgstr "" + +#: website/public/faq/index.html:7 +msgctxt "page:faq/index.html" +msgid "" +"Answers to common REA questions: installation, updates, analysis tools, coding agents," +" troubleshooting and sharing examples." +msgstr "" + +#: website/public/faq/index.html:206 +msgctxt "page:faq/index.html" +msgid "On this page" +msgstr "" + +#: website/public/faq/index.html:215 +msgctxt "page:faq/index.html" +msgid "Frequently asked questions about REA" +msgstr "" + +#: website/public/faq/index.html:233 +msgctxt "page:faq/index.html" +msgid "Copy REA setup command" +msgstr "" + +#: website/public/faq/index.html:274 +msgctxt "page:faq/index.html" +msgid "Copy REA update command" +msgstr "" + +#: website/public/faq/index.html:292 +msgctxt "page:faq/index.html" +msgid "Copy agent setup refresh command" +msgstr "" + +#: website/public/faq/index.html:376 +msgctxt "page:faq/index.html" +msgid "Copy REA CLI analysis command" +msgstr "" + +#: website/public/faq/index.html:423 +msgctxt "page:faq/index.html" +msgid "Copy example analysis prompt" +msgstr "" + +#: website/public/faq/index.html:463 +msgctxt "page:faq/index.html" +msgid "Copy client diagnosis command" +msgstr "" + +#: website/public/faq/index.html:483 +msgctxt "page:faq/index.html" +msgid "Copy scoped setup command" +msgstr "" + +#: website/public/faq/index.html:581 +msgctxt "page:faq/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/first-investigation/index.html:109 +msgctxt "page:first-investigation/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/first-investigation/index.html:201 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}Home{ph1} / Your first investigation" +msgstr "" + +#. {ph0}:
+#: website/public/first-investigation/index.html:204 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "Find out where{ph0}exported notes go." +msgstr "" + +#: website/public/first-investigation/index.html:205 +msgctxt "page:first-investigation/index.html" +msgid "" +"Use REA to inspect a small app, follow its Export notes button and check one detail " +"yourself." +msgstr "" + +#. {ph0}: Node.js +#: website/public/first-investigation/index.html:209 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "A supplied example · {ph0} and npm · Your coding agent" +msgstr "" + +#: website/public/first-investigation/index.html:216 +msgctxt "page:first-investigation/index.html" +msgid "In this exercise" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/first-investigation/index.html:218 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}1. Set up{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/first-investigation/index.html:219 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}2. Ask about export{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/first-investigation/index.html:220 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}3. Follow the answer{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/first-investigation/index.html:221 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}4. Check a prediction{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/first-investigation/index.html:222 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}5. Ask another question{ph1}" +msgstr "" + +#: website/public/first-investigation/index.html:227 +msgctxt "page:first-investigation/index.html" +msgid "1. Connect your agent to REA" +msgstr "" + +#. {ph0}: Node.js +#. {ph1}: +#. {ph2}: +#: website/public/first-investigation/index.html:228 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"Use a coding agent such as Claude Code, Codex or Cursor. You’ll need {ph0} and npm; " +"the {ph1}setup guide lists supported versions{ph2}." +msgstr "" + +#. {ph0}: +#: website/public/first-investigation/index.html:236 +#: website/public/first-investigation/index.html:286 +#: website/public/first-investigation/index.html:408 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#: website/public/first-investigation/index.html:241 +#: website/public/first-investigation/index.html:263 +#: website/public/first-investigation/index.html:291 +#: website/public/first-investigation/index.html:413 +#: website/public/first-investigation/index.html:454 +#: website/public/first-investigation/index.html:471 +msgctxt "page:first-investigation/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: npx rea-agents@latest setup +#. {ph4}: +#. {ph5}: +#: website/public/first-investigation/index.html:250 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Install REA and connect it to this coding agent using {ph3}. Show me " +"the setup plan for approval, then verify the installation.{ph4}{ph5}{ph6}" +msgstr "" + +#: website/public/first-investigation/index.html:260 +msgctxt "page:first-investigation/index.html" +msgid "Or run this command in your terminal:" +msgstr "" + +#: website/public/first-investigation/index.html:272 +msgctxt "page:first-investigation/index.html" +msgid "" +"Review the plan, approve the setup, then restart your agent. Already connected? " +"Continue below." +msgstr "" + +#: website/public/first-investigation/index.html:278 +msgctxt "page:first-investigation/index.html" +msgid "2. Ask where the CSV is written" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/first-investigation/index.html:279 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"The example is a six-file Electron app with an {ph0}Export notes{ph1} button. Your " +"agent can inspect its code without installing or launching Electron." +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: https://rea.tools/examples/notes-example.zip +#. {ph4}: notes.csv +#. {ph5}: +#. {ph6}: +#: website/public/first-investigation/index.html:300 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Download {ph3} into a new example folder and unpack it. Use REA to " +"find what happens when I click Export notes. Show where {ph4} is written, which fields" +" it contains, and the relevant files and lines.{ph5}{ph6}{ph7}" +msgstr "" + +#: website/public/first-investigation/index.html:314 +msgctxt "page:first-investigation/index.html" +msgid "" +"Your agent downloads the files and gives the unpacked folder to REA for inspection." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/first-investigation/index.html:318 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}Download example ZIP{ph1}" +msgstr "" + +#. {ph0}: notes-example +#: website/public/first-investigation/index.html:326 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"If your agent can’t download files, unzip this archive yourself. Give it the path to " +"the {ph0} folder and the same export question." +msgstr "" + +#: website/public/first-investigation/index.html:333 +msgctxt "page:first-investigation/index.html" +msgid "3. Follow the answer back to the code" +msgstr "" + +#: website/public/first-investigation/index.html:334 +msgctxt "page:first-investigation/index.html" +msgid "Look for a short explanation with file and line references:" +msgstr "" + +#. {ph0}: notes:export +#. {ph1}: notes.csv +#. {ph2}: id +#. {ph3}: title +#: website/public/first-investigation/index.html:336 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"The button sends a {ph0} message. The main process formats the notes as CSV and writes" +" {ph1} in the user’s Downloads folder. The columns are {ph2} and {ph3}." +msgstr "" + +#: website/public/first-investigation/index.html:344 +msgctxt "page:first-investigation/index.html" +msgid "From the button to the file writer" +msgstr "" + +#. {ph0}: +#. {ph1}: renderer.js +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#. {ph6}: notes.exportCsv() +#. {ph7}: +#: website/public/first-investigation/index.html:346 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}Page · {ph1}{ph2}{ph3}Export notes{ph4}{ph5}Calls {ph6}.{ph7}" +msgstr "" + +#. {ph0}: +#. {ph1}: preload.js +#. {ph2}: +#. {ph3}: +#. {ph4}: notes:export +#. {ph5}: +#. {ph6}: +#. {ph7}: +#: website/public/first-investigation/index.html:354 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"{ph0}Bridge · {ph1}{ph2}{ph3}{ph4}{ph5}{ph6}Sends a named message to the main " +"process.{ph7}" +msgstr "" + +#. {ph0}: +#. {ph1}: main.js +#. {ph2}: +#. {ph3}: +#. {ph4}: notes.csv +#. {ph5}: +#. {ph6}: +#. {ph7}: csv.js +#. {ph8}: +#: website/public/first-investigation/index.html:362 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"{ph0}Handler · {ph1}{ph2}{ph3}Write {ph4}{ph5}{ph6}Calls the formatter in {ph7} and " +"writes the file.{ph8}" +msgstr "" + +#: website/public/first-investigation/index.html:373 +msgctxt "page:first-investigation/index.html" +msgid "" +"REA’s static analysis pairs the message with its handler. The destination is read from" +" code." +msgstr "" + +#. {ph0}: main.js +#: website/public/first-investigation/index.html:380 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0} · lines 8–12" +msgstr "" + +#: website/public/first-investigation/index.html:381 +msgctxt "page:first-investigation/index.html" +msgid "Source" +msgstr "" + +#: website/public/first-investigation/index.html:389 +msgctxt "page:first-investigation/index.html" +msgid "" +"The file path, formatter and write call are together in this handler. Ask your agent " +"to show these lines if its answer leaves them out." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/first-investigation/index.html:394 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "{ph0}See the full code trace and recorded REA result{ph1}." +msgstr "" + +#: website/public/first-investigation/index.html:401 +msgctxt "page:first-investigation/index.html" +msgid "4. Check a prediction" +msgstr "" + +#: website/public/first-investigation/index.html:402 +msgctxt "page:first-investigation/index.html" +msgid "" +"A comma separates CSV columns. What happens when a note title itself contains a comma " +"or quotation marks?" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: Hello, "REA" +#. {ph4}: toCsv +#. {ph5}: Node.js +#. {ph6}: +#. {ph7}: +#: website/public/first-investigation/index.html:422 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Predict the CSV for a note with id 1 and title {ph3}. Then run the " +"example’s {ph4} formatter with {ph5} to check it. Show the prediction and actual " +"output.{ph6}{ph7}{ph8}" +msgstr "" + +#: website/public/first-investigation/index.html:435 +msgctxt "page:first-investigation/index.html" +msgid "Expected formatter output" +msgstr "" + +#. {ph0}: Node.js +#: website/public/first-investigation/index.html:440 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"The title stays in one quoted field; each quotation mark is doubled. This checks the " +"formatter directly with {ph0}." +msgstr "" + +#: website/public/first-investigation/index.html:446 +msgctxt "page:first-investigation/index.html" +msgid "Run the check yourself" +msgstr "" + +#. {ph0}: notes-example +#: website/public/first-investigation/index.html:447 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "Open a terminal in the unpacked {ph0} folder:" +msgstr "" + +#: website/public/first-investigation/index.html:488 +msgctxt "page:first-investigation/index.html" +msgid "5. Ask another question" +msgstr "" + +#: website/public/first-investigation/index.html:489 +msgctxt "page:first-investigation/index.html" +msgid "Try a follow-up in the same conversation:" +msgstr "" + +#: website/public/first-investigation/index.html:491 +msgctxt "page:first-investigation/index.html" +msgid "What happens if the file can’t be written? Follow the error back to the page." +msgstr "" + +#: website/public/first-investigation/index.html:496 +msgctxt "page:first-investigation/index.html" +msgid "" +"Or give your agent an app of your own and ask about one button, file or behavior." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/first-investigation/index.html:501 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"{ph0}How Notion copies text and HTML{ph1}{ph2}Follow a clipboard feature in a packaged" +" Electron app.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/first-investigation/index.html:507 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"{ph0}How DX-Ball calculates sound panning{ph1}{ph2}Read the original instructions and " +"the reconstruction’s checks.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/first-investigation/index.html:515 +#, python-brace-format +msgctxt "page:first-investigation/index.html" +msgid "" +"{ph0}Troubleshoot setup or analysis{ph1}{ph2}Update REA and check the connection if " +"you get stuck.{ph3}" +msgstr "" + +#: website/public/first-investigation/index.html:6 +msgctxt "page:first-investigation/index.html" +msgid "Your First Reverse Engineering Investigation — REA" +msgstr "" + +#: website/public/first-investigation/index.html:7 +msgctxt "page:first-investigation/index.html" +msgid "" +"Try REA on a small Notes app. Set up your agent, ask where exported notes go, and " +"check the CSV formatter with a sample title." +msgstr "" + +#: website/public/first-investigation/index.html:215 +msgctxt "page:first-investigation/index.html" +msgid "On this page" +msgstr "" + +#: website/public/first-investigation/index.html:225 +msgctxt "page:first-investigation/index.html" +msgid "Your first REA investigation" +msgstr "" + +#: website/public/first-investigation/index.html:241 +msgctxt "page:first-investigation/index.html" +msgid "Copy REA installation prompt" +msgstr "" + +#: website/public/first-investigation/index.html:263 +msgctxt "page:first-investigation/index.html" +msgid "Copy setup command" +msgstr "" + +#: website/public/first-investigation/index.html:291 +msgctxt "page:first-investigation/index.html" +msgid "Copy Notes investigation prompt" +msgstr "" + +#: website/public/first-investigation/index.html:413 +msgctxt "page:first-investigation/index.html" +msgid "Copy CSV check prompt" +msgstr "" + +#: website/public/first-investigation/index.html:454 +#: website/public/first-investigation/index.html:471 +msgctxt "page:first-investigation/index.html" +msgid "Copy formatter check command" +msgstr "" + +#: website/public/first-investigation/index.html:542 +msgctxt "page:first-investigation/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/get-started/index.html:109 +msgctxt "page:get-started/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:201 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Home{ph1} / Get started" +msgstr "" + +#: website/public/get-started/index.html:202 +msgctxt "page:get-started/index.html" +msgid "Set up REA." +msgstr "" + +#: website/public/get-started/index.html:203 +msgctxt "page:get-started/index.html" +msgid "" +"Set up your computer and coding agent, connect REA, then investigate a small app." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:207 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"New to this? Follow the four steps below. Already have an agent? Go straight to " +"{ph0}Connect REA{ph1}." +msgstr "" + +#: website/public/get-started/index.html:214 website/public/get-started/index.html:213 +msgctxt "page:get-started/index.html" +msgid "On this page" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:216 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}1. Prepare your computer{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:217 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}2. Choose an agent{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:218 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}3. Connect REA{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:219 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}4. Try an investigation{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:220 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Other targets and providers{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:221 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Use the CLI{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:222 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Getting help{ph1}" +msgstr "" + +#: website/public/get-started/index.html:227 +msgctxt "page:get-started/index.html" +msgid "1. Prepare your computer" +msgstr "" + +#: website/public/get-started/index.html:228 +msgctxt "page:get-started/index.html" +msgid "" +"Use the computer where your target files are stored. A local coding agent can read " +"those files and run tools for you." +msgstr "" + +#: website/public/get-started/index.html:233 +msgctxt "page:get-started/index.html" +msgid "How do I open a terminal?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:235 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Windows:{ph1} open the Start menu, type {ph2}PowerShell{ph3} and press Enter." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: ⌘ +#. {ph3}: Space +#. {ph4}: +#. {ph5}: +#: website/public/get-started/index.html:239 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}macOS:{ph1} press {ph2} {ph3}, type {ph4}Terminal{ph5} and press Enter." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: Ctrl +#. {ph3}: Alt +#. {ph4}: T +#: website/public/get-started/index.html:243 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Linux:{ph1} press {ph2} {ph3} {ph4} on most desktops." +msgstr "" + +#. {ph0}: Ctrl +#. {ph1}: V +#. {ph2}: ⌘ +#. {ph3}: V +#. {ph4}: Ctrl +#. {ph5}: Shift +#. {ph6}: V +#: website/public/get-started/index.html:248 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Paste a command with {ph0} {ph1} (macOS: {ph2} {ph3}; Linux terminals: {ph4} {ph5} " +"{ph6}), then press Enter." +msgstr "" + +#: website/public/get-started/index.html:253 +msgctxt "page:get-started/index.html" +msgid "" +"Commands go in the terminal. Prompts labeled “Your coding agent” go in the agent's " +"chat." +msgstr "" + +#. {ph0}: Node.js +#. {ph1}: Node.js +#: website/public/get-started/index.html:258 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "You'll need {ph0} 22 (22.19+), 24 (24.11+) or 26+. npm comes with {ph1}." +msgstr "" + +#. {ph0}: Node.js +#: website/public/get-started/index.html:264 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "Don't have {ph0}, or not sure?" +msgstr "" + +#: website/public/get-started/index.html:267 +msgctxt "page:get-started/index.html" +msgid "Open a terminal and check:" +msgstr "" + +#: website/public/get-started/index.html:270 +msgctxt "page:get-started/index.html" +msgid "Terminal" +msgstr "" + +#: website/public/get-started/index.html:271 website/public/get-started/index.html:294 +#: website/public/get-started/index.html:324 website/public/get-started/index.html:349 +#: website/public/get-started/index.html:372 website/public/get-started/index.html:387 +#: website/public/get-started/index.html:421 website/public/get-started/index.html:452 +#: website/public/get-started/index.html:466 website/public/get-started/index.html:484 +#: website/public/get-started/index.html:536 website/public/get-started/index.html:550 +#: website/public/get-started/index.html:582 website/public/get-started/index.html:611 +#: website/public/get-started/index.html:746 website/public/get-started/index.html:776 +#: website/public/get-started/index.html:801 website/public/get-started/index.html:816 +#: website/public/get-started/index.html:864 website/public/get-started/index.html:897 +#: website/public/get-started/index.html:1049 website/public/get-started/index.html:1111 +#: website/public/get-started/index.html:1134 website/public/get-started/index.html:1158 +#: website/public/get-started/index.html:1206 website/public/get-started/index.html:1281 +#: website/public/get-started/index.html:1307 website/public/get-started/index.html:1324 +#: website/public/get-started/index.html:1567 website/public/get-started/index.html:1626 +#: website/public/get-started/index.html:1645 website/public/get-started/index.html:1667 +#: website/public/get-started/index.html:1710 website/public/get-started/index.html:1740 +#: website/public/get-started/index.html:1761 +msgctxt "page:get-started/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: node -v +#. {ph1}: Node.js +#: website/public/get-started/index.html:283 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"If {ph0} prints v22.19+, v24.11+ or v26+, you're ready. If it prints an older version " +"or \"not recognized\" / \"command not found\", install {ph1} 24 LTS:" +msgstr "" + +#. {ph0}: node -v +#: website/public/get-started/index.html:305 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Type Y if asked to accept the terms. Close PowerShell, open it again, then run {ph0}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:309 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Download the Node.js installer{ph1} if winget is unavailable." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: npx +#. {ph3}: npx.cmd +#. {ph4}: npm.cmd +#: website/public/get-started/index.html:315 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"If PowerShell later says {ph0}\"running scripts is disabled on this system\"{ph1} when" +" you run {ph2}, use {ph3} instead. For npm, use {ph4}:" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:338 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"For a first installation, download the {ph0}Node.js 24 LTS macOS installer " +"(.pkg){ph1}, open it and follow the installer. Then reopen Terminal." +msgstr "" + +#: website/public/get-started/index.html:345 +msgctxt "page:get-started/index.html" +msgid "Already use Homebrew?" +msgstr "" + +#. {ph0}: sudo apt install curl unzip +#: website/public/get-started/index.html:364 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Install curl and unzip first if they are missing. On Debian or Ubuntu, run {ph0}; on " +"other distributions, use your package manager." +msgstr "" + +#: website/public/get-started/index.html:383 +msgctxt "page:get-started/index.html" +msgid "Close the terminal, open it again, then:" +msgstr "" + +#. {ph0}: nodejs +#. {ph1}: node -v +#: website/public/get-started/index.html:400 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Your distribution's own {ph0} package is often older than 22.19, so check {ph1} if you" +" use it instead." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:406 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "Prefer a regular installer? Download the LTS version from {ph0}nodejs.org{ph1}." +msgstr "" + +#: website/public/get-started/index.html:413 +msgctxt "page:get-started/index.html" +msgid "Make a working folder for your agent" +msgstr "" + +#: website/public/get-started/index.html:414 +msgctxt "page:get-started/index.html" +msgid "In your terminal, make a folder for the exercise, then move into it:" +msgstr "" + +#: website/public/get-started/index.html:433 +msgctxt "page:get-started/index.html" +msgid "" +"Keep this terminal open for the next step. If you already have a working folder, open " +"it instead." +msgstr "" + +#: website/public/get-started/index.html:440 +msgctxt "page:get-started/index.html" +msgid "2. Choose a coding agent" +msgstr "" + +#: website/public/get-started/index.html:441 +msgctxt "page:get-started/index.html" +msgid "" +"Your agent is the AI you talk to. REA supplies the inspection tools it uses. Pick one " +"client below; open its instructions if you haven't used it before." +msgstr "" + +#: website/public/get-started/index.html:447 +msgctxt "page:get-started/index.html" +msgid "Codex · use your ChatGPT account" +msgstr "" + +#: website/public/get-started/index.html:448 +msgctxt "page:get-started/index.html" +msgid "Install Codex using the command for your operating system:" +msgstr "" + +#: website/public/get-started/index.html:477 +msgctxt "page:get-started/index.html" +msgid "" +"After installation, reopen your terminal and return to the working folder. Then start " +"Codex:" +msgstr "" + +#: website/public/get-started/index.html:495 +msgctxt "page:get-started/index.html" +msgid "" +"Choose “Sign in with ChatGPT”, complete the browser sign-in, then return to the " +"terminal. When the message box appears, continue to step 3." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:500 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Codex installation and sign-in{ph1}" +msgstr "" + +#: website/public/get-started/index.html:507 +msgctxt "page:get-started/index.html" +msgid "Cursor, Windsurf or VS Code · use an editor" +msgstr "" + +#: website/public/get-started/index.html:509 +msgctxt "page:get-started/index.html" +msgid "Install the editor for your operating system and sign in." +msgstr "" + +#: website/public/get-started/index.html:512 +msgctxt "page:get-started/index.html" +msgid "Open the rea-work folder you made in step 1." +msgstr "" + +#: website/public/get-started/index.html:513 +msgctxt "page:get-started/index.html" +msgid "" +"Open its AI chat and choose Agent mode. In Windsurf or Devin Desktop, open the agent " +"chat; in VS Code, set up GitHub Copilot first." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/get-started/index.html:519 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Cursor setup{ph1} · {ph2}Windsurf / Devin Desktop setup{ph3} · {ph4}VS Code and " +"Copilot setup{ph5}" +msgstr "" + +#: website/public/get-started/index.html:531 +msgctxt "page:get-started/index.html" +msgid "Claude Code · use your Claude account" +msgstr "" + +#: website/public/get-started/index.html:532 +msgctxt "page:get-started/index.html" +msgid "Install using the command for your operating system:" +msgstr "" + +#. {ph0}: claude +#: website/public/get-started/index.html:561 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Reopen your terminal, return to your working folder and run {ph0}. Follow the sign-in " +"prompts. Access uses an eligible Claude subscription or a configured API account." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:566 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Claude Code installation and account options{ph1}" +msgstr "" + +#: website/public/get-started/index.html:573 +msgctxt "page:get-started/index.html" +msgid "Claude Desktop · use a desktop chat" +msgstr "" + +#: website/public/get-started/index.html:574 +msgctxt "page:get-started/index.html" +msgid "" +"Install Claude Desktop on Windows or macOS and sign in. Quit it completely, then run " +"this command in a terminal you opened outside Claude:" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:593 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Review and approve the plan, reopen Claude, then {ph0}check the connection in step " +"3{ph1}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:597 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Download Claude Desktop{ph1} · {ph2}Claude Desktop connection details{ph3}" +msgstr "" + +#: website/public/get-started/index.html:607 +msgctxt "page:get-started/index.html" +msgid "OpenCode · choose an AI model" +msgstr "" + +#. {ph0}: opencode +#. {ph1}: /connect +#: website/public/get-started/index.html:622 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Run {ph0} in your working folder. Use {ph1} in its chat to connect your model account," +" then select a model." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:627 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}OpenCode installation and model setup{ph1}" +msgstr "" + +#: website/public/get-started/index.html:634 +msgctxt "page:get-started/index.html" +msgid "All supported clients and setup IDs" +msgstr "" + +#. {ph0}: --client +#: website/public/get-started/index.html:635 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"The npm 6.4.0 release supports the clients below. Use the ID with {ph0} when choosing " +"a client explicitly." +msgstr "" + +#: website/public/get-started/index.html:643 +msgctxt "page:get-started/index.html" +msgid "Client" +msgstr "" + +#: website/public/get-started/index.html:644 +msgctxt "page:get-started/index.html" +msgid "Setup ID" +msgstr "" + +#. {ph0}: qoder +#. {ph1}: droid +#. {ph2}: trae +#. {ph3}: zcode +#. {ph4}: dsh +#: website/public/get-started/index.html:719 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Qoder ({ph0}), Factory Droid ({ph1}), Trae ({ph2}), ZCode ({ph3}) and DeepSeek Harness" +" ({ph4}) are available on repository main; use a source build or a release containing " +"those integrations." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:726 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Client configuration and troubleshooting{ph1} · {ph2}Release availability{ph3}" +msgstr "" + +#: website/public/get-started/index.html:738 +msgctxt "page:get-started/index.html" +msgid "Grok Bot · connect on its hosted computer" +msgstr "" + +#. {ph0}: rea +#: website/public/get-started/index.html:739 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"In Grok Bot's chat, ask it to add a custom MCP server named {ph0} using this command " +"on the Bot's computer:" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:757 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Grok Bot connector instructions{ph1}" +msgstr "" + +#: website/public/get-started/index.html:767 +msgctxt "page:get-started/index.html" +msgid "3. Connect REA" +msgstr "" + +#: website/public/get-started/index.html:768 +msgctxt "page:get-started/index.html" +msgid "Copy this into your coding agent:" +msgstr "" + +#. {ph0}: +#: website/public/get-started/index.html:771 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: npx rea-agents@latest setup +#. {ph4}: +#. {ph5}: +#: website/public/get-started/index.html:785 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Install REA and connect it to this coding agent using {ph3}. Show me " +"the setup plan for approval, then verify the installation.{ph4}{ph5}{ph6}" +msgstr "" + +#: website/public/get-started/index.html:797 +msgctxt "page:get-started/index.html" +msgid "Or run setup yourself" +msgstr "" + +#: website/public/get-started/index.html:812 +msgctxt "page:get-started/index.html" +msgid "For one specific client, add its setup ID:" +msgstr "" + +#. {ph0}: y +#: website/public/get-started/index.html:827 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"If npm asks to download the package, type {ph0} and press Enter. In REA's client list," +" use the arrow keys to move, Space to select your client and Enter to continue." +msgstr "" + +#: website/public/get-started/index.html:833 +msgctxt "page:get-started/index.html" +msgid "" +"Choose your client and review the setup plan. REA adds its MCP connection and the " +"matching investigation skill, keeping a backup of existing configuration. It asks " +"before applying the changes." +msgstr "" + +#: website/public/get-started/index.html:838 +msgctxt "page:get-started/index.html" +msgid "" +"MCP is the connection that lets your agent call REA. The skill gives it a workflow for" +" investigating software." +msgstr "" + +#: website/public/get-started/index.html:842 +msgctxt "page:get-started/index.html" +msgid "" +"For the first exercise, you can skip the optional Hopper installation. Restart your " +"client when setup finishes." +msgstr "" + +#: website/public/get-started/index.html:847 +msgctxt "page:get-started/index.html" +msgid "How do I restart my client?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: ⌘ +#. {ph3}: Q +#: website/public/get-started/index.html:848 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Desktop apps{ph1} (Claude Desktop, Cursor, Windsurf, VS Code): quit the app " +"completely, then open it again. Closing the window isn't enough. On macOS press {ph2} " +"{ph3}; on Windows, also quit from the tray icon if there is one." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:855 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Terminal agents{ph1} (Claude Code, Codex, Gemini CLI): exit the session and start" +" it again." +msgstr "" + +#. {ph0}: codex +#. {ph1}: "healthy": true +#: website/public/get-started/index.html:875 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Replace {ph0} with your client's setup ID. A successful check reports {ph1}. Then ask " +"your agent:" +msgstr "" + +#: website/public/get-started/index.html:881 +msgctxt "page:get-started/index.html" +msgid "Check that REA is connected and show me which REA tools you can use." +msgstr "" + +#: website/public/get-started/index.html:888 +msgctxt "page:get-started/index.html" +msgid "4. Try your first investigation" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:889 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"The example is a six-file Electron app with an {ph0}Export notes{ph1} button. Your " +"agent can inspect its code without installing or launching Electron." +msgstr "" + +#: website/public/get-started/index.html:896 +msgctxt "page:get-started/index.html" +msgid "Your coding agent" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: https://rea.tools/examples/notes-example.zip +#. {ph4}: notes.csv +#. {ph5}: +#. {ph6}: +#: website/public/get-started/index.html:906 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Download {ph3} into a new example folder and unpack it. Use REA to " +"find what happens when I click Export notes. Show where {ph4} is written, which fields" +" it contains, and the relevant files and lines.{ph5}{ph6}{ph7}" +msgstr "" + +#: website/public/get-started/index.html:920 +msgctxt "page:get-started/index.html" +msgid "Look for a short explanation with file and line references:" +msgstr "" + +#. {ph0}: notes:export +#. {ph1}: notes.csv +#. {ph2}: id +#. {ph3}: title +#: website/public/get-started/index.html:922 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"The button sends a {ph0} message. The main process formats the notes as CSV and writes" +" {ph1} in the user’s Downloads folder. The columns are {ph2} and {ph3}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:929 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Check a prediction in the guided exercise →{ph1}" +msgstr "" + +#: website/public/get-started/index.html:935 +msgctxt "page:get-started/index.html" +msgid "Download the example yourself, or use your own app" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:938 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Download example ZIP{ph1}" +msgstr "" + +#. {ph0}: notes-example +#: website/public/get-started/index.html:946 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"If your agent can’t download files, unzip this archive yourself. Give it the path to " +"the {ph0} folder and the same export question." +msgstr "" + +#. {ph0}: /absolute/path/to/app +#: website/public/get-started/index.html:952 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Use REA to inspect the app at {ph0}. Find how it exports data and show the relevant " +"files and lines." +msgstr "" + +#: website/public/get-started/index.html:959 +msgctxt "page:get-started/index.html" +msgid "How do I get a folder's full path?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:961 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Windows:{ph1} in File Explorer, right-click the folder and choose {ph2}Copy as " +"path{ph3}. On Windows 10, hold Shift while right-clicking." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:966 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}macOS:{ph1} in Finder, right-click the folder, hold Option and choose {ph2}Copy " +"\"…\" as Pathname{ph3}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:970 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Any system:{ph1} drag the folder into a terminal window and its path appears." +msgstr "" + +#: website/public/get-started/index.html:975 website/public/get-started/index.html:1733 +msgctxt "page:get-started/index.html" +msgid "In a terminal, put quotes around a path that contains spaces." +msgstr "" + +#: website/public/get-started/index.html:982 +msgctxt "page:get-started/index.html" +msgid "Analyze another kind of software" +msgstr "" + +#: website/public/get-started/index.html:983 +msgctxt "page:get-started/index.html" +msgid "" +"Choose the section for your target. A provider is the local analysis tool REA uses for" +" that kind of software." +msgstr "" + +#: website/public/get-started/index.html:988 +msgctxt "page:get-started/index.html" +msgid "Native executables and libraries · Hopper, Ghidra or IDA" +msgstr "" + +#: website/public/get-started/index.html:991 +msgctxt "page:get-started/index.html" +msgid "" +"Install one analysis tool on the computer running REA. The host is your operating " +"system; the target is the program you want to inspect." +msgstr "" + +#: website/public/get-started/index.html:1000 +msgctxt "page:get-started/index.html" +msgid "Provider" +msgstr "" + +#: website/public/get-started/index.html:1009 +msgctxt "page:get-started/index.html" +msgid "Unavailable" +msgstr "" + +#: website/public/get-started/index.html:1011 +msgctxt "page:get-started/index.html" +msgid "Supported distributions" +msgstr "" + +#: website/public/get-started/index.html:1015 +msgctxt "page:get-started/index.html" +msgid "x64 · experimental" +msgstr "" + +#: website/public/get-started/index.html:1021 +msgctxt "page:get-started/index.html" +msgid "Verified profiles" +msgstr "" + +#: website/public/get-started/index.html:1022 +msgctxt "page:get-started/index.html" +msgid "Verified headless profile" +msgstr "" + +#: website/public/get-started/index.html:1023 +msgctxt "page:get-started/index.html" +msgid "See provider guide" +msgstr "" + +#: website/public/get-started/index.html:1029 +msgctxt "page:get-started/index.html" +msgid "Hopper · let setup install or connect it" +msgstr "" + +#: website/public/get-started/index.html:1030 +msgctxt "page:get-started/index.html" +msgid "" +"Connect Hopper on macOS or Linux. Run the setup command above; it detects an existing " +"installation or offers an installation plan for your approval." +msgstr "" + +#: website/public/get-started/index.html:1035 +msgctxt "page:get-started/index.html" +msgid "" +"Choose Hopper in setup and review its separate installation plan. On macOS, choose " +"demo mode or activate your license when Hopper first opens. On Linux, setup prepares " +"the supported demo and its private display." +msgstr "" + +#: website/public/get-started/index.html:1041 +msgctxt "page:get-started/index.html" +msgid "" +"Linux hosts: Ubuntu 24.04+, Fedora 41+, Nobara 44+, Arch Linux, CachyOS or Omarchy. " +"Hopper is commercial software; its demo has vendor-defined limits." +msgstr "" + +#: website/public/get-started/index.html:1060 +msgctxt "page:get-started/index.html" +msgid "" +"If macOS asks for Automation permission, allow the app that starts REA in System " +"Settings → Privacy & Security → Automation, then retry." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:1065 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Hopper setup and troubleshooting{ph1}" +msgstr "" + +#: website/public/get-started/index.html:1073 +msgctxt "page:get-started/index.html" +msgid "Ghidra · install the free analysis tool and Java" +msgstr "" + +#: website/public/get-started/index.html:1077 +msgctxt "page:get-started/index.html" +msgid "" +"Install a 64-bit JDK 21 or newer, including the Java compiler. Choose the package " +"matching your computer's architecture." +msgstr "" + +#. {ph0}: ghidra_…_PUBLIC_….zip +#: website/public/get-started/index.html:1082 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Download Ghidra 12.1.4 from the release's Assets list and extract the {ph0} archive. " +"Choose the release archive, not “Source code”." +msgstr "" + +#. {ph0}: ghidraRun +#. {ph1}: ghidraRun.bat +#. {ph2}: GHIDRA_INSTALL_DIR +#: website/public/get-started/index.html:1087 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "Find the extracted folder containing {ph0} or {ph1}. Use that folder for {ph2}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:1093 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Download a JDK{ph1} · {ph2}Download Ghidra 12.1.4{ph3}" +msgstr "" + +#. {ph0}: java.home +#. {ph1}: JAVA_HOME +#: website/public/get-started/index.html:1103 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Check Java. The first command prints {ph0}; use that folder for {ph1}. The second " +"confirms the compiler is installed:" +msgstr "" + +#: website/public/get-started/index.html:1124 +msgctxt "page:get-started/index.html" +msgid "Connect Ghidra on Windows" +msgstr "" + +#: website/public/get-started/index.html:1125 +msgctxt "page:get-started/index.html" +msgid "" +"Windows x64 has experimental, read-only support for native x86 and x64 PE applications" +" and DLLs on fixed local NTFS drives. Use an existing Ghidra 12.1.x installation and a" +" 64-bit JDK 21 or newer:" +msgstr "" + +#: website/public/get-started/index.html:1148 +msgctxt "page:get-started/index.html" +msgid "Replace the two paths with your installations, then review setup's plan." +msgstr "" + +#: website/public/get-started/index.html:1154 +msgctxt "page:get-started/index.html" +msgid "Connect your Ghidra installation" +msgstr "" + +#: website/public/get-started/index.html:1170 +msgctxt "page:get-started/index.html" +msgid "" +"Replace both paths with your existing installations. For a fresh macOS or Linux arm64 " +"installation, build the native decompiler for your computer before continuing." +msgstr "" + +#: website/public/get-started/index.html:1176 +msgctxt "page:get-started/index.html" +msgid "Build Ghidra's native decompiler" +msgstr "" + +#: website/public/get-started/index.html:1177 +msgctxt "page:get-started/index.html" +msgid "" +"On macOS, the build needs Xcode Command Line Tools, make and bison. Use the guide for " +"your computer:" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:1182 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}macOS · Intel{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:1188 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}macOS · Apple Silicon{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:1194 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Linux arm64 · native build instructions{ph1}" +msgstr "" + +#: website/public/get-started/index.html:1202 +msgctxt "page:get-started/index.html" +msgid "Then check Ghidra and save its paths for your client:" +msgstr "" + +#: website/public/get-started/index.html:1219 +msgctxt "page:get-started/index.html" +msgid "" +"Keep these commands in the same terminal session. Rerun setup after setting the paths," +" approve the updated client configuration, then restart your agent." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:1224 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Ghidra setup and architecture requirements{ph1} · {ph2}Windows Ghidra guide{ph3}" +msgstr "" + +#: website/public/get-started/index.html:1237 +msgctxt "page:get-started/index.html" +msgid "IDA · connect an existing installation" +msgstr "" + +#: website/public/get-started/index.html:1238 +msgctxt "page:get-started/index.html" +msgid "" +"Use the IDA provider guide to prepare an upstream MCP registration. Choose an attached" +" GUI with the original binary open, or a headless supervisor that opens a private " +"database." +msgstr "" + +#: website/public/get-started/index.html:1243 +msgctxt "page:get-started/index.html" +msgid "" +"Verified profiles include the Windows legacy GUI and headless supervisor, plus a macOS" +" arm64 headless supervisor with IDA Professional 9.1. The optional native GUI bridge " +"has its own version and platform requirements." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: 6.4.0 +#: website/public/get-started/index.html:1249 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"The macOS headless profile and native GUI bridge require a {ph0}REA source build{ph1} " +"or a release containing those changes. npm {ph2} does not include them." +msgstr "" + +#. {ph0}: node scripts/rea.mjs doctor --provider ida --json +#. {ph1}: node scripts/rea.mjs setup +#. {ph2}: npx +#: website/public/get-started/index.html:1258 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"From the built checkout, run {ph0} and {ph1} instead of the {ph2} commands below." +msgstr "" + +#: website/public/get-started/index.html:1265 +msgctxt "page:get-started/index.html" +msgid "Prepare the IDA registration file" +msgstr "" + +#. {ph0}: ida-mcp.json +#. {ph1}: .txt +#: website/public/get-started/index.html:1266 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Install and configure the upstream server using the IDA guide below. Then save its " +"working registration as {ph0} in a text editor. On Windows, choose “All files” when " +"saving in Notepad so it doesn't add {ph1}." +msgstr "" + +#. {ph0}: idb_open +#. {ph1}: idb_list +#. {ph2}: idb_close +#: website/public/get-started/index.html:1273 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"For a headless supervisor providing {ph0}, {ph1} and {ph2}, the file can look like " +"this:" +msgstr "" + +#. {ph0}: command +#. {ph1}: args +#. {ph2}: env +#: website/public/get-started/index.html:1296 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"For an attached legacy 1.4.0 GUI server, copy its working {ph0}, {ph1} and optional " +"{ph2} into the file. Open the original binary in IDA and start its upstream plugin " +"before asking REA to inspect it." +msgstr "" + +#: website/public/get-started/index.html:1338 +msgctxt "page:get-started/index.html" +msgid "" +"Use the JSON registration file you prepared with the provider guide, then rerun setup " +"and restart your agent." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:1342 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}IDA profiles, registration examples and verified platforms{ph1}" +msgstr "" + +#: website/public/get-started/index.html:1350 +msgctxt "page:get-started/index.html" +msgid "" +"Once connected, give your agent the original executable's full path and name your " +"provider:" +msgstr "" + +#. {ph0}: /absolute/path/to/program +#: website/public/get-started/index.html:1355 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Use REA with my configured provider to inspect {ph0}. List its functions and strings, " +"then explain the part that handles user input with references to the code." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:1362 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Follow a native analysis example{ph1}" +msgstr "" + +#: website/public/get-started/index.html:1367 +msgctxt "page:get-started/index.html" +msgid "Websites, Android, .NET, firmware and other targets" +msgstr "" + +#: website/public/get-started/index.html:1370 +msgctxt "page:get-started/index.html" +msgid "" +"Open the guide for the target you have. Each guide gives the additional tools, " +"supported hosts and first command." +msgstr "" + +#: website/public/get-started/index.html:1378 +msgctxt "page:get-started/index.html" +msgid "Target" +msgstr "" + +#: website/public/get-started/index.html:1379 +msgctxt "page:get-started/index.html" +msgid "Tools to prepare" +msgstr "" + +#: website/public/get-started/index.html:1380 +msgctxt "page:get-started/index.html" +msgid "Guide" +msgstr "" + +#: website/public/get-started/index.html:1385 +msgctxt "page:get-started/index.html" +msgid "JavaScript / Electron" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:1387 website/public/get-started/index.html:1392 +#: website/public/get-started/index.html:1397 website/public/get-started/index.html:1407 +#: website/public/get-started/index.html:1417 website/public/get-started/index.html:1427 +#: website/public/get-started/index.html:1437 website/public/get-started/index.html:1447 +#: website/public/get-started/index.html:1457 website/public/get-started/index.html:1467 +#: website/public/get-started/index.html:1477 website/public/get-started/index.html:1487 +#: website/public/get-started/index.html:1497 website/public/get-started/index.html:1507 +#: website/public/get-started/index.html:1517 website/public/get-started/index.html:1527 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Open guide{ph1}" +msgstr "" + +#: website/public/get-started/index.html:1390 +msgctxt "page:get-started/index.html" +msgid "Website" +msgstr "" + +#: website/public/get-started/index.html:1395 +msgctxt "page:get-started/index.html" +msgid ".NET / Flutter / packages" +msgstr "" + +#: website/public/get-started/index.html:1405 +msgctxt "page:get-started/index.html" +msgid "Android APK" +msgstr "" + +#: website/public/get-started/index.html:1415 +msgctxt "page:get-started/index.html" +msgid "Android device" +msgstr "" + +#: website/public/get-started/index.html:1425 +msgctxt "page:get-started/index.html" +msgid "Android resources" +msgstr "" + +#: website/public/get-started/index.html:1435 +msgctxt "page:get-started/index.html" +msgid "JEB project" +msgstr "" + +#: website/public/get-started/index.html:1445 +msgctxt "page:get-started/index.html" +msgid "Firmware" +msgstr "" + +#: website/public/get-started/index.html:1455 +msgctxt "page:get-started/index.html" +msgid "WASM" +msgstr "" + +#: website/public/get-started/index.html:1465 +msgctxt "page:get-started/index.html" +msgid "SQLite database" +msgstr "" + +#: website/public/get-started/index.html:1475 +msgctxt "page:get-started/index.html" +msgid "EVM bytecode" +msgstr "" + +#: website/public/get-started/index.html:1485 +msgctxt "page:get-started/index.html" +msgid "ELF / Linux crash" +msgstr "" + +#: website/public/get-started/index.html:1495 +msgctxt "page:get-started/index.html" +msgid "HAR / SAZ / mitmproxy" +msgstr "" + +#: website/public/get-started/index.html:1505 +msgctxt "page:get-started/index.html" +msgid "PCAP / PCAPNG" +msgstr "" + +#: website/public/get-started/index.html:1515 +msgctxt "page:get-started/index.html" +msgid "Logic signals" +msgstr "" + +#: website/public/get-started/index.html:1525 +msgctxt "page:get-started/index.html" +msgid "Process behavior" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#. {ph6}: +#. {ph7}: +#: website/public/get-started/index.html:1537 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Flutter guide{ph1} · {ph2}Packages and resources{ph3} · {ph4}EVM bytecode{ph5} · " +"{ph6}All investigation guides{ph7}" +msgstr "" + +#: website/public/get-started/index.html:1557 +msgctxt "page:get-started/index.html" +msgid "Use REA from a terminal" +msgstr "" + +#: website/public/get-started/index.html:1559 +msgctxt "page:get-started/index.html" +msgid "CLI commands, global installation and curl" +msgstr "" + +#: website/public/get-started/index.html:1560 +msgctxt "page:get-started/index.html" +msgid "" +"Analyze a JavaScript or Electron application folder or ASAR archive without running " +"the app:" +msgstr "" + +#: website/public/get-started/index.html:1566 +msgctxt "page:get-started/index.html" +msgid "Static application analysis" +msgstr "" + +#. {ph0}: .asar +#. {ph1}: "D:/apps/example" +#: website/public/get-started/index.html:1578 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Replace the path with your extracted app directory or {ph0} file. On Windows, a path " +"such as {ph1} works here." +msgstr "" + +#: website/public/get-started/index.html:1584 +msgctxt "page:get-started/index.html" +msgid "Where do I find an app's .asar file?" +msgstr "" + +#. {ph0}: resources +#: website/public/get-started/index.html:1585 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "Electron apps usually keep it in a {ph0} folder:" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: C:\Users\<you>\AppData\Local\Programs\<App>\resources\app.asar +#: website/public/get-started/index.html:1590 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Windows:{ph1} {ph2}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: /Applications/<App>.app/Contents/Resources/app.asar +#. {ph3}: +#. {ph4}: +#: website/public/get-started/index.html:1596 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}macOS:{ph1} {ph2} (right-click the app and choose {ph3}Show Package " +"Contents{ph4})" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: /opt/<App>/resources/app.asar +#: website/public/get-started/index.html:1604 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Linux:{ph1} often {ph2}" +msgstr "" + +#. {ph0}: app.asar +#: website/public/get-started/index.html:1609 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "Some apps install elsewhere. Search the app's folder for {ph0}." +msgstr "" + +#: website/public/get-started/index.html:1614 +msgctxt "page:get-started/index.html" +msgid "" +"The result identifies the app, shows connections between modules and gives their " +"source locations. Connections REA cannot resolve are marked in the result." +msgstr "" + +#. {ph0}: rea +#: website/public/get-started/index.html:1619 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "If you'd like a permanent {ph0} command in your shell:" +msgstr "" + +#: website/public/get-started/index.html:1625 +msgctxt "page:get-started/index.html" +msgid "Install the CLI" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:1637 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Continue with the JavaScript application guide{ph1}" +msgstr "" + +#. {ph0}: main +#: website/public/get-started/index.html:1656 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Replace {ph0} with a function name or address from the target's function list. Ghidra " +"must be configured first." +msgstr "" + +#: website/public/get-started/index.html:1660 +msgctxt "page:get-started/index.html" +msgid "On macOS or Linux, you can also use the curl installer after preparing Node.js:" +msgstr "" + +#. {ph0}: rea setup +#: website/public/get-started/index.html:1678 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "Follow the setup prompts to connect your agent. If they don't appear, run {ph0}." +msgstr "" + +#. {ph0}: rea +#. {ph1}: "$HOME/.local/bin/rea" setup +#: website/public/get-started/index.html:1682 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"If your shell can't find {ph0}, use the executable path printed by the installer. On " +"Linux, the default setup command is {ph1}." +msgstr "" + +#: website/public/get-started/index.html:1691 +msgctxt "page:get-started/index.html" +msgid "Getting help" +msgstr "" + +#: website/public/get-started/index.html:1693 +msgctxt "page:get-started/index.html" +msgid "If your agent doesn't see REA" +msgstr "" + +#. {ph0}: doctor +#: website/public/get-started/index.html:1694 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"Restart or reconnect the client after setup. Check its REA connection with {ph0}; for " +"Codex:" +msgstr "" + +#: website/public/get-started/index.html:1698 +msgctxt "page:get-started/index.html" +msgid "" +"Use the client check in step 3 with your setup ID. In editor clients, enable REA in " +"MCP settings and allow its tools in the agent chat." +msgstr "" + +#: website/public/get-started/index.html:1705 +msgctxt "page:get-started/index.html" +msgid "If a provider needs attention" +msgstr "" + +#: website/public/get-started/index.html:1706 +msgctxt "page:get-started/index.html" +msgid "Check the provider you're using. For Ghidra:" +msgstr "" + +#: website/public/get-started/index.html:1709 +msgctxt "page:get-started/index.html" +msgid "Check one provider" +msgstr "" + +#: website/public/get-started/index.html:1721 +msgctxt "page:get-started/index.html" +msgid "The report gives the failed check and a suggested next step." +msgstr "" + +#: website/public/get-started/index.html:1726 +msgctxt "page:get-started/index.html" +msgid "Windows, WSL and paths with spaces" +msgstr "" + +#: website/public/get-started/index.html:1727 +msgctxt "page:get-started/index.html" +msgid "" +"Use Windows PowerShell for Windows clients and analysis tools. If your agent runs " +"inside WSL, install Node.js and REA inside that Linux environment and use Linux paths " +"there. Headless providers run on the same host as REA." +msgstr "" + +#: website/public/get-started/index.html:1736 +msgctxt "page:get-started/index.html" +msgid "Windows setup command:" +msgstr "" + +#: website/public/get-started/index.html:1753 +msgctxt "page:get-started/index.html" +msgid "Update or remove REA" +msgstr "" + +#: website/public/get-started/index.html:1754 +msgctxt "page:get-started/index.html" +msgid "" +"To refresh your agent connection, run the latest setup command again, review its plan " +"and restart your client." +msgstr "" + +#. {ph0}: rea update +#. {ph1}: npx rea-agents@latest uninstall +#: website/public/get-started/index.html:1772 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"If you installed the global CLI, update it with {ph0}. Use {ph1} to remove REA's " +"client configuration and skill." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/get-started/index.html:1778 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}Update and uninstall details{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:1786 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}REA FAQ{ph1}{ph2}Quick answers on updates, agents and analysis.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:1790 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}Choose an investigation guide{ph1}{ph2}Worked examples for a binary, an Electron " +"app and a browser.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:1797 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "" +"{ph0}GitHub issues{ph1}{ph2}Report a problem with the command and diagnostics.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/get-started/index.html:1801 +#, python-brace-format +msgctxt "page:get-started/index.html" +msgid "{ph0}REA community{ph1}{ph2}Questions, investigations and work in progress.{ph3}" +msgstr "" + +#: website/public/get-started/index.html:6 +msgctxt "page:get-started/index.html" +msgid "Install REA and Set Up Your Coding Agent" +msgstr "" + +#: website/public/get-started/index.html:7 +msgctxt "page:get-started/index.html" +msgid "" +"Connect REA to your coding agent or inspect a local JavaScript or Electron app from " +"the terminal. Setup, first questions and native provider guides." +msgstr "" + +#: website/public/get-started/index.html:225 +msgctxt "page:get-started/index.html" +msgid "REA getting started guide" +msgstr "" + +#: website/public/get-started/index.html:271 +msgctxt "page:get-started/index.html" +msgid "Copy Node.js version check" +msgstr "" + +#: website/public/get-started/index.html:294 +msgctxt "page:get-started/index.html" +msgid "Copy Node.js installation command for Windows" +msgstr "" + +#: website/public/get-started/index.html:324 +msgctxt "page:get-started/index.html" +msgid "Copy Windows REA setup command" +msgstr "" + +#: website/public/get-started/index.html:349 +msgctxt "page:get-started/index.html" +msgid "Copy Homebrew Node.js installation command" +msgstr "" + +#: website/public/get-started/index.html:372 +msgctxt "page:get-started/index.html" +msgid "Copy fnm installation command for Linux" +msgstr "" + +#: website/public/get-started/index.html:387 +msgctxt "page:get-started/index.html" +msgid "Copy Node.js 24 commands for Linux" +msgstr "" + +#: website/public/get-started/index.html:421 website/public/get-started/index.html:452 +#: website/public/get-started/index.html:466 website/public/get-started/index.html:484 +#: website/public/get-started/index.html:536 website/public/get-started/index.html:550 +#: website/public/get-started/index.html:582 website/public/get-started/index.html:611 +#: website/public/get-started/index.html:746 website/public/get-started/index.html:801 +#: website/public/get-started/index.html:816 website/public/get-started/index.html:864 +#: website/public/get-started/index.html:1049 website/public/get-started/index.html:1111 +#: website/public/get-started/index.html:1134 website/public/get-started/index.html:1158 +#: website/public/get-started/index.html:1206 website/public/get-started/index.html:1281 +#: website/public/get-started/index.html:1307 website/public/get-started/index.html:1324 +#: website/public/get-started/index.html:1645 website/public/get-started/index.html:1667 +#: website/public/get-started/index.html:1740 website/public/get-started/index.html:1761 +msgctxt "page:get-started/index.html" +msgid "Copy command" +msgstr "" + +#: website/public/get-started/index.html:776 +msgctxt "page:get-started/index.html" +msgid "Copy REA installation prompt" +msgstr "" + +#: website/public/get-started/index.html:897 +msgctxt "page:get-started/index.html" +msgid "Copy Notes investigation prompt" +msgstr "" + +#: website/public/get-started/index.html:1567 +msgctxt "page:get-started/index.html" +msgid "Copy JavaScript analysis command" +msgstr "" + +#: website/public/get-started/index.html:1626 +msgctxt "page:get-started/index.html" +msgid "Copy CLI installation command" +msgstr "" + +#: website/public/get-started/index.html:1710 +msgctxt "page:get-started/index.html" +msgid "Copy provider diagnosis command" +msgstr "" + +#: website/public/get-started/index.html:1825 +msgctxt "page:get-started/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/guides/browser/index.html:109 +msgctxt "page:guides/browser/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/guides/browser/index.html:201 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0}Home{ph1} / {ph2}Guides{ph3} / Browser observation" +msgstr "" + +#. {ph0}:
+#: website/public/guides/browser/index.html:205 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "See what happens{ph0}when you click." +msgstr "" + +#: website/public/guides/browser/index.html:206 +msgctxt "page:guides/browser/index.html" +msgid "" +"Use a small browser app to connect an action, its network request and the JavaScript " +"that builds a download." +msgstr "" + +#: website/public/guides/browser/index.html:213 +msgctxt "page:guides/browser/index.html" +msgid "In this guide" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/browser/index.html:215 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0}The example{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/browser/index.html:216 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0}Open the browser{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/browser/index.html:217 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0}Ask your agent{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/browser/index.html:218 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0}Capture from CLI{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/browser/index.html:219 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0}Read the request and script{ph1}" +msgstr "" + +#: website/public/guides/browser/index.html:224 +msgctxt "page:guides/browser/index.html" +msgid "What happens when you click Export?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: notes.json +#: website/public/guides/browser/index.html:225 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"The {ph0}Notes browser example{ph1} has an {ph2}Export notes{ph3} button. Clicking it " +"loads {ph4}, formats the two notes as CSV, and starts a download." +msgstr "" + +#: website/public/guides/browser/index.html:233 +msgctxt "page:guides/browser/index.html" +msgid "From the click to the CSV download" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/guides/browser/index.html:235 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"{ph0}01 · You{ph1}{ph2}Click Export notes{ph3}{ph4}Perform the action in your browser " +"while the capture is running.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/guides/browser/index.html:243 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"{ph0}02 · REA{ph1}{ph2}Record the request{ph3}{ph4}Capture the request URL, response " +"status and JSON structure from the selected page.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: fetch("./notes.json") +#. {ph6}: export.js +#. {ph7}: +#: website/public/guides/browser/index.html:251 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"{ph0}03 · Your agent{ph1}{ph2}Read the export code{ph3}{ph4}Connect the observed " +"request to {ph5} in {ph6}.{ph7}" +msgstr "" + +#: website/public/guides/browser/index.html:264 +msgctxt "page:guides/browser/index.html" +msgid "Start the capture before clicking Export notes." +msgstr "" + +#: website/public/guides/browser/index.html:270 +msgctxt "page:guides/browser/index.html" +msgid "Open Chrome with remote debugging" +msgstr "" + +#: website/public/guides/browser/index.html:271 +msgctxt "page:guides/browser/index.html" +msgid "" +"Open the hosted Notes example with a separate browser profile and a local debugging " +"port. On Linux:" +msgstr "" + +#: website/public/guides/browser/index.html:277 +msgctxt "page:guides/browser/index.html" +msgid "Start the example browser" +msgstr "" + +#: website/public/guides/browser/index.html:278 +#: website/public/guides/browser/index.html:310 +#: website/public/guides/browser/index.html:344 +#: website/public/guides/browser/index.html:363 +#: website/public/guides/browser/index.html:428 +msgctxt "page:guides/browser/index.html" +msgid "Copy" +msgstr "" + +#: website/public/guides/browser/index.html:292 +msgctxt "page:guides/browser/index.html" +msgid "" +"Use your installed browser's executable path on macOS or Windows. You can replace the " +"page URL with another page you want to inspect." +msgstr "" + +#: website/public/guides/browser/index.html:297 +msgctxt "page:guides/browser/index.html" +msgid "" +"REA connects to this existing browser. You keep control of the page, perform the " +"action, and close the browser when finished." +msgstr "" + +#: website/public/guides/browser/index.html:303 +msgctxt "page:guides/browser/index.html" +msgid "Ask your agent to watch one action" +msgstr "" + +#. {ph0}: +#: website/public/guides/browser/index.html:306 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/guides/browser/index.html:319 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to inspect this page while I click Export notes. What request " +"does it make, and how is the CSV built?{ph3}{ph4}{ph5}" +msgstr "" + +#. {ph0}: http://127.0.0.1:9222 +#: website/public/guides/browser/index.html:327 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"Example prompt. Give your agent the debugging endpoint, {ph0}, and the page URL. Let " +"it start the capture before you click." +msgstr "" + +#: website/public/guides/browser/index.html:332 +msgctxt "page:guides/browser/index.html" +msgid "" +"Your agent discovers the page target, starts an observation window, and reads the " +"resulting evidence. It can then inspect the script behind the export." +msgstr "" + +#: website/public/guides/browser/index.html:339 +msgctxt "page:guides/browser/index.html" +msgid "Or capture from the terminal" +msgstr "" + +#: website/public/guides/browser/index.html:340 +msgctxt "page:guides/browser/index.html" +msgid "Find the page's target ID:" +msgstr "" + +#: website/public/guides/browser/index.html:343 +msgctxt "page:guides/browser/index.html" +msgid "Find the page" +msgstr "" + +#. {ph0}: TARGET_ID +#: website/public/guides/browser/index.html:356 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"Choose the target with the Notes example URL. Replace {ph0} below with its ID, then " +"run:" +msgstr "" + +#: website/public/guides/browser/index.html:362 +msgctxt "page:guides/browser/index.html" +msgid "Capture the next ten seconds" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/browser/index.html:378 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"Let the command connect for a few seconds, then click {ph0}Export notes{ph1} in that " +"browser. The result arrives after the observation window ends." +msgstr "" + +#: website/public/guides/browser/index.html:383 +msgctxt "page:guides/browser/index.html" +msgid "" +"The captured result includes the selected page, network activity during that window, " +"and the shape of the JSON response. Earlier requests are outside this capture." +msgstr "" + +#: website/public/guides/browser/index.html:390 +msgctxt "page:guides/browser/index.html" +msgid "Read the request and export script" +msgstr "" + +#: website/public/guides/browser/index.html:393 +msgctxt "page:guides/browser/index.html" +msgid "Recorded with REA 4.1.0 on the local Notes example" +msgstr "" + +#: website/public/guides/browser/index.html:398 +msgctxt "page:guides/browser/index.html" +msgid "Captured fact" +msgstr "" + +#: website/public/guides/browser/index.html:399 +msgctxt "page:guides/browser/index.html" +msgid "Value" +msgstr "" + +#: website/public/guides/browser/index.html:404 +msgctxt "page:guides/browser/index.html" +msgid "Request" +msgstr "" + +#: website/public/guides/browser/index.html:408 +msgctxt "page:guides/browser/index.html" +msgid "Response" +msgstr "" + +#: website/public/guides/browser/index.html:412 +msgctxt "page:guides/browser/index.html" +msgid "Request initiator" +msgstr "" + +#. {ph0}: export.js +#: website/public/guides/browser/index.html:413 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0} · script" +msgstr "" + +#: website/public/guides/browser/index.html:416 +msgctxt "page:guides/browser/index.html" +msgid "Response structure" +msgstr "" + +#. {ph0}: notes[] +#. {ph1}: id +#. {ph2}: title +#: website/public/guides/browser/index.html:417 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0} with {ph1} and {ph2} fields" +msgstr "" + +#: website/public/guides/browser/index.html:427 +msgctxt "page:guides/browser/index.html" +msgid "Read the loaded scripts" +msgstr "" + +#. {ph0}: export.js +#: website/public/guides/browser/index.html:441 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"The request identifies the data source, and REA records {ph0} as its initiator. Read " +"the captured script source to see how the data is used:" +msgstr "" + +#. {ph0}: export.js +#: website/public/guides/browser/index.html:448 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0} · example source excerpt" +msgstr "" + +#. {ph0}: notes.json +#: website/public/guides/browser/index.html:461 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"The download is constructed in the page using the JSON response. The CSV formatting " +"step comes from the script; the network capture establishes that this click requested " +"{ph0}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: export.js +#. {ph4}: +#. {ph5}: +#. {ph6}: notes.json +#. {ph7}: +#: website/public/guides/browser/index.html:466 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "{ph0}Open the example{ph1} · {ph2}Download {ph3}{ph4} · {ph5}Download {ph6}{ph7}" +msgstr "" + +#. {ph0}: notes.json +#: website/public/guides/browser/index.html:477 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"Find the script that requests {ph0}. How does it escape titles containing commas or " +"quotation marks?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/browser/index.html:482 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"For an installed JavaScript or Electron app, continue with the {ph0}application " +"workflow{ph1} to follow files and process boundaries." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/browser/index.html:487 +#, python-brace-format +msgctxt "page:guides/browser/index.html" +msgid "" +"For HTTP request and response bodies, use {ph0}Fiddler Everywhere: SAZ captures, MCP " +"and public skills{ph1}. Export SAZ or HAR 1.2 for offline REA capture Evidence, or " +"connect Everywhere's MCP server to inspect captured traffic with your agent." +msgstr "" + +#: website/public/guides/browser/index.html:6 +msgctxt "page:guides/browser/index.html" +msgid "Browser and Network Analysis — REA" +msgstr "" + +#: website/public/guides/browser/index.html:7 +msgctxt "page:guides/browser/index.html" +msgid "" +"Observe a Notes export with REA: select a browser page, capture a click, inspect the " +"request and follow the export script." +msgstr "" + +#: website/public/guides/browser/index.html:212 +msgctxt "page:guides/browser/index.html" +msgid "On this page" +msgstr "" + +#: website/public/guides/browser/index.html:222 +msgctxt "page:guides/browser/index.html" +msgid "Browser observation" +msgstr "" + +#: website/public/guides/browser/index.html:278 +msgctxt "page:guides/browser/index.html" +msgid "Copy start the example browser" +msgstr "" + +#: website/public/guides/browser/index.html:310 +msgctxt "page:guides/browser/index.html" +msgid "Copy example prompt" +msgstr "" + +#: website/public/guides/browser/index.html:344 +msgctxt "page:guides/browser/index.html" +msgid "Copy find the page" +msgstr "" + +#: website/public/guides/browser/index.html:363 +msgctxt "page:guides/browser/index.html" +msgid "Copy capture the next ten seconds" +msgstr "" + +#: website/public/guides/browser/index.html:428 +msgctxt "page:guides/browser/index.html" +msgid "Copy read the loaded scripts" +msgstr "" + +#: website/public/guides/browser/index.html:515 +msgctxt "page:guides/browser/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/guides/index.html:109 +msgctxt "page:guides/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/index.html:201 +#, python-brace-format +msgctxt "page:guides/index.html" +msgid "{ph0}Home{ph1} / Guides" +msgstr "" + +#: website/public/guides/index.html:202 +msgctxt "page:guides/index.html" +msgid "REA guides." +msgstr "" + +#: website/public/guides/index.html:203 +msgctxt "page:guides/index.html" +msgid "" +"Analyze a native function, an Electron export or a browser request. Each guide " +"includes a prompt, code and results." +msgstr "" + +#: website/public/guides/index.html:210 +msgctxt "page:guides/index.html" +msgid "First investigation" +msgstr "" + +#: website/public/guides/index.html:212 +msgctxt "page:guides/index.html" +msgid "Set up REA" +msgstr "" + +#: website/public/guides/index.html:213 +msgctxt "page:guides/index.html" +msgid "Connect your coding agent or use REA from the terminal." +msgstr "" + +#: website/public/guides/index.html:214 +msgctxt "page:guides/index.html" +msgid "Get started with REA" +msgstr "" + +#: website/public/guides/index.html:218 +msgctxt "page:guides/index.html" +msgid "Native binaries" +msgstr "" + +#: website/public/guides/index.html:220 +msgctxt "page:guides/index.html" +msgid "Recover a sound-pan calculation" +msgstr "" + +#: website/public/guides/index.html:221 +msgctxt "page:guides/index.html" +msgid "" +"Start with a Windows game executable. Inspect instructions, follow a caller, read " +"numeric constants and check the recovered C." +msgstr "" + +#: website/public/guides/index.html:226 +msgctxt "page:guides/index.html" +msgid "Instructions" +msgstr "" + +#: website/public/guides/index.html:227 +msgctxt "page:guides/index.html" +msgid "Caller" +msgstr "" + +#: website/public/guides/index.html:228 +msgctxt "page:guides/index.html" +msgid "Constants" +msgstr "" + +#: website/public/guides/index.html:229 +msgctxt "page:guides/index.html" +msgid "C function" +msgstr "" + +#: website/public/guides/index.html:231 +msgctxt "page:guides/index.html" +msgid "Native analysis guide" +msgstr "" + +#: website/public/guides/index.html:235 +msgctxt "page:guides/index.html" +msgid "JavaScript & Electron" +msgstr "" + +#: website/public/guides/index.html:237 +msgctxt "page:guides/index.html" +msgid "Follow a CSV export" +msgstr "" + +#: website/public/guides/index.html:238 +msgctxt "page:guides/index.html" +msgid "" +"A small Notes app spreads one feature across the renderer, preload and main process. " +"Use REA to connect the API, IPC channel and file writer." +msgstr "" + +#: website/public/guides/index.html:244 +msgctxt "page:guides/index.html" +msgid "Button" +msgstr "" + +#: website/public/guides/index.html:245 +msgctxt "page:guides/index.html" +msgid "Preload API" +msgstr "" + +#: website/public/guides/index.html:246 +msgctxt "page:guides/index.html" +msgid "IPC" +msgstr "" + +#: website/public/guides/index.html:246 +msgctxt "page:guides/index.html" +msgid "CSV file" +msgstr "" + +#: website/public/guides/index.html:248 +msgctxt "page:guides/index.html" +msgid "JavaScript & Electron guide" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/index.html:251 +#, python-brace-format +msgctxt "page:guides/index.html" +msgid "For a larger packaged app, follow {ph0}Notion's clipboard bridge{ph1}." +msgstr "" + +#: website/public/guides/index.html:258 +msgctxt "page:guides/index.html" +msgid "Browser behavior" +msgstr "" + +#: website/public/guides/index.html:260 +msgctxt "page:guides/index.html" +msgid "Observe a click" +msgstr "" + +#: website/public/guides/index.html:261 +msgctxt "page:guides/index.html" +msgid "" +"Open a working Notes example, capture an export request and find the code that turns " +"its response into a download." +msgstr "" + +#: website/public/guides/index.html:266 +msgctxt "page:guides/index.html" +msgid "Your click" +msgstr "" + +#: website/public/guides/index.html:267 +msgctxt "page:guides/index.html" +msgid "Captured request" +msgstr "" + +#: website/public/guides/index.html:268 +msgctxt "page:guides/index.html" +msgid "Export script" +msgstr "" + +#: website/public/guides/index.html:270 +msgctxt "page:guides/index.html" +msgid "Browser observation guide" +msgstr "" + +#: website/public/guides/index.html:6 +msgctxt "page:guides/index.html" +msgid "Reverse Engineering Guides — REA" +msgstr "" + +#: website/public/guides/index.html:7 +msgctxt "page:guides/index.html" +msgid "" +"Learn REA through short worked examples: a native calculation, an Electron CSV export " +"and a browser request." +msgstr "" + +#: website/public/guides/index.html:290 +msgctxt "page:guides/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/guides/javascript/index.html:109 +msgctxt "page:guides/javascript/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/guides/javascript/index.html:201 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0}Home{ph1} / {ph2}Guides{ph3} / JavaScript & Electron" +msgstr "" + +#. {ph0}:
+#: website/public/guides/javascript/index.html:205 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "Trace an Electron{ph0}CSV export." +msgstr "" + +#: website/public/guides/javascript/index.html:206 +msgctxt "page:guides/javascript/index.html" +msgid "" +"Follow a button click from the page API, through Electron IPC, to the CSV file writer." +msgstr "" + +#: website/public/guides/javascript/index.html:213 +msgctxt "page:guides/javascript/index.html" +msgid "In this guide" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/javascript/index.html:215 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0}The example{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/javascript/index.html:216 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0}Ask your agent{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/javascript/index.html:217 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0}Trace the export code{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/javascript/index.html:218 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0}Try the example{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/javascript/index.html:219 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0}Inspect the CSV writer{ph1}" +msgstr "" + +#: website/public/guides/javascript/index.html:224 +msgctxt "page:guides/javascript/index.html" +msgid "Where does “Export notes” go?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/javascript/index.html:225 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"This guide uses a small Electron app. Clicking {ph0}Export notes{ph1} calls an API in " +"the page, crosses into the main process, and writes a CSV. The behavior is spread " +"across several files." +msgstr "" + +#: website/public/guides/javascript/index.html:232 +msgctxt "page:guides/javascript/index.html" +msgid "The CSV export across Electron processes" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: notes.exportCsv() +#. {ph4}: +#. {ph5}: +#. {ph6}: renderer.js +#. {ph7}: preload.js +#. {ph8}: +#: website/public/guides/javascript/index.html:236 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"{ph0}Renderer → preload{ph1}{ph2}{ph3}{ph4}{ph5}{ph6} calls the API exposed by " +"{ph7}.{ph8}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: notes:export +#. {ph4}: +#. {ph5}: +#. {ph6}: +#: website/public/guides/javascript/index.html:244 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"{ph0}Between processes{ph1}{ph2}{ph3}{ph4}{ph5}The preload invokes an IPC channel: a " +"named message to the main process.{ph6}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: main.js +#. {ph6}: +#: website/public/guides/javascript/index.html:252 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"{ph0}Main process{ph1}{ph2}An export handler{ph3}{ph4}{ph5} handles that channel and " +"calls the CSV writer.{ph6}" +msgstr "" + +#. {ph0}: csv.js +#. {ph1}: main.js +#. {ph2}: downloads/notes.csv +#: website/public/guides/javascript/index.html:261 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0} formats the notes → {ph1} writes {ph2}." +msgstr "" + +#: website/public/guides/javascript/index.html:265 +msgctxt "page:guides/javascript/index.html" +msgid "" +"REA matches the literal IPC call to its handler and identifies the exposed API. The " +"path is inferred from code; a runtime capture can check what executes." +msgstr "" + +#: website/public/guides/javascript/index.html:273 +msgctxt "page:guides/javascript/index.html" +msgid "Ask about the CSV export" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/javascript/index.html:274 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0}Connect your agent to REA{ph1} and give it the app directory or ASAR file:" +msgstr "" + +#. {ph0}: +#: website/public/guides/javascript/index.html:280 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#: website/public/guides/javascript/index.html:284 +#: website/public/guides/javascript/index.html:433 +msgctxt "page:guides/javascript/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/guides/javascript/index.html:293 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to find what happens when I export notes in this app. Where is" +" the CSV created?{ph3}{ph4}{ph5}" +msgstr "" + +#. {ph0}: app.asar +#: website/public/guides/javascript/index.html:301 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "Example prompt. Include the absolute path to the application folder or {ph0}." +msgstr "" + +#: website/public/guides/javascript/index.html:305 +msgctxt "page:guides/javascript/index.html" +msgid "" +"REA reads the application files and builds a map of entrypoints, modules and process " +"boundaries. Your agent uses that map to narrow the investigation to the export " +"feature." +msgstr "" + +#: website/public/guides/javascript/index.html:312 +msgctxt "page:guides/javascript/index.html" +msgid "Trace the export code" +msgstr "" + +#: website/public/guides/javascript/index.html:313 +msgctxt "page:guides/javascript/index.html" +msgid "The page calls a small API" +msgstr "" + +#. {ph0}: renderer.js +#: website/public/guides/javascript/index.html:316 +#: website/public/guides/javascript/index.html:332 +#: website/public/guides/javascript/index.html:347 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0} · example source" +msgstr "" + +#: website/public/guides/javascript/index.html:326 +msgctxt "page:guides/javascript/index.html" +msgid "" +"The page knows the method name. The implementation lives in the preload, which exposes" +" it to the renderer." +msgstr "" + +#. {ph0}: notes.exportCsv +#. {ph1}: notes:export +#: website/public/guides/javascript/index.html:340 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"REA records {ph0} and the literal channel {ph1}. It pairs that invocation with the " +"single matching handler in the main process." +msgstr "" + +#. {ph0}: csv.js +#. {ph1}: notes.csv +#: website/public/guides/javascript/index.html:357 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"Reading the handler answers the original question: {ph0} formats the notes, and the " +"main process writes {ph1} into the user's Downloads folder." +msgstr "" + +#: website/public/guides/javascript/index.html:364 +msgctxt "page:guides/javascript/index.html" +msgid "REA result · summary.ipc excerpt" +msgstr "" + +#: website/public/guides/javascript/index.html:374 +msgctxt "page:guides/javascript/index.html" +msgid "" +"Recorded by REA 4.1.0 on the downloadable example below. Source locations accompany " +"the API, channel and handler findings." +msgstr "" + +#: website/public/guides/javascript/index.html:380 +msgctxt "page:guides/javascript/index.html" +msgid "Analyze the example yourself" +msgstr "" + +#. {ph0}: notes-example +#. {ph1}: Node.js +#: website/public/guides/javascript/index.html:381 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"Download the example and unzip it. The archive contains the complete {ph0} folder. " +"Analyze it with {ph1} and npm; Electron is not needed for this example." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/javascript/index.html:387 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "{ph0}Download example ZIP{ph1}" +msgstr "" + +#: website/public/guides/javascript/index.html:396 +msgctxt "page:guides/javascript/index.html" +msgid "Browse the six source files" +msgstr "" + +#: website/public/guides/javascript/index.html:432 +msgctxt "page:guides/javascript/index.html" +msgid "Static application analysis" +msgstr "" + +#. {ph0}: normalized_result.summary.ipc +#. {ph1}: normalized_result.graph +#: website/public/guides/javascript/index.html:445 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"Replace the path with the folder you unzipped. You should find one IPC channel and one" +" matching handler in {ph0}. Source locations are in {ph1}." +msgstr "" + +#: website/public/guides/javascript/index.html:451 +msgctxt "page:guides/javascript/index.html" +msgid "" +"For your own app, use the same command with its directory or ASAR path. An agent can " +"follow a literal string, API name or IPC channel with REA's feature tracing tools." +msgstr "" + +#: website/public/guides/javascript/index.html:458 +msgctxt "page:guides/javascript/index.html" +msgid "Inspect the CSV writer" +msgstr "" + +#. {ph0}: notes:export +#: website/public/guides/javascript/index.html:460 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"Follow {ph0} to its handler. Which inputs reach the CSV writer, and what happens if " +"writing the file fails?" +msgstr "" + +#: website/public/guides/javascript/index.html:466 +msgctxt "page:guides/javascript/index.html" +msgid "" +"Use the source locations to inspect those details. Computed channel names and " +"ambiguous handlers can remain unresolved; runtime observations give you another way to" +" investigate them." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/guides/javascript/index.html:472 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"{ph0}Follow Notion's clipboard bridge{ph1} {ph2}Apply the same approach to a packaged " +"Electron app.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/guides/javascript/index.html:478 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"{ph0}Observe a browser export{ph1}{ph2}Capture a real click and see which request it " +"makes.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/guides/javascript/index.html:484 +#, python-brace-format +msgctxt "page:guides/javascript/index.html" +msgid "" +"{ph0}Follow a native function{ph1}{ph2}Continue into a binary when a feature depends " +"on native code.{ph3}" +msgstr "" + +#: website/public/guides/javascript/index.html:6 +msgctxt "page:guides/javascript/index.html" +msgid "JavaScript and Electron Analysis — REA" +msgstr "" + +#: website/public/guides/javascript/index.html:7 +msgctxt "page:guides/javascript/index.html" +msgid "" +"Trace a Notes CSV export through a renderer API, preload and IPC handler with REA. " +"Includes downloadable example files and a verified analysis result." +msgstr "" + +#: website/public/guides/javascript/index.html:212 +msgctxt "page:guides/javascript/index.html" +msgid "On this page" +msgstr "" + +#: website/public/guides/javascript/index.html:222 +msgctxt "page:guides/javascript/index.html" +msgid "JavaScript & Electron" +msgstr "" + +#: website/public/guides/javascript/index.html:284 +msgctxt "page:guides/javascript/index.html" +msgid "Copy example prompt" +msgstr "" + +#: website/public/guides/javascript/index.html:433 +msgctxt "page:guides/javascript/index.html" +msgid "Copy static application analysis" +msgstr "" + +#: website/public/guides/javascript/index.html:511 +msgctxt "page:guides/javascript/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/guides/native/index.html:109 +msgctxt "page:guides/native/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/guides/native/index.html:201 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}Home{ph1} / {ph2}Guides{ph3} / Native analysis" +msgstr "" + +#. {ph0}:
+#: website/public/guides/native/index.html:204 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "Recover DX-Ball's{ph0}sound-pan calculation." +msgstr "" + +#: website/public/guides/native/index.html:205 +msgctxt "page:guides/native/index.html" +msgid "" +"Inspect the original instructions, identify the input and constants, then check the " +"recovered C." +msgstr "" + +#: website/public/guides/native/index.html:212 +msgctxt "page:guides/native/index.html" +msgid "In this guide" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:214 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}The example{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:215 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}Ask your agent{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:216 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}Read the REA results{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:217 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}Recover and check{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:218 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}Use your own binary{ph1}" +msgstr "" + +#: website/public/guides/native/index.html:223 +msgctxt "page:guides/native/index.html" +msgid "Calculate left/right sound panning" +msgstr "" + +#: website/public/guides/native/index.html:224 +msgctxt "page:guides/native/index.html" +msgid "" +"In DX-Ball, a brick hit supplies a horizontal screen position. The sound code turns it" +" into a left/right panning value." +msgstr "" + +#. {ph0}: 0x00406400 +#. {ph1}: __ftol() +#: website/public/guides/native/index.html:228 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"The starting function, {ph0}, has a short decompiler result: a call to {ph1}. REA also" +" returns its instructions and callers, which give the agent a way to investigate the " +"missing arithmetic." +msgstr "" + +#: website/public/guides/native/index.html:235 +msgctxt "page:guides/native/index.html" +msgid "New to these terms?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: MOV +#. {ph3}: ADD +#: website/public/guides/native/index.html:237 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}Instructions:{ph1} the steps the processor runs, shown in readable form such as " +"{ph2} or {ph3}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:242 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}Decompiler result / pseudocode:{ph1} an analysis tool's attempt to turn " +"instructions back into C-like code. It can miss parts, as in this example." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:247 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}Caller:{ph1} a function that calls this one. It shows which values are passed in." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: 0x00406400 +#: website/public/guides/native/index.html:251 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}Address:{ph1} a location in the program, written in hexadecimal, such as {ph2}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:255 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}Constants:{ph1} fixed numbers stored in the program, read as raw bytes and " +"decoded." +msgstr "" + +#: website/public/guides/native/index.html:262 +msgctxt "page:guides/native/index.html" +msgid "Three pieces of evidence, one calculation" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/guides/native/index.html:266 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}01 · Instructions{ph1}{ph2}An integer input{ph3}{ph4}A stack read supplies the " +"value used by the floating-point instructions.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: 20 + 30 × tile_x +#. {ph6}: +#: website/public/guides/native/index.html:274 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}02 · Caller{ph1}{ph2}A screen coordinate{ph3}{ph4}The brick-hit caller passes " +"{ph5}.{ph6}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: 1.5625 +#. {ph6}: 500.0 +#. {ph7}: +#: website/public/guides/native/index.html:282 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}03 · Data bytes{ph1}{ph2}The numeric constants{ph3}{ph4}Referenced bytes decode " +"to {ph5}, {ph6} and a scale value.{ph7}" +msgstr "" + +#: website/public/guides/native/index.html:294 +msgctxt "page:guides/native/index.html" +msgid "" +"REA supplies the instructions, call relationship and bytes. The agent interprets them " +"together." +msgstr "" + +#: website/public/guides/native/index.html:301 +msgctxt "page:guides/native/index.html" +msgid "Ask about the behavior" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/guides/native/index.html:302 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"After {ph0}connecting REA to your agent{ph1} and {ph2}setting up a native analysis " +"tool{ph3}, provide the local executable and a question:" +msgstr "" + +#: website/public/guides/native/index.html:313 +msgctxt "page:guides/native/index.html" +msgid "Which analysis tool should I use?" +msgstr "" + +#: website/public/guides/native/index.html:314 +msgctxt "page:guides/native/index.html" +msgid "REA needs one of these to read native programs:" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:316 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}Hopper{ph1} (macOS or Linux): REA's setup detects it or offers to install it. On " +"macOS, open Hopper once and choose demo mode or activate a license before your first " +"analysis." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:322 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}Ghidra{ph1} (macOS or Linux; experimental on Windows): free, but needs an " +"existing Ghidra 12.1.x installation and a 64-bit JDK 21 or newer." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:327 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}IDA{ph1} (Windows): for an existing IDA setup with an MCP registration." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:332 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "See {ph0}Set up native analysis{ph1} for the steps." +msgstr "" + +#. {ph0}: +#: website/public/guides/native/index.html:340 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#: website/public/guides/native/index.html:344 +#: website/public/guides/native/index.html:475 +msgctxt "page:guides/native/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/guides/native/index.html:353 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to find how DX-Ball calculates sound panning. Explain the " +"calculation and show the code.{ph3}{ph4}{ph5}" +msgstr "" + +#: website/public/guides/native/index.html:361 +msgctxt "page:guides/native/index.html" +msgid "" +"Example prompt. Give your agent the path to your local DX-Ball 1.07 executable. REA " +"doesn't include DX-Ball, so use your own copy, or ask the same kind of question about " +"another small Windows program you have." +msgstr "" + +#: website/public/guides/native/index.html:368 +msgctxt "page:guides/native/index.html" +msgid "How do I get a file's full path?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/guides/native/index.html:370 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}Windows:{ph1} in File Explorer, right-click the file and choose {ph2}Copy as " +"path{ph3}. On Windows 10, hold Shift while right-clicking." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/guides/native/index.html:375 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}macOS:{ph1} in Finder, right-click the file, hold Option and choose {ph2}Copy " +"\"…\" as Pathname{ph3}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:379 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}Any system:{ph1} drag the file into a terminal window and its path appears." +msgstr "" + +#: website/public/guides/native/index.html:387 +msgctxt "page:guides/native/index.html" +msgid "Read the REA results" +msgstr "" + +#: website/public/guides/native/index.html:388 +msgctxt "page:guides/native/index.html" +msgid "Read the input" +msgstr "" + +#: website/public/guides/native/index.html:391 +msgctxt "page:guides/native/index.html" +msgid "REA instruction excerpt · 0x406409" +msgstr "" + +#: website/public/guides/native/index.html:397 +msgctxt "page:guides/native/index.html" +msgid "" +"The instructions load an integer argument and convert it for floating-point " +"arithmetic. This is the input absent from the first pseudocode view." +msgstr "" + +#: website/public/guides/native/index.html:402 +msgctxt "page:guides/native/index.html" +msgid "Follow the caller" +msgstr "" + +#: website/public/guides/native/index.html:405 +msgctxt "page:guides/native/index.html" +msgid "REA caller excerpt · 0x411f5b" +msgstr "" + +#. {ph0}: 0x14 +#: website/public/guides/native/index.html:411 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"REA identifies the brick-hit caller. Its earlier instructions multiply the tile " +"coordinate by 30; adding {ph0} (20) gives the brick's screen position." +msgstr "" + +#: website/public/guides/native/index.html:416 +msgctxt "page:guides/native/index.html" +msgid "Read the referenced constants" +msgstr "" + +#: website/public/guides/native/index.html:419 +msgctxt "page:guides/native/index.html" +msgid "REA byte results · interpreted as little-endian doubles" +msgstr "" + +#: website/public/guides/native/index.html:427 +msgctxt "page:guides/native/index.html" +msgid "" +"The arithmetic references these addresses. Reading the bytes supplies the actual " +"values; the instruction order tells the agent how they are used." +msgstr "" + +#: website/public/guides/native/index.html:434 +msgctxt "page:guides/native/index.html" +msgid "Write and check the recovered function" +msgstr "" + +#: website/public/guides/native/index.html:436 +msgctxt "page:guides/native/index.html" +msgid "Recovered C · excerpt" +msgstr "" + +#: website/public/guides/native/index.html:443 +msgctxt "page:guides/native/index.html" +msgid "" +"With a scale of 1.0, screen positions 0, 320 and 640 map to −500, 0 and 500 before " +"integer conversion. The calculation puts the center of the screen at the center of the" +" stereo field." +msgstr "" + +#: website/public/guides/native/index.html:448 +msgctxt "page:guides/native/index.html" +msgid "" +"The agent used REA's findings to write the C. Separate checks compared 3,205 inputs " +"against the original x86 function and reproduced all 63 compiled bytes of the complete" +" function." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:453 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "{ph0}See the full investigation and assembly-to-C comparison{ph1}" +msgstr "" + +#: website/public/guides/native/index.html:460 +msgctxt "page:guides/native/index.html" +msgid "Try it with your own binary" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/guides/native/index.html:461 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"{ph0}Connect a native analysis provider{ph1}, then give your agent a local executable " +"or library and a feature to investigate. Useful starting questions include “How is " +"this file parsed?” or “Which function handles this menu action?”" +msgstr "" + +#: website/public/guides/native/index.html:468 +msgctxt "page:guides/native/index.html" +msgid "" +"If you already know a function name or address, you can query it from the terminal. " +"For a configured Ghidra installation:" +msgstr "" + +#: website/public/guides/native/index.html:474 +msgctxt "page:guides/native/index.html" +msgid "Function analysis" +msgstr "" + +#. {ph0}: main +#: website/public/guides/native/index.html:487 +#, python-brace-format +msgctxt "page:guides/native/index.html" +msgid "" +"Replace the target path and {ph0} with your own function name or address. Each CLI " +"invocation imports and analyzes the binary, then closes its session. Your agent's MCP " +"queries reuse the imported binary while that session is open." +msgstr "" + +#: website/public/guides/native/index.html:493 +msgctxt "page:guides/native/index.html" +msgid "" +"Read the pseudocode alongside instructions and references. When a result leaves a call" +" or value unresolved, use that location as the next question." +msgstr "" + +#: website/public/guides/native/index.html:6 +msgctxt "page:guides/native/index.html" +msgid "Native Binary Analysis — REA" +msgstr "" + +#: website/public/guides/native/index.html:7 +msgctxt "page:guides/native/index.html" +msgid "" +"Recover a native calculation with REA: inspect instructions, follow a caller, read " +"constants and check reconstructed C." +msgstr "" + +#: website/public/guides/native/index.html:211 +msgctxt "page:guides/native/index.html" +msgid "On this page" +msgstr "" + +#: website/public/guides/native/index.html:221 +msgctxt "page:guides/native/index.html" +msgid "Native analysis" +msgstr "" + +#: website/public/guides/native/index.html:344 +msgctxt "page:guides/native/index.html" +msgid "Copy example prompt" +msgstr "" + +#: website/public/guides/native/index.html:475 +msgctxt "page:guides/native/index.html" +msgid "Copy function analysis" +msgstr "" + +#: website/public/guides/native/index.html:517 +msgctxt "page:guides/native/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/index.html:111 +msgctxt "page:index.html" +msgid "Skip to content" +msgstr "" + +#: website/public/index.html:203 website/public/index.html:213 +#: website/public/index.html:211 +msgctxt "page:index.html" +msgid "On this page" +msgstr "" + +#: website/public/index.html:204 website/public/index.html:252 +msgctxt "page:index.html" +msgid "Set up REA" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:215 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Set up REA{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:216 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}How it works{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:217 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Dinosaur game{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:218 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Calculator{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:219 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Showcases{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:220 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Try REA{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:221 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Go deeper{ph1}" +msgstr "" + +#: website/public/index.html:230 +msgctxt "page:index.html" +msgid "Reverse engineering, with your coding agent" +msgstr "" + +#. {ph0}:
+#: website/public/index.html:231 +#, python-brace-format +msgctxt "page:index.html" +msgid "Find out how{ph0}software works." +msgstr "" + +#: website/public/index.html:232 +msgctxt "page:index.html" +msgid "" +"Ask your coding agent about an app, a game or a website. REA gives it the tools to " +"inspect the code behind the answer." +msgstr "" + +#: website/public/index.html:237 +msgctxt "page:index.html" +msgid "Get started" +msgstr "" + +#: website/public/index.html:238 +msgctxt "page:index.html" +msgid "See an example ↓" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:241 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Showcases →{ph1} — investigations and interactive demos." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:245 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Blog →{ph1} — methods and reconstruction notes." +msgstr "" + +#: website/public/index.html:253 +msgctxt "page:index.html" +msgid "Copy this into your coding agent:" +msgstr "" + +#. {ph0}: +#: website/public/index.html:256 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#: website/public/index.html:261 website/public/index.html:285 +#: website/public/index.html:521 website/public/index.html:602 +#: website/public/index.html:826 website/public/index.html:1138 +#: website/public/index.html:1166 +msgctxt "page:index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: npx rea-agents@latest setup +#. {ph4}: +#. {ph5}: +#: website/public/index.html:270 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}›{ph1}{ph2}Install REA and connect it to this coding agent using {ph3}. Show me " +"the setup plan for approval, then verify the installation.{ph4}{ph5}{ph6}" +msgstr "" + +#: website/public/index.html:282 +msgctxt "page:index.html" +msgid "Or run this in your terminal:" +msgstr "" + +#: website/public/index.html:294 +msgctxt "page:index.html" +msgid "Approve the setup plan, then restart your agent." +msgstr "" + +#: website/public/index.html:298 +msgctxt "page:index.html" +msgid "Setup for your platform:" +msgstr "" + +#. {ph0}: +#. {ph1}: curl +#. {ph2}: +#: website/public/index.html:309 +#, python-brace-format +msgctxt "page:index.html" +msgid "Other install options: {ph0}{ph1} →{ph2}" +msgstr "" + +#. {ph0}: Node.js +#. {ph1}: +#. {ph2}: +#: website/public/index.html:315 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"First time, or missing {ph0} or a coding agent? {ph1}Follow the step-by-step setup " +"guide →{ph2}" +msgstr "" + +#: website/public/index.html:328 +msgctxt "page:index.html" +msgid "How it works" +msgstr "" + +#: website/public/index.html:330 +msgctxt "page:index.html" +msgid "" +"Reverse engineering means learning how software works by inspecting the program " +"itself. With REA, your agent can follow the code, explain a feature and help you " +"rebuild it." +msgstr "" + +#: website/public/index.html:337 +msgctxt "page:index.html" +msgid "Ask about one feature" +msgstr "" + +#: website/public/index.html:338 +msgctxt "page:index.html" +msgid "Give your agent a program or page and a question." +msgstr "" + +#: website/public/index.html:341 +msgctxt "page:index.html" +msgid "Inspect the program" +msgstr "" + +#: website/public/index.html:342 +msgctxt "page:index.html" +msgid "REA returns code, references and runtime observations." +msgstr "" + +#: website/public/index.html:345 +msgctxt "page:index.html" +msgid "Explain it, then try a change" +msgstr "" + +#: website/public/index.html:346 +msgctxt "page:index.html" +msgid "Your agent uses the findings to explain or rebuild the feature." +msgstr "" + +#: website/public/index.html:352 +msgctxt "page:index.html" +msgid "See the full Calculator investigation" +msgstr "" + +#. {ph0}: 200 + 10% +#: website/public/index.html:353 +#, python-brace-format +msgctxt "page:index.html" +msgid "Why does Calculator give 220 for {ph0}?" +msgstr "" + +#: website/public/index.html:362 +msgctxt "page:index.html" +msgid "Follow the instructions step by step" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:370 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}01{ph1} Decode branches" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:378 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}02{ph1} Trace calls" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:386 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}03{ph1} Recover the rule" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#: website/public/index.html:397 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Original x64 · selected instructions{ph1} {ph2}{ph3}" +msgstr "" + +#: website/public/index.html:439 +msgctxt "page:index.html" +msgid "01 · Which branch?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:440 +#, python-brace-format +msgctxt "page:index.html" +msgid "“{ph0}0x5b? 0x5c?{ph1} Two jumps to the same place. Which operators are these?”" +msgstr "" + +#: website/public/index.html:444 +msgctxt "page:index.html" +msgid "Look up the command IDs, then label the branch." +msgstr "" + +#: website/public/index.html:450 +msgctxt "page:index.html" +msgid "Divide ÷" +msgstr "" + +#: website/public/index.html:454 +msgctxt "page:index.html" +msgid "Multiply ×" +msgstr "" + +#: website/public/index.html:459 +msgctxt "page:index.html" +msgid "02 · What do the calls do?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:460 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"“100 is clear. The calls are just addresses. {ph0}Which one divides? Which value goes " +"in?{ph1}”" +msgstr "" + +#: website/public/index.html:466 +msgctxt "page:index.html" +msgid "Inspect the helpers and trace the stored values." +msgstr "" + +#: website/public/index.html:476 +msgctxt "page:index.html" +msgid "Divide" +msgstr "" + +#: website/public/index.html:481 +msgctxt "page:index.html" +msgid "03 · What is the rule?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:482 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"“This path multiplies by the other input. So {ph0}10% means 10% of 200{ph1} after +.”" +msgstr "" + +#: website/public/index.html:486 +msgctxt "page:index.html" +msgid "Name the operands and check both operator paths." +msgstr "" + +#: website/public/index.html:502 website/public/index.html:429 +msgctxt "page:index.html" +msgid "Illustrative expert reasoning" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:505 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}You decode the instructions, follow the calls and reconstruct the " +"calculation.{ph1}" +msgstr "" + +#: website/public/index.html:513 +msgctxt "page:index.html" +msgid "Ask your agent the same question" +msgstr "" + +#. {ph0}: +#: website/public/index.html:516 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example prompt · Calculator" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: 200 + 10% +#. {ph4}: +#. {ph5}: +#: website/public/index.html:530 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to inspect Windows Calculator. Why does {ph3} give " +"220?{ph4}{ph5}{ph6}" +msgstr "" + +#: website/public/index.html:538 +msgctxt "page:index.html" +msgid "Example answer · based on the findings" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:541 +#, python-brace-format +msgctxt "page:index.html" +msgid "After +, the % button takes {ph0}a percentage of the first number.{ph1}" +msgstr "" + +#: website/public/index.html:554 +msgctxt "page:index.html" +msgid "REA supplies" +msgstr "" + +#: website/public/index.html:555 +msgctxt "page:index.html" +msgid "The handler’s instructions, decompiled code and calls." +msgstr "" + +#: website/public/index.html:560 +msgctxt "page:index.html" +msgid "Your agent explains" +msgstr "" + +#: website/public/index.html:561 +msgctxt "page:index.html" +msgid "Which branch applies, what it calculates and how to rebuild it." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:568 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"Selected assembly from the installed Calculator DLL. The thoughts and reply illustrate" +" the findings. {ph0}Continue with the Calculator example ↓{ph1}" +msgstr "" + +#: website/public/index.html:580 +msgctxt "page:index.html" +msgid "" +"Let’s try two examples: change a game’s speed, then rebuild Calculator’s % button." +msgstr "" + +#: website/public/index.html:585 +msgctxt "page:index.html" +msgid "Example 01 · Chrome’s dinosaur game" +msgstr "" + +#: website/public/index.html:586 +msgctxt "page:index.html" +msgid "Why does the dinosaur get faster?" +msgstr "" + +#: website/public/index.html:588 +msgctxt "page:index.html" +msgid "" +"The game gets faster as you run. To rebuild it with a speed control, we first need to " +"find out how the speed changes." +msgstr "" + +#: website/public/index.html:594 +msgctxt "page:index.html" +msgid "1. Ask about the speed" +msgstr "" + +#. {ph0}: +#: website/public/index.html:597 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example question · Dinosaur game" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/index.html:611 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to inspect this dinosaur game. Why does it get faster? Show " +"the speed rule, then build a small version with an adjustable speed.{ph3}{ph4}{ph5}" +msgstr "" + +#: website/public/index.html:620 +msgctxt "page:index.html" +msgid "2. Find the speed rule" +msgstr "" + +#: website/public/index.html:621 +msgctxt "page:index.html" +msgid "" +"REA lets the agent read the game’s running code. The speed starts at 6 and increases a" +" little each update while it is below 13." +msgstr "" + +#: website/public/index.html:628 +msgctxt "page:index.html" +msgid "3. Play the result" +msgstr "" + +#: website/public/index.html:629 +msgctxt "page:index.html" +msgid "" +"We rebuilt that rule in the mini-game below and added a speed slider. Press Play, then" +" choose your own speed." +msgstr "" + +#: website/public/index.html:665 +msgctxt "page:index.html" +msgid "Play" +msgstr "" + +#: website/public/index.html:668 +msgctxt "page:index.html" +msgid "Jump ↑" +msgstr "" + +#: website/public/index.html:669 +msgctxt "page:index.html" +msgid "Restart" +msgstr "" + +#: website/public/index.html:672 +msgctxt "page:index.html" +msgid "Speed" +msgstr "" + +#: website/public/index.html:682 +msgctxt "page:index.html" +msgid "Use the recovered acceleration rule" +msgstr "" + +#: website/public/index.html:686 +msgctxt "page:index.html" +msgid "Original rule: start at 6, then increase toward 13." +msgstr "" + +#: website/public/index.html:689 +msgctxt "page:index.html" +msgid "Move the slider to set your own speed. Space or Jump clears a cactus." +msgstr "" + +#: website/public/index.html:694 +msgctxt "page:index.html" +msgid "" +"Enable JavaScript to play. You can still read the rule and open the source code below." +msgstr "" + +#: website/public/index.html:700 +msgctxt "page:index.html" +msgid "Open the speed lab →" +msgstr "" + +#: website/public/index.html:706 +msgctxt "page:index.html" +msgid "See the script, checks and how to try the analysis" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:709 +#, python-brace-format +msgctxt "page:index.html" +msgid "Inspected target: {ph0}wayou’s Chromium-derived browser edition{ph1}." +msgstr "" + +#. {ph0}: index.js +#: website/public/index.html:717 +#, python-brace-format +msgctxt "page:index.html" +msgid "REA · loaded {ph0} · selected lines" +msgstr "" + +#: website/public/index.html:726 +msgctxt "page:index.html" +msgid "Start at 6. Add 0.001 each update without a collision, while speed is below 13." +msgstr "" + +#: website/public/index.html:731 +msgctxt "page:index.html" +msgid "What each part does" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/index.html:733 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}01 · REA{ph1}{ph2}Read the running game’s script{ph3}{ph4}Return its actual code " +"and settings to the agent.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/index.html:740 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}02 · Your agent{ph1}{ph2}Rebuild the rule, add a control{ph3}{ph4}Use the " +"recovered acceleration in a small game with a speed slider.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/index.html:748 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}03 · You{ph1}{ph2}Change the speed and play{ph3}{ph4}Try the original " +"acceleration, then choose your own pace.{ph5}" +msgstr "" + +#. {ph0}: index.js +#: website/public/index.html:758 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"REA inspected the HTTP browser edition through a local debugging connection and " +"returned the loaded {ph0}, including its source and digest." +msgstr "" + +#: website/public/index.html:765 +msgctxt "page:index.html" +msgid "Selected settings from the inspected script" +msgstr "" + +#: website/public/index.html:771 +msgctxt "page:index.html" +msgid "" +"We called the original game’s update function in a controlled browser check, with " +"obstacles and automatic scheduling disabled. After 4,000 updates, speed was 10.0; " +"after 10,000, it was 13.0, rounded to one decimal." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:777 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"The new mini-game keeps that speed rule. Its drawing, jumping and collision code are a" +" small teaching implementation. {ph0}Open the lab{ph1} to see the new code and run the" +" same speed check." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/index.html:783 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"To inspect the target yourself, follow the {ph0}browser connection steps{ph1} using " +"{ph2}the dinosaur page{ph3}. Give your agent that page URL and your local debugging " +"endpoint, then copy the prompt above." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/index.html:792 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Inspected speed code{ph1} · {ph2}Chromium Authors · BSD license{ph3}" +msgstr "" + +#: website/public/index.html:809 +msgctxt "page:index.html" +msgid "Example 02 · Windows Calculator" +msgstr "" + +#: website/public/index.html:810 +msgctxt "page:index.html" +msgid "Rebuild Calculator’s % button." +msgstr "" + +#: website/public/index.html:812 +msgctxt "page:index.html" +msgid "" +"The % button does different things after + and ×. Let’s find both rules and try them " +"in a small calculator." +msgstr "" + +#: website/public/index.html:818 +msgctxt "page:index.html" +msgid "1. Ask about the % button" +msgstr "" + +#. {ph0}: +#: website/public/index.html:821 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example question · Calculator" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/index.html:835 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to inspect Windows Calculator’s % button. Recover the rules " +"after + and ×, then build a small calculator that uses both.{ph3}{ph4}{ph5}" +msgstr "" + +#: website/public/index.html:844 +msgctxt "page:index.html" +msgid "2. Find both rules" +msgstr "" + +#: website/public/index.html:845 +msgctxt "page:index.html" +msgid "" +"REA helps the agent read the code behind the % button. It applies two different rules:" +msgstr "" + +#: website/public/index.html:851 +msgctxt "page:index.html" +msgid "With +" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: 10% of 200 = 20 → 200 + 20 = 220 +#: website/public/index.html:852 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Take 10% of the first number.{ph1}{ph2}" +msgstr "" + +#: website/public/index.html:858 +msgctxt "page:index.html" +msgid "With ×" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: 200 × 0.1 = 20 +#: website/public/index.html:859 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Turn 10% into 0.1.{ph1}{ph2}" +msgstr "" + +#: website/public/index.html:866 +msgctxt "page:index.html" +msgid "3. Try the % button" +msgstr "" + +#: website/public/index.html:867 +msgctxt "page:index.html" +msgid "We recreated both rules below. Choose + or ×, press %, then press =." +msgstr "" + +#: website/public/index.html:915 +msgctxt "page:index.html" +msgid "Reset" +msgstr "" + +#: website/public/index.html:923 +msgctxt "page:index.html" +msgid "10% of 200 = 20. Then 200 + 20 = 220." +msgstr "" + +#: website/public/index.html:926 +msgctxt "page:index.html" +msgid "Interactive illustration of the inspected percentage rule." +msgstr "" + +#: website/public/index.html:933 +msgctxt "page:index.html" +msgid "See the real code and how the answer was checked" +msgstr "" + +#. {ph0}: previous = 200 +#. {ph1}: current = 10 +#: website/public/index.html:934 +#, python-brace-format +msgctxt "page:index.html" +msgid "For this example, {ph0} and {ph1}." +msgstr "" + +#: website/public/index.html:940 +msgctxt "page:index.html" +msgid "Readable summary of the % handler" +msgstr "" + +#: website/public/index.html:949 +msgctxt "page:index.html" +msgid "From the installed app to a working % button" +msgstr "" + +#. {ph0}: +#. {ph1}: calc.exe +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#. {ph6}: ms-calculator: +#. {ph7}: +#: website/public/index.html:953 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}01 · REA reads {ph1}{ph2}{ph3}It launches the Calculator app{ph4}{ph5}The code " +"opens {ph6}. The agent then selects the installed app’s library.{ph7}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: 100 +#. {ph6}: +#: website/public/index.html:962 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}02 · REA reads the library{ph1}{ph2}Return the % handler’s code{ph3}{ph4}The " +"function checks the operator and uses the constant {ph5}.{ph6}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/index.html:970 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}03 · Your agent interprets it{ph1}{ph2}Explain and reproduce the " +"rules{ph3}{ph4}Crosscheck the branch with Microsoft’s source, then try + and × " +"above.{ph5}" +msgstr "" + +#: website/public/index.html:984 +msgctxt "page:index.html" +msgid "REA · selected original instructions" +msgstr "" + +#: website/public/index.html:995 +msgctxt "page:index.html" +msgid "Operator IDs · Microsoft’s source" +msgstr "" + +#: website/public/index.html:1005 +msgctxt "page:index.html" +msgid "" +"Inspected with REA 4.1.0: Windows Calculator 11.2508.4.0, x64. The readable summary " +"uses names from Microsoft’s public source to explain the recovered branch." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/index.html:1010 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}Percentage implementation{ph1} · {ph2}Microsoft’s test cases{ph3} · {ph4}Native " +"setup guide{ph5}" +msgstr "" + +#: website/public/index.html:1030 +msgctxt "page:index.html" +msgid "REA case studies." +msgstr "" + +#: website/public/index.html:1031 +msgctxt "page:index.html" +msgid "Explore a feature in a released app or game, with code and checked results." +msgstr "" + +#: website/public/index.html:1036 +msgctxt "page:index.html" +msgid "Showcases →" +msgstr "" + +#: website/public/index.html:1040 +msgctxt "page:index.html" +msgid "Android · APK analysis" +msgstr "" + +#: website/public/index.html:1041 +msgctxt "page:index.html" +msgid "How an authenticator generates a login code" +msgstr "" + +#: website/public/index.html:1042 +msgctxt "page:index.html" +msgid "" +"Trace Aegis's six-digit login code through its released APK, then move a demo clock to" +" see why it changes every 30 seconds." +msgstr "" + +#: website/public/index.html:1046 +msgctxt "page:index.html" +msgid "Read the Android case study" +msgstr "" + +#: website/public/index.html:1051 +msgctxt "page:index.html" +msgid "Electron · Feature tracing" +msgstr "" + +#: website/public/index.html:1052 +msgctxt "page:index.html" +msgid "How Notion copies text and HTML" +msgstr "" + +#: website/public/index.html:1053 +msgctxt "page:index.html" +msgid "" +"Follow Notion's packaged JavaScript to the system clipboard and see how a copy " +"preserves rich block data." +msgstr "" + +#: website/public/index.html:1057 +msgctxt "page:index.html" +msgid "Read the Notion case study" +msgstr "" + +#: website/public/index.html:1062 +msgctxt "page:index.html" +msgid "Native · Reconstruction" +msgstr "" + +#: website/public/index.html:1063 +msgctxt "page:index.html" +msgid "DX-Ball's sound-pan calculation" +msgstr "" + +#: website/public/index.html:1064 +msgctxt "page:index.html" +msgid "Recover how a ball's position becomes left/right sound in a 1996 Windows game." +msgstr "" + +#: website/public/index.html:1068 +msgctxt "page:index.html" +msgid "Read the DX-Ball case study" +msgstr "" + +#: website/public/index.html:1079 +msgctxt "page:index.html" +msgid "Your first investigation" +msgstr "" + +#: website/public/index.html:1080 +msgctxt "page:index.html" +msgid "Try REA on a small app." +msgstr "" + +#: website/public/index.html:1081 +msgctxt "page:index.html" +msgid "Download our Notes example, trace its CSV export, and check one changed input." +msgstr "" + +#: website/public/index.html:1086 +msgctxt "page:index.html" +msgid "Try the guided example" +msgstr "" + +#: website/public/index.html:1095 +msgctxt "page:index.html" +msgid "Choose your target." +msgstr "" + +#: website/public/index.html:1096 +msgctxt "page:index.html" +msgid "These guides cover setup and a first investigation for each kind of software." +msgstr "" + +#: website/public/index.html:1103 +msgctxt "page:index.html" +msgid "Native binaries" +msgstr "" + +#: website/public/index.html:1104 +msgctxt "page:index.html" +msgid "" +"Inspect functions, strings, references and call relationships in executables and " +"libraries." +msgstr "" + +#: website/public/index.html:1108 +msgctxt "page:index.html" +msgid "Native analysis guide" +msgstr "" + +#: website/public/index.html:1111 +msgctxt "page:index.html" +msgid "JavaScript & Electron" +msgstr "" + +#: website/public/index.html:1112 +msgctxt "page:index.html" +msgid "" +"Map modules, routes, IPC and native dependencies from an application folder or ASAR " +"archive." +msgstr "" + +#: website/public/index.html:1116 +msgctxt "page:index.html" +msgid "Application workflows" +msgstr "" + +#: website/public/index.html:1119 +msgctxt "page:index.html" +msgid "Browser & runtime activity" +msgstr "" + +#: website/public/index.html:1120 +msgctxt "page:index.html" +msgid "" +"Capture selected browser or process activity, then compare the results across runs." +msgstr "" + +#: website/public/index.html:1124 +msgctxt "page:index.html" +msgid "Browser observation guide" +msgstr "" + +#: website/public/index.html:1128 +msgctxt "page:index.html" +msgid "Try a larger project" +msgstr "" + +#. {ph0}: +#: website/public/index.html:1133 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example prompt · Website" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: https://rea.tools/ +#. {ph4}: +#. {ph5}: +#: website/public/index.html:1147 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to inspect {ph3}. Clone this website for me.{ph4}{ph5}{ph6}" +msgstr "" + +#: website/public/index.html:1156 +msgctxt "page:index.html" +msgid "Yes, this one." +msgstr "" + +#. {ph0}: +#: website/public/index.html:1161 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Example prompt · Game reconstruction" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/index.html:1175 +#, python-brace-format +msgctxt "page:index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to reconstruct this game from its executable. Recover the " +"gameplay logic in C and test it against the original.{ph3}{ph4}{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:1184 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}See the DX-Ball case study →{ph1}" +msgstr "" + +#: website/public/index.html:1195 +msgctxt "page:index.html" +msgid "Any questions?" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:1197 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Read the FAQ{ph1} — setup and common questions." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:1200 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}Join Discord{ph1} — get help and discuss your investigations." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/index.html:1204 +#, python-brace-format +msgctxt "page:index.html" +msgid "{ph0}GitHub issues{ph1} — report a bug or request a feature." +msgstr "" + +#: website/public/index.html:6 +msgctxt "page:index.html" +msgid "REA — Reverse Engineering for Your Coding Agent" +msgstr "" + +#: website/public/index.html:7 +msgctxt "page:index.html" +msgid "" +"Reverse engineer apps, binaries and browser behavior with your coding agent. Follow " +"clear guides and try interactive examples with REA." +msgstr "" + +#: website/public/index.html:261 +msgctxt "page:index.html" +msgid "Copy REA installation prompt" +msgstr "" + +#: website/public/index.html:285 +msgctxt "page:index.html" +msgid "Copy setup command" +msgstr "" + +#: website/public/index.html:297 +msgctxt "page:index.html" +msgid "Setup options" +msgstr "" + +#: website/public/index.html:365 +msgctxt "page:index.html" +msgid "Follow the manual Calculator analysis" +msgstr "" + +#: website/public/index.html:521 +msgctxt "page:index.html" +msgid "Copy Calculator percentage question" +msgstr "" + +#: website/public/index.html:602 +msgctxt "page:index.html" +msgid "Copy dinosaur analysis prompt" +msgstr "" + +#: website/public/index.html:655 +msgctxt "page:index.html" +msgid "" +"Dinosaur mini-game. Use the Jump button or press Space while the game is focused." +msgstr "" + +#: website/public/index.html:826 +msgctxt "page:index.html" +msgid "Copy Calculator analysis prompt" +msgstr "" + +#: website/public/index.html:872 +msgctxt "page:index.html" +msgid "Choose the calculation" +msgstr "" + +#: website/public/index.html:1138 +msgctxt "page:index.html" +msgid "Copy website project prompt" +msgstr "" + +#: website/public/index.html:1166 +msgctxt "page:index.html" +msgid "Copy game reconstruction prompt" +msgstr "" + +#: website/public/index.html:1230 +msgctxt "page:index.html" +msgid "Back to top" +msgstr "" + +#: website/public/showcase/aegis/index.html:110 +msgctxt "page:showcase/aegis/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/aegis/index.html:202 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / Android" +msgstr "" + +#: website/public/showcase/aegis/index.html:205 +msgctxt "page:showcase/aegis/index.html" +msgid "Case study · Aegis Authenticator" +msgstr "" + +#. {ph0}:
+#: website/public/showcase/aegis/index.html:206 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "How does an authenticator{ph0}generate a login code?" +msgstr "" + +#: website/public/showcase/aegis/index.html:207 +msgctxt "page:showcase/aegis/index.html" +msgid "" +"A six-digit code changes every 30 seconds. Use REA to find the calculation in an " +"Android APK, then rebuild it with a clock you can control." +msgstr "" + +#: website/public/showcase/aegis/index.html:212 +msgctxt "page:showcase/aegis/index.html" +msgid "Aegis 3.4.3 · Android · Official release APK · 6.9 MB" +msgstr "" + +#: website/public/showcase/aegis/index.html:215 +msgctxt "page:showcase/aegis/index.html" +msgid "View Aegis on GitHub" +msgstr "" + +#: website/public/showcase/aegis/index.html:221 +msgctxt "page:showcase/aegis/index.html" +msgid "From an APK to a code you can reproduce" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/aegis/index.html:223 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0}01 · Locate the feature{ph1}{ph2}3,077 classes → generating methods{ph3}{ph4}REA " +"searches the package and traces the code used by the display and copy actions.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/aegis/index.html:232 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0}02 · Read the calculation{ph1}{ph2}Time + account key → six digits{ph3}{ph4}REA " +"returns the methods and defaults. The agent explains how they fit together.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/aegis/index.html:240 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0}03 · Rebuild and check{ph1}{ph2}Change the clock. Watch the code.{ph3}{ph4}A new " +"browser demo reproduces the rule and checks it against public reference cases.{ph5}" +msgstr "" + +#: website/public/showcase/aegis/index.html:253 +msgctxt "page:showcase/aegis/index.html" +msgid "In this case study" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:255 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}Ask your agent{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:256 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}Try the code generator{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:257 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}Find the code with REA{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:258 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}Read the calculation{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:259 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}Check the reconstruction{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:260 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}Inspect the APK yourself{ph1}" +msgstr "" + +#: website/public/showcase/aegis/index.html:265 +msgctxt "page:showcase/aegis/index.html" +msgid "Ask your agent" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:266 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"The app shows a changing login code. We want to find {ph0}what makes it change{ph1} " +"and reproduce that behavior." +msgstr "" + +#. {ph0}: +#: website/public/showcase/aegis/index.html:272 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#: website/public/showcase/aegis/index.html:276 +#: website/public/showcase/aegis/index.html:739 +msgctxt "page:showcase/aegis/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: aegis-v3.4.3.apk +#. {ph4}: +#. {ph5}: +#: website/public/showcase/aegis/index.html:285 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to inspect {ph3}. Find how it generates the six-digit login " +"code, explain why it changes every 30 seconds, and rebuild a small demo where I can " +"change the time.{ph4}{ph5}{ph6}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:296 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"An example prompt for the downloaded APK, with REA's Android analysis configured. " +"{ph0}Get the APK and analysis setup ↓{ph1}" +msgstr "" + +#: website/public/showcase/aegis/index.html:304 +msgctxt "page:showcase/aegis/index.html" +msgid "Try the code generator" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:305 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"The app groups time into {ph0}30-second blocks.{ph1} It combines the block number with" +" the account key to generate a code. The same key and block produce the same code." +msgstr "" + +#: website/public/showcase/aegis/index.html:312 +msgctxt "page:showcase/aegis/index.html" +msgid "Move the clock across 60 seconds" +msgstr "" + +#: website/public/showcase/aegis/index.html:315 +msgctxt "page:showcase/aegis/index.html" +msgid "Time" +msgstr "" + +#: website/public/showcase/aegis/index.html:317 +msgctxt "page:showcase/aegis/index.html" +msgid "seconds" +msgstr "" + +#: website/public/showcase/aegis/index.html:318 +msgctxt "page:showcase/aegis/index.html" +msgid "Our adjustable example clock" +msgstr "" + +#: website/public/showcase/aegis/index.html:321 +msgctxt "page:showcase/aegis/index.html" +msgid "30-second block" +msgstr "" + +#: website/public/showcase/aegis/index.html:323 +#: website/public/showcase/aegis/index.html:650 +msgctxt "page:showcase/aegis/index.html" +msgid "Block" +msgstr "" + +#. {ph0}: floor(59 / 30) +#. {ph1}:
+#. {ph2}: +#. {ph3}: +#: website/public/showcase/aegis/index.html:324 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}{ph1}{ph2}30–59 seconds{ph3}" +msgstr "" + +#: website/public/showcase/aegis/index.html:332 +msgctxt "page:showcase/aegis/index.html" +msgid "Generated code" +msgstr "" + +#: website/public/showcase/aegis/index.html:340 +msgctxt "page:showcase/aegis/index.html" +msgid "Account key + block → six digits" +msgstr "" + +#: website/public/showcase/aegis/index.html:346 +msgctxt "page:showcase/aegis/index.html" +msgid "Example time, in seconds" +msgstr "" + +#: website/public/showcase/aegis/index.html:361 +#: website/public/showcase/aegis/index.html:661 +msgctxt "page:showcase/aegis/index.html" +msgid "59 seconds" +msgstr "" + +#: website/public/showcase/aegis/index.html:368 +#: website/public/showcase/aegis/index.html:666 +msgctxt "page:showcase/aegis/index.html" +msgid "60 seconds" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/aegis/index.html:377 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"At 59 seconds: {ph0}287082.{ph1} At 60 seconds: {ph2}359152.{ph3} Moving within one " +"block leaves the code unchanged." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:384 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"The key is fixed, public {ph0}RFC 6238 test data{ph1}. The demo implements the " +"calculation recovered from the APK." +msgstr "" + +#: website/public/showcase/aegis/index.html:391 +msgctxt "page:showcase/aegis/index.html" +msgid "" +"The diagram shows the result at 59 seconds. Enable JavaScript to change the clock." +msgstr "" + +#: website/public/showcase/aegis/index.html:400 +msgctxt "page:showcase/aegis/index.html" +msgid "Find the code with REA" +msgstr "" + +#: website/public/showcase/aegis/index.html:403 +msgctxt "page:showcase/aegis/index.html" +msgid "Narrow the APK to three classes" +msgstr "" + +#: website/public/showcase/aegis/index.html:406 +#: website/public/showcase/aegis/index.html:438 +msgctxt "page:showcase/aegis/index.html" +msgid "Agent → REA" +msgstr "" + +#: website/public/showcase/aegis/index.html:416 +msgctxt "page:showcase/aegis/index.html" +msgid "REA → agent · selected results" +msgstr "" + +#. {ph0}: TotpInfo +#: website/public/showcase/aegis/index.html:428 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0} is the calculation candidate; the other two concern the progress bar and " +"imported accounts. TOTP means a time-based one-time password." +msgstr "" + +#: website/public/showcase/aegis/index.html:435 +msgctxt "page:showcase/aegis/index.html" +msgid "Connect the generator to the app's display" +msgstr "" + +#: website/public/showcase/aegis/index.html:452 +msgctxt "page:showcase/aegis/index.html" +msgid "REA → agent · methods and callers" +msgstr "" + +#. {ph0}: EntryHolder.getOtp +#. {ph1}: TotpInfo.getOtp(timestamp) +#: website/public/showcase/aegis/index.html:463 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"REA identifies the timestamp overload and finds the base method's callers. Inspecting " +"{ph0} then shows the display calling {ph1}." +msgstr "" + +#. {ph0}: com.beemdevelopment.aegis +#: website/public/showcase/aegis/index.html:471 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"Requests show a shortened input path. Result class names omit the common {ph0} prefix." +msgstr "" + +#: website/public/showcase/aegis/index.html:478 +msgctxt "page:showcase/aegis/index.html" +msgid "Read the calculation" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:479 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"REA returns {ph0}the clock conversion, default settings and generating methods.{ph1} " +"The constructors set a 30-second interval and six digits; the timestamp method turns " +"seconds into a block number." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:494 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}01{ph1} Time block" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:502 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}02{ph1} Key + block" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:510 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}03{ph1} Six digits" +msgstr "" + +#: website/public/showcase/aegis/index.html:522 +msgctxt "page:showcase/aegis/index.html" +msgid "REA · selected decompiled Java" +msgstr "" + +#: website/public/showcase/aegis/index.html:552 +msgctxt "page:showcase/aegis/index.html" +msgid "Readable summary · agent's interpretation" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:569 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0}Time chooses the block.{ph1} Seconds 30 through 59 all give block 1. At 60 " +"seconds, the block becomes 2." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:575 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0}The key matters too.{ph1} The generator combines the account key with the block. " +"An account with a different key can show a different code at the same time." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:582 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0}Keep six digits.{ph1} The remainder after division by 1,000,000 is padded with " +"zeroes when needed, so a code can begin with 0." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:589 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"Excerpts from several inspected methods, with line wrapping for display. The right " +"panel is an explanatory summary. {ph0}Aegis code is GPL-3.0.{ph1}" +msgstr "" + +#: website/public/showcase/aegis/index.html:598 +msgctxt "page:showcase/aegis/index.html" +msgid "Inside the generator" +msgstr "" + +#. {ph0}: generateOTP +#. {ph1}: kotlin.ExceptionsKt +#. {ph2}: TotpInfo +#. {ph3}: HOTP +#: website/public/showcase/aegis/index.html:599 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"The released APK puts {ph0} in {ph1}. REA follows the call from {ph2} and returns this" +" body; the original source calls the helper {ph3}." +msgstr "" + +#: website/public/showcase/aegis/index.html:607 +msgctxt "page:showcase/aegis/index.html" +msgid "REA · generateOTP, complete body" +msgstr "" + +#: website/public/showcase/aegis/index.html:621 +msgctxt "page:showcase/aegis/index.html" +msgid "" +"The last hash byte selects a position. Four bytes at that position provide a positive " +"31-bit number; formatting reduces it to the requested number of digits. The " +"constructor's last argument selects the code-formatting branch introduced by " +"compilation." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:628 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}Compare with the matching release source{ph1}." +msgstr "" + +#: website/public/showcase/aegis/index.html:638 +msgctxt "page:showcase/aegis/index.html" +msgid "Check the reconstruction" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:639 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"We assembled the selected REA-returned Java methods in a small test program. Their " +"output matched an independent reconstruction on {ph0}133 test cases{ph1}, including " +"time-block boundaries and codes beginning with zero." +msgstr "" + +#: website/public/showcase/aegis/index.html:649 +msgctxt "page:showcase/aegis/index.html" +msgid "Example time" +msgstr "" + +#: website/public/showcase/aegis/index.html:651 +msgctxt "page:showcase/aegis/index.html" +msgid "Six-digit code" +msgstr "" + +#: website/public/showcase/aegis/index.html:656 +msgctxt "page:showcase/aegis/index.html" +msgid "30 seconds" +msgstr "" + +#: website/public/showcase/aegis/index.html:671 +msgctxt "page:showcase/aegis/index.html" +msgid "1,111,111,109 seconds" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:678 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"The generator also matches the six published SHA-1 reference cases in {ph0}RFC " +"6238{ph1}. Check the browser implementation against them:" +msgstr "" + +#: website/public/showcase/aegis/index.html:686 +msgctxt "page:showcase/aegis/index.html" +msgid "Run reference checks" +msgstr "" + +#: website/public/showcase/aegis/index.html:693 +msgctxt "page:showcase/aegis/index.html" +msgid "Read the demo's calculation" +msgstr "" + +#: website/public/showcase/aegis/index.html:697 +msgctxt "page:showcase/aegis/index.html" +msgid "" +"The reference cases use eight digits. The check also verifies their six-digit results." +msgstr "" + +#: website/public/showcase/aegis/index.html:706 +msgctxt "page:showcase/aegis/index.html" +msgid "" +"Verification runs extracted Java methods and the new demo. The Android APK was " +"inspected statically." +msgstr "" + +#: website/public/showcase/aegis/index.html:713 +msgctxt "page:showcase/aegis/index.html" +msgid "Inspect the APK yourself" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:714 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0}Set up REA{ph1} on macOS or Linux, then download these two files into the same " +"folder. On Windows, use a Linux environment such as WSL." +msgstr "" + +#. {ph0}: JAVA_HOME +#. {ph1}: PATH +#: website/public/showcase/aegis/index.html:719 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"Android analysis needs a full JDK 17 or later. Select it with {ph0} or {ph1}. This " +"case used JDK 21." +msgstr "" + +#: website/public/showcase/aegis/index.html:725 +msgctxt "page:showcase/aegis/index.html" +msgid "Download Aegis APK" +msgstr "" + +#: website/public/showcase/aegis/index.html:729 +msgctxt "page:showcase/aegis/index.html" +msgid "Download Android analysis provider" +msgstr "" + +#: website/public/showcase/aegis/index.html:735 +msgctxt "page:showcase/aegis/index.html" +msgid "Point REA at the provider file and inspect the APK:" +msgstr "" + +#: website/public/showcase/aegis/index.html:738 +msgctxt "page:showcase/aegis/index.html" +msgid "macOS / Linux" +msgstr "" + +#. {ph0}: REA_JADX_MCP_JAR +#: website/public/showcase/aegis/index.html:752 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"Your agent can continue through REA's CLI using the prompt above. For MCP, add {ph0} " +"to the REA server's environment and reconnect it." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/aegis/index.html:757 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"A next question: {ph0}what happens when an account uses eight digits or a different " +"time interval?{ph1}" +msgstr "" + +#: website/public/showcase/aegis/index.html:767 +msgctxt "page:showcase/aegis/index.html" +msgid "Sources" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/aegis/index.html:769 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "" +"{ph0}Official Aegis 3.4.3 release{ph1} · {ph2}Matching source commit{ph3} · " +"{ph4}GPL-3.0 license{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/aegis/index.html:785 +#, python-brace-format +msgctxt "page:showcase/aegis/index.html" +msgid "{ph0}RFC 6238 reference cases{ph1} · {ph2}Demo test data{ph3}" +msgstr "" + +#: website/public/showcase/aegis/index.html:792 +msgctxt "page:showcase/aegis/index.html" +msgid "" +"Inspected with REA 6.1.0 on 9 October 2026. Decompiled excerpts are credited to Aegis;" +" the diagram, readable summary and browser reconstruction are new teaching material." +msgstr "" + +#: website/public/showcase/aegis/index.html:6 +msgctxt "page:showcase/aegis/index.html" +msgid "Aegis APK Reverse Engineering: Login Codes — REA" +msgstr "" + +#: website/public/showcase/aegis/index.html:7 +msgctxt "page:showcase/aegis/index.html" +msgid "" +"Inspect the Aegis Android APK with REA, recover its six-digit login-code calculation " +"and try a reconstruction with an adjustable clock." +msgstr "" + +#: website/public/showcase/aegis/index.html:252 +msgctxt "page:showcase/aegis/index.html" +msgid "On this page" +msgstr "" + +#: website/public/showcase/aegis/index.html:263 +msgctxt "page:showcase/aegis/index.html" +msgid "Aegis APK case study" +msgstr "" + +#: website/public/showcase/aegis/index.html:276 +msgctxt "page:showcase/aegis/index.html" +msgid "Copy Aegis example prompt" +msgstr "" + +#: website/public/showcase/aegis/index.html:489 +msgctxt "page:showcase/aegis/index.html" +msgid "Follow the login-code calculation" +msgstr "" + +#: website/public/showcase/aegis/index.html:739 +msgctxt "page:showcase/aegis/index.html" +msgid "Copy APK inspection command" +msgstr "" + +#: website/public/showcase/aegis/index.html:816 +msgctxt "page:showcase/aegis/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/showcase/ctf/index.html:109 +msgctxt "page:showcase/ctf/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/ctf/index.html:201 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / CTF" +msgstr "" + +#: website/public/showcase/ctf/index.html:204 +msgctxt "page:showcase/ctf/index.html" +msgid "Case study · DownUnderCTF 2023" +msgstr "" + +#. {ph0}:
+#: website/public/showcase/ctf/index.html:205 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "Find the flag in{ph0}a CTF binary." +msgstr "" + +#. {ph0}: Correct! +#: website/public/showcase/ctf/index.html:206 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"Use REA to inspect a small flag checker, turn its rules into equations and find an " +"input that makes the original program print {ph0}." +msgstr "" + +#: website/public/showcase/ctf/index.html:211 +msgctxt "page:showcase/ctf/index.html" +msgid "masked squares flag checker · Easy · Linux x86-64" +msgstr "" + +#: website/public/showcase/ctf/index.html:214 +msgctxt "page:showcase/ctf/index.html" +msgid "View the original challenge" +msgstr "" + +#: website/public/showcase/ctf/index.html:222 +msgctxt "page:showcase/ctf/index.html" +msgid "From a binary to a checked answer" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/ctf/index.html:224 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"{ph0}01 · Find the check{ph1}{ph2}Strings → checking functions{ph3}{ph4}REA finds the " +"prompt, its references and the code that accepts or rejects an input.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/ctf/index.html:232 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"{ph0}02 · Extract the rules{ph1}{ph2}36 characters · 26 sums{ph3}{ph4}REA returns the " +"instructions and data behind each check. The agent turns them into equations.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/ctf/index.html:240 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"{ph0}03 · Solve and run{ph1}{ph2}Recovered flag → Correct!{ph3}{ph4}A Python script " +"solves the equations. REA captures the original program accepting the result.{ph5}" +msgstr "" + +#: website/public/showcase/ctf/index.html:249 +msgctxt "page:showcase/ctf/index.html" +msgid "The challenge is by joseph, published in DownUnderCTF's official repository." +msgstr "" + +#: website/public/showcase/ctf/index.html:257 +msgctxt "page:showcase/ctf/index.html" +msgid "In this case study" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:259 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}Find the checking code{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:260 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}Read one mask{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:261 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}Assembly to readable code{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:262 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}Solve the equations{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:263 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}Check the answer{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:264 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}Try it yourself{ph1}" +msgstr "" + +#: website/public/showcase/ctf/index.html:269 +msgctxt "page:showcase/ctf/index.html" +msgid "Find the checking code" +msgstr "" + +#. {ph0}: Correct! +#. {ph1}: Incorrect! +#: website/public/showcase/ctf/index.html:270 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The handout is a 15 KB executable. It asks for a flag, then prints {ph0} or {ph1}. " +"Start with a simple request to your agent." +msgstr "" + +#. {ph0}: +#: website/public/showcase/ctf/index.html:277 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#: website/public/showcase/ctf/index.html:282 website/public/showcase/ctf/index.html:501 +#: website/public/showcase/ctf/index.html:525 website/public/showcase/ctf/index.html:595 +#: website/public/showcase/ctf/index.html:742 +msgctxt "page:showcase/ctf/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/showcase/ctf/index.html:291 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to analyze ms_flag_checker and find the flag. Explain how the " +"checks work, then verify the answer with the original program.{ph3}{ph4}{ph5}" +msgstr "" + +#: website/public/showcase/ctf/index.html:300 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"An example prompt, with the downloaded challenge available locally and a native " +"analysis provider connected." +msgstr "" + +#: website/public/showcase/ctf/index.html:306 +msgctxt "page:showcase/ctf/index.html" +msgid "Follow the input prompt to its function" +msgstr "" + +#: website/public/showcase/ctf/index.html:309 website/public/showcase/ctf/index.html:345 +msgctxt "page:showcase/ctf/index.html" +msgid "Agent → REA" +msgstr "" + +#: website/public/showcase/ctf/index.html:325 +msgctxt "page:showcase/ctf/index.html" +msgid "REA → agent · selected results" +msgstr "" + +#: website/public/showcase/ctf/index.html:335 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The reference gives the agent a place to investigate, even though the executable's " +"original function names have been removed." +msgstr "" + +#: website/public/showcase/ctf/index.html:342 +msgctxt "page:showcase/ctf/index.html" +msgid "Read the checker and its two helpers" +msgstr "" + +#: website/public/showcase/ctf/index.html:357 +msgctxt "page:showcase/ctf/index.html" +msgid "REA → agent · selected instructions" +msgstr "" + +#. {ph0}: 0x18 +#. {ph1}: 0x270 +#: website/public/showcase/ctf/index.html:370 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The first loop copies 36 character codes. The checking loop decodes a mask, sums the " +"selected codes and compares the result with a stored number. Its {ph0}-byte steps " +"across {ph1} bytes give 26 masks." +msgstr "" + +#: website/public/showcase/ctf/index.html:378 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"These are selected results from a fresh REA analysis. The local target path is " +"shortened for display; addresses refer to REA's imported image." +msgstr "" + +#: website/public/showcase/ctf/index.html:386 +msgctxt "page:showcase/ctf/index.html" +msgid "One check reveals one character" +msgstr "" + +#: website/public/showcase/ctf/index.html:387 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The checker arranges the input in a 6×6 grid. A mask chooses which cells contribute to" +" a sum. Its compact encoding uses negative numbers to skip cells and positive numbers " +"to select them." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:407 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "The seventh check selects just one position. {ph0}Open figure{ph1}." +msgstr "" + +#: website/public/showcase/ctf/index.html:414 +msgctxt "page:showcase/ctf/index.html" +msgid "Read the mask and its target from the binary" +msgstr "" + +#: website/public/showcase/ctf/index.html:420 +msgctxt "page:showcase/ctf/index.html" +msgid "Agent → REA · read_bytes" +msgstr "" + +#: website/public/showcase/ctf/index.html:427 +msgctxt "page:showcase/ctf/index.html" +msgid "REA → agent · seventh entries" +msgstr "" + +#. {ph0}: MOVSX +#. {ph1}: eb +#. {ph2}: code[21] = 55 +#. {ph3}: 7 +#: website/public/showcase/ctf/index.html:436 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The instruction {ph0} reads mask bytes as signed values. This is why {ph1} means −21. " +"The target is a little-endian integer. Together, these bytes tell the agent that " +"{ph2}, so that character is {ph3}." +msgstr "" + +#: website/public/showcase/ctf/index.html:445 +msgctxt "page:showcase/ctf/index.html" +msgid "From instructions to a readable check" +msgstr "" + +#: website/public/showcase/ctf/index.html:446 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"Select a step to connect the summing helper and its caller to the same rule in C." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:456 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}01{ph1} Start" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:464 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}02{ph1} Select" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:472 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}03{ph1} Add" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:480 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}04{ph1} Advance" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:488 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}05{ph1} Compare" +msgstr "" + +#: website/public/showcase/ctf/index.html:500 +msgctxt "page:showcase/ctf/index.html" +msgid "REA · selected original instructions" +msgstr "" + +#: website/public/showcase/ctf/index.html:524 +msgctxt "page:showcase/ctf/index.html" +msgid "Readable C · one-check summary" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: ECX +#: website/public/showcase/ctf/index.html:553 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "{ph0}01 · Start at zero.{ph1} {ph2} holds the running sum." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:557 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"{ph0}02 · Check the mask cell.{ph1} A zero value skips the character; a nonzero value " +"includes it." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:561 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"{ph0}03 · Add a character code.{ph1} The input's integer at the same offset is added " +"to the sum." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/ctf/index.html:565 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"{ph0}04 · Move to the next cell.{ph1} The original loop advances four bytes per " +"integer and visits six rows of six cells." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: EAX +#. {ph3}: Incorrect! +#: website/public/showcase/ctf/index.html:570 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"{ph0}05 · Compare with the stored target.{ph1} The caller receives the sum in {ph2}. A" +" mismatch jumps to {ph3}." +msgstr "" + +#: website/public/showcase/ctf/index.html:577 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The instructions come from the summing helper and its caller. The C is an explanatory " +"summary with descriptive names and a flattened 36-cell loop." +msgstr "" + +#: website/public/showcase/ctf/index.html:585 +msgctxt "page:showcase/ctf/index.html" +msgid "Solve the 26 equations" +msgstr "" + +#: website/public/showcase/ctf/index.html:586 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"Most masks select several cells. For example, the first check adds 16 character codes " +"and requires a total of 1441. The overlapping selections give equations that a small " +"Python script can solve together." +msgstr "" + +#: website/public/showcase/ctf/index.html:594 +msgctxt "page:showcase/ctf/index.html" +msgid "Python · solver excerpt" +msgstr "" + +#. {ph0}: DUCTF{…} +#: website/public/showcase/ctf/index.html:622 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"Z3 is a solver that finds values satisfying these equations. This excerpt uses the " +"extracted checks and assumes a {ph0} flag with letters, digits, underscores and " +"braces. The complete download includes all 26 masks and targets." +msgstr "" + +#: website/public/showcase/ctf/index.html:628 +msgctxt "page:showcase/ctf/index.html" +msgid "Download the complete solver" +msgstr "" + +#: website/public/showcase/ctf/index.html:634 +msgctxt "page:showcase/ctf/index.html" +msgid "Check the answer with the original program" +msgstr "" + +#. {ph0}: z +#. {ph1}: y +#: website/public/showcase/ctf/index.html:635 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"REA's process capture records the original executable accepting the solved flag. " +"Changing one selected character from {ph0} to {ph1} makes the first sum 1440 instead " +"of 1441, and the program rejects it." +msgstr "" + +#: website/public/showcase/ctf/index.html:645 +msgctxt "page:showcase/ctf/index.html" +msgid "Input" +msgstr "" + +#: website/public/showcase/ctf/index.html:646 +msgctxt "page:showcase/ctf/index.html" +msgid "Observed output" +msgstr "" + +#: website/public/showcase/ctf/index.html:647 +msgctxt "page:showcase/ctf/index.html" +msgid "Exit code" +msgstr "" + +#: website/public/showcase/ctf/index.html:652 +msgctxt "page:showcase/ctf/index.html" +msgid "Solver's flag" +msgstr "" + +#: website/public/showcase/ctf/index.html:657 +msgctxt "page:showcase/ctf/index.html" +msgid "One character changed" +msgstr "" + +#: website/public/showcase/ctf/index.html:665 +msgctxt "page:showcase/ctf/index.html" +msgid "Show the recovered flag and captured output" +msgstr "" + +#: website/public/showcase/ctf/index.html:668 +msgctxt "page:showcase/ctf/index.html" +msgid "REA · original program output" +msgstr "" + +#: website/public/showcase/ctf/index.html:669 +msgctxt "page:showcase/ctf/index.html" +msgid "Copy flag" +msgstr "" + +#: website/public/showcase/ctf/index.html:681 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The recovered value also matches the flag in the organizers' published challenge " +"metadata, checked after solving the binary." +msgstr "" + +#: website/public/showcase/ctf/index.html:687 +msgctxt "page:showcase/ctf/index.html" +msgid "Source, target identity and analysis details" +msgstr "" + +#: website/public/showcase/ctf/index.html:688 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"Fresh analysis and two process captures on 8 October 2026, using REA 4.1.0 with Ghidra" +" 12.1.4 on Linux x64. The binary is a stripped x86-64 ELF, 15,248 bytes." +msgstr "" + +#: website/public/showcase/ctf/index.html:695 +msgctxt "page:showcase/ctf/index.html" +msgid "Original executable · SHA-256" +msgstr "" + +#: website/public/showcase/ctf/index.html:699 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The string references, functions and constants were inspected before reading the " +"organizers' source or solution. The Python solver and the diagram were built from " +"those REA results." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/ctf/index.html:704 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"{ph0}Compare with the organizers' source{ph1} · {ph2}Challenge metadata and flag{ph3} " +"· {ph4}REA evidence notes{ph5}" +msgstr "" + +#: website/public/showcase/ctf/index.html:724 +msgctxt "page:showcase/ctf/index.html" +msgid "Try it yourself" +msgstr "" + +#: website/public/showcase/ctf/index.html:725 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"Download the original challenge and the solver into one folder. Use the prompt above " +"to investigate with your agent, or run the included script." +msgstr "" + +#: website/public/showcase/ctf/index.html:731 +msgctxt "page:showcase/ctf/index.html" +msgid "Download the original challenge" +msgstr "" + +#: website/public/showcase/ctf/index.html:735 +msgctxt "page:showcase/ctf/index.html" +msgid "Download solver" +msgstr "" + +#: website/public/showcase/ctf/index.html:741 +msgctxt "page:showcase/ctf/index.html" +msgid "Terminal · solve and run" +msgstr "" + +#. {ph0}: z3-solver +#: website/public/showcase/ctf/index.html:758 +#, python-brace-format +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The script prints a candidate flag; paste it at the program's prompt. Solving needs " +"Python and {ph0}. Running the original executable needs Linux x86-64." +msgstr "" + +#: website/public/showcase/ctf/index.html:763 +msgctxt "page:showcase/ctf/index.html" +msgid "Set up REA with your coding agent" +msgstr "" + +#: website/public/showcase/ctf/index.html:6 +msgctxt "page:showcase/ctf/index.html" +msgid "CTF Reverse Engineering: DownUnderCTF Flag Checker — REA" +msgstr "" + +#: website/public/showcase/ctf/index.html:7 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"Use REA to solve DownUnderCTF's masked squares flag checker. Find the checking " +"functions, extract the masks and compare a recovered flag with the original program." +msgstr "" + +#: website/public/showcase/ctf/index.html:256 +msgctxt "page:showcase/ctf/index.html" +msgid "On this page" +msgstr "" + +#: website/public/showcase/ctf/index.html:267 +msgctxt "page:showcase/ctf/index.html" +msgid "CTF flag-checker case study" +msgstr "" + +#: website/public/showcase/ctf/index.html:282 +msgctxt "page:showcase/ctf/index.html" +msgid "Copy CTF example prompt" +msgstr "" + +#: website/public/showcase/ctf/index.html:393 +msgctxt "page:showcase/ctf/index.html" +msgid "CTF mask equation; scroll horizontally on smaller screens" +msgstr "" + +#: website/public/showcase/ctf/index.html:399 +msgctxt "page:showcase/ctf/index.html" +msgid "" +"The seventh mask skips 21 cells, selects position 21, then skips 14. Only that cell " +"contributes to the sum. Its required character code is 55, which means the character " +"is 7." +msgstr "" + +#: website/public/showcase/ctf/index.html:451 +msgctxt "page:showcase/ctf/index.html" +msgid "Follow the CTF check" +msgstr "" + +#: website/public/showcase/ctf/index.html:501 +msgctxt "page:showcase/ctf/index.html" +msgid "Copy CTF assembly" +msgstr "" + +#: website/public/showcase/ctf/index.html:525 +msgctxt "page:showcase/ctf/index.html" +msgid "Copy readable CTF check" +msgstr "" + +#: website/public/showcase/ctf/index.html:595 +msgctxt "page:showcase/ctf/index.html" +msgid "Copy CTF solver excerpt" +msgstr "" + +#: website/public/showcase/ctf/index.html:669 +msgctxt "page:showcase/ctf/index.html" +msgid "Copy recovered flag" +msgstr "" + +#: website/public/showcase/ctf/index.html:742 +msgctxt "page:showcase/ctf/index.html" +msgid "Copy CTF solver commands" +msgstr "" + +#: website/public/showcase/ctf/index.html:785 +msgctxt "page:showcase/ctf/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:109 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/dx-ball/index.html:201 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / DX-Ball" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:204 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Case study · DX-Ball 1.07" +msgstr "" + +#. {ph0}:
+#: website/public/showcase/dx-ball/index.html:205 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "Rebuilding DX-Ball{ph0}from its executable." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:206 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The goal is a maintainable C version of the 1996 Windows game. REA helps the agent " +"inspect the original, one function at a time." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:210 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Windows i386 · C · REA" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:227 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"One function, from executable to checked C. REA supplies the instructions, callers and" +" data reads; the reconstruction project implements and tests the result. {ph0}Open " +"figure{ph1}" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:238 +msgctxt "page:showcase/dx-ball/index.html" +msgid "In this case study" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:240 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}The project{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:241 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}Sound pan{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:242 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}Checking the result{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:243 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}Continue the work{ph1}" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:251 +msgctxt "page:showcase/dx-ball/index.html" +msgid "maintained C functions" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:255 +msgctxt "page:showcase/dx-ball/index.html" +msgid "comparisons with original code" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:259 +msgctxt "page:showcase/dx-ball/index.html" +msgid "functions with matching compiled bytes" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/dx-ball/index.html:262 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"Project checkpoint: 7 October 2026. {ph0}Progress ledger{ph1} · {ph2}Test " +"coverage{ph3}" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:274 +msgctxt "page:showcase/dx-ball/index.html" +msgid "The project so far" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:275 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The recovered code covers board and resource handling, brick hits, animations, " +"particles and bonus production. Current builds provide inspection utilities and an " +"analysis library. Work on the playable game continues with ball and paddle physics, " +"power-up handling and Windows integration." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:285 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Finding the sound-pan calculation" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:286 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"When a brick is hit, its horizontal position is passed to the sound code. The " +"investigation needed to recover how that screen coordinate becomes a left/right " +"panning value." +msgstr "" + +#. {ph0}: +#: website/public/showcase/dx-ball/index.html:293 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:297 +#: website/public/showcase/dx-ball/index.html:488 +#: website/public/showcase/dx-ball/index.html:509 +#: website/public/showcase/dx-ball/index.html:580 +#: website/public/showcase/dx-ball/index.html:734 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/showcase/dx-ball/index.html:306 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to find how DX-Ball calculates sound panning. Explain the " +"calculation and show the code.{ph3}{ph4}{ph5}" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:314 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"An example prompt for your coding agent, with the local executable available. The " +"investigation below shows the REA queries and evidence behind the answer." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:319 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The agent used REA to inspect the function, follow its brick-hit caller and read the " +"constants from the executable. Those results supplied the input and arithmetic needed " +"to write the C function below." +msgstr "" + +#. {ph0}: 0x406400 +#. {ph1}: FUN_00406400(void) +#. {ph2}: __ftol() +#: website/public/showcase/dx-ball/index.html:325 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The first function result for {ph0} included pseudocode declaring {ph1} and calling " +"{ph2}. Its instruction view showed a stack input and floating-point operations. That " +"discrepancy gave the agent a concrete reason to keep investigating." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:333 +msgctxt "page:showcase/dx-ball/index.html" +msgid "The first decompiler view" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:336 +msgctxt "page:showcase/dx-ball/index.html" +msgid "REA result · pseudocode excerpt" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:346 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The output shows a conversion call. Reading the instructions below reveals the input " +"and the calculation feeding that call." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:352 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Three questions answered through REA" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:355 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Recover the missing input" +msgstr "" + +#. {ph0}: analyze_function +#: website/public/showcase/dx-ball/index.html:359 +#: website/public/showcase/dx-ball/index.html:383 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "Agent → REA · {ph0}" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:365 +msgctxt "page:showcase/dx-ball/index.html" +msgid "REA → agent · instruction excerpt" +msgstr "" + +#. {ph0}: [EBP+8] +#: website/public/showcase/dx-ball/index.html:372 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The function result includes instructions alongside pseudocode and callers. Here, " +"{ph0} exposes the integer input missing from the decompiler view." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:379 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Follow the caller to understand the input" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:389 +msgctxt "page:showcase/dx-ball/index.html" +msgid "REA → agent · caller excerpt" +msgstr "" + +#. {ph0}: tile_x +#. {ph1}: 20 + 30 × tile_x +#: website/public/showcase/dx-ball/index.html:396 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"REA identified this caller in the first result. Its preceding instructions scale {ph0}" +" by 30; adding 20 gives the brick's screen coordinate, {ph1}." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:403 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Read the values behind the memory addresses" +msgstr "" + +#. {ph0}: read_bytes +#: website/public/showcase/dx-ball/index.html:407 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "Agent → REA · two {ph0} requests" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:417 +msgctxt "page:showcase/dx-ball/index.html" +msgid "REA byte results · decoded as doubles" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:424 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The returned bytes establish the two arithmetic constants and initial pan scale. The " +"agent now has the values needed for the C expression." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:432 +msgctxt "page:showcase/dx-ball/index.html" +msgid "From REA's findings to C" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:433 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"Follow the five steps below. Each selection highlights the original instructions and " +"the C lines they informed." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:443 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}01{ph1} Input" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:451 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}02{ph1} Multiply" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:459 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}03{ph1} Subtract" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:467 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}04{ph1} Scale" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:475 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}05{ph1} Return" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:487 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Original x86 · excerpt" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:508 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Reconstructed C" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: [EBP+8] +#. {ph3}: FILD +#. {ph4}: x +#: website/public/showcase/dx-ball/index.html:535 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"{ph0}01 · Read the input.{ph1} The instruction view in REA's function result reads " +"{ph2} and uses {ph3} to load the integer. Following its caller through REA establishes" +" the screen-coordinate meaning of the C parameter {ph4}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: FMUL +#. {ph3}: 0x420068 +#. {ph4}: read_bytes +#. {ph5}: 1.5625 +#: website/public/showcase/dx-ball/index.html:542 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"{ph0}02 · Multiply by 1.5625.{ph1} {ph2} reads the double at {ph3}. The bytes returned" +" by REA's {ph4} decode to {ph5}; the C uses the same constant." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: FSUB +#. {ph3}: 0x420070 +#. {ph4}: 500.0 +#. {ph5}: 320 +#: website/public/showcase/dx-ball/index.html:548 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"{ph0}03 · Subtract 500.0.{ph1} {ph2} reads the double at {ph3}. REA's byte result " +"decodes to {ph4}, shifting the calculation's center to screen coordinate {ph5}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: FMUL +#. {ph3}: 0x4210a0 +#. {ph4}: dxball_pan_scale +#. {ph5}: 1.0 +#: website/public/showcase/dx-ball/index.html:554 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"{ph0}04 · Apply the stored scale.{ph1} The second {ph2} reads {ph3}. That global is " +"named {ph4} in the maintained source. REA's second byte read establishes its initial " +"value of {ph5}." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: 0x406430 +#. {ph3}: __ftol +#. {ph4}: DxBallInt +#: website/public/showcase/dx-ball/index.html:561 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"{ph0}05 · Return an integer.{ph1} The call at {ph2} reaches {ph3}, identified in REA's" +" callee results. The C casts the result to {ph4}; original-x86 comparisons check the " +"returned value." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:570 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The assembly excerpt selects the input, arithmetic and return instructions. The full " +"listing below also includes the intervening stores and function setup and cleanup." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:576 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Full assembly and supporting evidence" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:579 +msgctxt "page:showcase/dx-ball/index.html" +msgid "REA result · 0x406400–0x40643e" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:613 +msgctxt "page:showcase/dx-ball/index.html" +msgid "What the caller supplies" +msgstr "" + +#. {ph0}: 0x411f40 +#: website/public/showcase/dx-ball/index.html:614 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The brick-hit function at {ph0} scales its tile coordinate by 30, adds 20, then pushes" +" it before the call:" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:628 +msgctxt "page:showcase/dx-ball/index.html" +msgid "What the data reads establish" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:631 +msgctxt "page:showcase/dx-ball/index.html" +msgid "REA byte reads, decoded as little-endian doubles" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:636 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Address" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:637 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Value" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:638 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Used for" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:645 +msgctxt "page:showcase/dx-ball/index.html" +msgid "First multiplication" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:650 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Subtraction" +msgstr "" + +#. {ph0}: 1.0 +#: website/public/showcase/dx-ball/index.html:654 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0} initially" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:655 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Stored pan scale" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:660 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"Recorded with REA 4.1.0 for the hash-pinned DX-Ball 1.07 target. The linked " +"investigation notes retain the Evidence IDs." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/dx-ball/index.html:665 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"{ph0}Maintained source{ph1} · {ph2}Investigation notes and evidence references{ph3}" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:679 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Checking the recovered function" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:680 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The recovered function passes two checks: its return values match the original, and " +"its compiled bytes match the executable." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:686 +msgctxt "page:showcase/dx-ball/index.html" +msgid "3,205 behavior cases" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:687 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The tests execute the original x86 function and compare its return value with the " +"maintained C. They cover every integer position from 0 to 640 at five pan scales: 0, " +"0.5, 1, 20 and −1." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:695 +msgctxt "page:showcase/dx-ball/index.html" +msgid "63 matching bytes" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:696 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The C function is compiled with the pinned VC4.0 toolchain. Compiler replay matches " +"the complete function after applying the reviewed relocations and checking the " +"referenced constants." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:704 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"At a scale of 1, the recovered calculation returns −500 at the left edge, 0 at the " +"center and 500 at the right edge. The next part of the audio work is integrating that " +"value with the game's sound backend." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/dx-ball/index.html:710 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}Read the compiler replay details{ph1}" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:719 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Continue the investigation" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:720 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"The same approach is being used for particle updates, explosion queues and bonus " +"generation: inspect the relevant functions, recover their state and dependencies, then" +" compare the implementation with the original." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:726 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"To inspect the sound-pan function yourself, follow the DX-Ball project's setup " +"instructions and supply its matching original target. Then run:" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:733 +msgctxt "page:showcase/dx-ball/index.html" +msgid "In the DX-Ball checkout" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/dx-ball/index.html:747 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "{ph0}DX-Ball repository{ph1}{ph2}Current source, progress and local setup.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/dx-ball/index.html:752 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"{ph0}REA analysis workflow{ph1}{ph2}Follow the calculation, then use the same approach" +" with your own binary.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/dx-ball/index.html:759 +#, python-brace-format +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"{ph0}Particles and bonus production{ph1}{ph2}A larger investigation into state, queues" +" and pixel writes.{ph3}" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:770 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Start with your own target" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:6 +msgctxt "page:showcase/dx-ball/index.html" +msgid "DX-Ball Reverse Engineering: Sound Panning — REA" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:7 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"Follow a DX-Ball reconstruction from binary analysis through REA to maintained C, " +"original-x86 tests and matching compiled function bytes." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:213 +msgctxt "page:showcase/dx-ball/index.html" +msgid "DX-Ball sound-pan investigation; scroll horizontally on smaller screens" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:219 +msgctxt "page:showcase/dx-ball/index.html" +msgid "" +"DXBALL.EXE function 0x00406400 is inspected with REA. A brick-hit caller supplies 20 " +"plus 30 times tile_x. Instructions load x, multiply by 1.5625, subtract 500.0, apply " +"pan_scale and return an integer. The maintained C is checked independently against the" +" original x86 in 3,205 cases and by VC4.0 compiler replay matching 63 bytes." +msgstr "" + +#: website/public/showcase/dx-ball/index.html:237 +msgctxt "page:showcase/dx-ball/index.html" +msgid "On this page" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:246 +msgctxt "page:showcase/dx-ball/index.html" +msgid "DX-Ball reconstruction case study" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:297 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Copy example prompt" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:438 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Follow the sound-pan calculation" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:488 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Copy original assembly excerpt" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:509 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Copy sound-pan function" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:580 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Copy complete sound-pan assembly" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:734 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Copy DX-Ball analysis command" +msgstr "" + +#: website/public/showcase/dx-ball/index.html:793 +msgctxt "page:showcase/dx-ball/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/showcase/index.html:109 +msgctxt "page:showcase/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/index.html:201 +#, python-brace-format +msgctxt "page:showcase/index.html" +msgid "{ph0}Home{ph1} / Showcases" +msgstr "" + +#: website/public/showcase/index.html:202 +msgctxt "page:showcase/index.html" +msgid "REA case studies." +msgstr "" + +#: website/public/showcase/index.html:203 +msgctxt "page:showcase/index.html" +msgid "" +"Android, games, Electron and a CTF challenge, with code, figures and checked results." +msgstr "" + +#: website/public/showcase/index.html:210 +msgctxt "page:showcase/index.html" +msgid "Android · APK analysis" +msgstr "" + +#: website/public/showcase/index.html:212 +msgctxt "page:showcase/index.html" +msgid "How an authenticator generates a login code" +msgstr "" + +#: website/public/showcase/index.html:213 +msgctxt "page:showcase/index.html" +msgid "" +"Find Aegis's six-digit code calculation in its released APK. Trace the generating " +"methods with REA, then move a demo clock to see why the code changes every 30 seconds." +msgstr "" + +#: website/public/showcase/index.html:219 +msgctxt "page:showcase/index.html" +msgid "APK" +msgstr "" + +#: website/public/showcase/index.html:220 +msgctxt "page:showcase/index.html" +msgid "Generating code" +msgstr "" + +#: website/public/showcase/index.html:221 +msgctxt "page:showcase/index.html" +msgid "Recovered rule" +msgstr "" + +#: website/public/showcase/index.html:222 +msgctxt "page:showcase/index.html" +msgid "Adjustable clock" +msgstr "" + +#: website/public/showcase/index.html:224 +msgctxt "page:showcase/index.html" +msgid "Read the Android case study" +msgstr "" + +#: website/public/showcase/index.html:228 +msgctxt "page:showcase/index.html" +msgid "CTF · Native analysis" +msgstr "" + +#: website/public/showcase/index.html:230 +msgctxt "page:showcase/index.html" +msgid "Solve a CTF flag checker" +msgstr "" + +#: website/public/showcase/index.html:231 +msgctxt "page:showcase/index.html" +msgid "" +"Inspect an easy DownUnderCTF challenge with REA. Find its checking functions, turn " +"masks and sums into equations, then verify the solved flag with the original program." +msgstr "" + +#: website/public/showcase/index.html:237 +msgctxt "page:showcase/index.html" +msgid "Binary" +msgstr "" + +#: website/public/showcase/index.html:238 +msgctxt "page:showcase/index.html" +msgid "Checking code" +msgstr "" + +#: website/public/showcase/index.html:239 +msgctxt "page:showcase/index.html" +msgid "Equations" +msgstr "" + +#: website/public/showcase/index.html:240 +msgctxt "page:showcase/index.html" +msgid "Correct!" +msgstr "" + +#: website/public/showcase/index.html:242 +msgctxt "page:showcase/index.html" +msgid "Read the CTF case study" +msgstr "" + +#: website/public/showcase/index.html:246 +msgctxt "page:showcase/index.html" +msgid "Native · Reconstruction" +msgstr "" + +#: website/public/showcase/index.html:248 +msgctxt "page:showcase/index.html" +msgid "DX-Ball's sound-pan calculation" +msgstr "" + +#: website/public/showcase/index.html:249 +msgctxt "page:showcase/index.html" +msgid "" +"Recover a sound-pan calculation from a 1996 Windows game. REA's instructions, caller " +"references and numeric constants lead to a small C function, checked against the " +"original behavior and all 63 compiled bytes." +msgstr "" + +#: website/public/showcase/index.html:256 +msgctxt "page:showcase/index.html" +msgid "Executable" +msgstr "" + +#: website/public/showcase/index.html:257 +msgctxt "page:showcase/index.html" +msgid "REA findings" +msgstr "" + +#: website/public/showcase/index.html:258 +msgctxt "page:showcase/index.html" +msgid "Recovered C" +msgstr "" + +#: website/public/showcase/index.html:259 +msgctxt "page:showcase/index.html" +msgid "Validation" +msgstr "" + +#: website/public/showcase/index.html:261 +msgctxt "page:showcase/index.html" +msgid "Read the DX-Ball case study" +msgstr "" + +#: website/public/showcase/index.html:265 +msgctxt "page:showcase/index.html" +msgid "Electron · Feature tracing" +msgstr "" + +#: website/public/showcase/index.html:267 +msgctxt "page:showcase/index.html" +msgid "How Notion copies text and HTML" +msgstr "" + +#: website/public/showcase/index.html:268 +msgctxt "page:showcase/index.html" +msgid "" +"Trace a page-facing API through Notion's packaged JavaScript. Follow its IPC wrappers " +"to the system clipboard, then see how a small HTML marker keeps rich block data " +"connected to a copy." +msgstr "" + +#: website/public/showcase/index.html:274 +msgctxt "page:showcase/index.html" +msgid "Packaged app" +msgstr "" + +#: website/public/showcase/index.html:275 +msgctxt "page:showcase/index.html" +msgid "Exposed API" +msgstr "" + +#: website/public/showcase/index.html:276 +msgctxt "page:showcase/index.html" +msgid "IPC wrappers" +msgstr "" + +#: website/public/showcase/index.html:277 +msgctxt "page:showcase/index.html" +msgid "Clipboard" +msgstr "" + +#: website/public/showcase/index.html:279 +msgctxt "page:showcase/index.html" +msgid "Read the Notion case study" +msgstr "" + +#: website/public/showcase/index.html:283 +msgctxt "page:showcase/index.html" +msgid "PC-98 DOS · Reconstruction" +msgstr "" + +#: website/public/showcase/index.html:285 +msgctxt "page:showcase/index.html" +msgid "How TH04 aims a ring of bullets" +msgstr "" + +#: website/public/showcase/index.html:286 +msgctxt "page:showcase/index.html" +msgid "" +"Inspect the original 16-bit angle helper with REA. Match its multiply, divide and " +"coordinate operations to readable C++, then see how they produce a ring aimed at the " +"player." +msgstr "" + +#: website/public/showcase/index.html:292 +msgctxt "page:showcase/index.html" +msgid "Original DOS code" +msgstr "" + +#: website/public/showcase/index.html:293 +msgctxt "page:showcase/index.html" +msgid "REA instructions" +msgstr "" + +#: website/public/showcase/index.html:294 +msgctxt "page:showcase/index.html" +msgid "Angle calculation" +msgstr "" + +#: website/public/showcase/index.html:295 +msgctxt "page:showcase/index.html" +msgid "Bullet ring" +msgstr "" + +#: website/public/showcase/index.html:297 +msgctxt "page:showcase/index.html" +msgid "Read the TH04 case study" +msgstr "" + +#: website/public/showcase/index.html:302 +msgctxt "page:showcase/index.html" +msgid "Step-by-step guides" +msgstr "" + +#: website/public/showcase/index.html:303 +msgctxt "page:showcase/index.html" +msgid "" +"The guides walk through a native calculation, an Electron export and a browser " +"request. Each starts with a prompt and a concrete target." +msgstr "" + +#: website/public/showcase/index.html:307 +msgctxt "page:showcase/index.html" +msgid "Read the guides" +msgstr "" + +#: website/public/showcase/index.html:6 +msgctxt "page:showcase/index.html" +msgid "Reverse Engineering Case Studies — REA" +msgstr "" + +#: website/public/showcase/index.html:7 +msgctxt "page:showcase/index.html" +msgid "" +"Follow REA investigations through code, figures and demos: an Android authenticator, " +"DX-Ball, Notion, TH04 and a DownUnderCTF flag checker." +msgstr "" + +#: website/public/showcase/index.html:325 +msgctxt "page:showcase/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/showcase/notion/index.html:109 +msgctxt "page:showcase/notion/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/notion/index.html:201 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / Notion" +msgstr "" + +#: website/public/showcase/notion/index.html:204 +msgctxt "page:showcase/notion/index.html" +msgid "Case study · Electron" +msgstr "" + +#. {ph0}:
+#: website/public/showcase/notion/index.html:205 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "How Notion copies{ph0}text and HTML." +msgstr "" + +#: website/public/showcase/notion/index.html:206 +msgctxt "page:showcase/notion/index.html" +msgid "" +"Trace a clipboard call from Notion's page API, through the preload and main process, " +"to Electron's clipboard writer." +msgstr "" + +#: website/public/showcase/notion/index.html:210 +msgctxt "page:showcase/notion/index.html" +msgid "Notion Desktop 7.6.1 · JavaScript · REA" +msgstr "" + +#: website/public/showcase/notion/index.html:214 +msgctxt "page:showcase/notion/index.html" +msgid "The bridge inside Notion's desktop package" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: clipboard.write(data) +#. {ph4}: +#. {ph5}: +#. {ph6}: +#: website/public/showcase/notion/index.html:216 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"{ph0}01 · Page-facing API{ph1} {ph2}{ph3}{ph4} {ph5}The preload exposes a callable " +"method.{ph6}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: ipcRenderer.invoke +#. {ph4}: +#. {ph5}: +#. {ph6}: +#: website/public/showcase/notion/index.html:223 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"{ph0}02 · Preload wrapper{ph1} {ph2}{ph3}{ph4} {ph5}The wrapper sends the channel and " +"arguments.{ph6}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: ipcMain.handle +#. {ph4}: +#. {ph5}: +#. {ph6}: +#: website/public/showcase/notion/index.html:230 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"{ph0}03 · Main-process handler{ph1} {ph2}{ph3}{ph4} {ph5}The receiver checks which " +"page sent it.{ph6}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: clipboard.write(data) +#. {ph4}: +#. {ph5}: +#. {ph6}: +#: website/public/showcase/notion/index.html:237 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"{ph0}04 · System clipboard{ph1} {ph2}{ph3}{ph4} {ph5}Electron writes the supplied text" +" and HTML.{ph6}" +msgstr "" + +#. {ph0}: notion:clipboard:write +#: website/public/showcase/notion/index.html:245 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "One channel joins the two sides: {ph0}" +msgstr "" + +#: website/public/showcase/notion/index.html:249 +msgctxt "page:showcase/notion/index.html" +msgid "" +"The packaged code uses the same channel in the preload and main process. Resolving the" +" wrappers reveals the Electron calls behind those names." +msgstr "" + +#: website/public/showcase/notion/index.html:258 +msgctxt "page:showcase/notion/index.html" +msgid "In this case study" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/notion/index.html:260 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "{ph0}Follow the clipboard bridge{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/notion/index.html:261 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "{ph0}Keeping a block's structure{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/notion/index.html:262 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "{ph0}More examples and sources{ph1}" +msgstr "" + +#: website/public/showcase/notion/index.html:267 +msgctxt "page:showcase/notion/index.html" +msgid "Where does the copy operation go?" +msgstr "" + +#. {ph0}: clipboard.write +#: website/public/showcase/notion/index.html:268 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"The page sees a method called {ph0}. Its implementation in the preload is a wrapper. " +"The useful question is what that wrapper sends, and which code receives it." +msgstr "" + +#. {ph0}: +#: website/public/showcase/notion/index.html:275 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#: website/public/showcase/notion/index.html:279 +#: website/public/showcase/notion/index.html:352 +#: website/public/showcase/notion/index.html:381 +#: website/public/showcase/notion/index.html:412 +#: website/public/showcase/notion/index.html:440 +msgctxt "page:showcase/notion/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/showcase/notion/index.html:288 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to trace how Notion copies text and HTML to the system " +"clipboard. Show the code at each step.{ph3}{ph4}{ph5}" +msgstr "" + +#: website/public/showcase/notion/index.html:296 +msgctxt "page:showcase/notion/index.html" +msgid "" +"An example prompt with Notion's local application package available to your coding " +"agent." +msgstr "" + +#: website/public/showcase/notion/index.html:301 +msgctxt "page:showcase/notion/index.html" +msgid "REA finds where to start reading" +msgstr "" + +#: website/public/showcase/notion/index.html:302 +msgctxt "page:showcase/notion/index.html" +msgid "" +"Analyzing the tab preload with REA locates the API exposed to the page and the call " +"that sends an IPC request. Both findings come with source ranges in the minified " +"bundle:" +msgstr "" + +#: website/public/showcase/notion/index.html:308 +msgctxt "page:showcase/notion/index.html" +msgid "REA findings → two places to open" +msgstr "" + +#: website/public/showcase/notion/index.html:311 +msgctxt "page:showcase/notion/index.html" +msgid "Exposed page API" +msgstr "" + +#: website/public/showcase/notion/index.html:317 +msgctxt "page:showcase/notion/index.html" +msgid "Renderer IPC call" +msgstr "" + +#. {ph0}: analyze_javascript_application +#: website/public/showcase/notion/index.html:323 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"Selected fields from a fresh {ph0} result on Notion's tab preload, recorded with REA " +"4.1.0. Positions use the original bundle's line and zero-based column." +msgstr "" + +#. {ph0}: invokerInMain +#. {ph1}: notion:clipboard:write +#: website/public/showcase/notion/index.html:330 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"The agent opens those locations, finds the clipboard member in the assembled API, and " +"reads {ph0}. Its call site supplies {ph1}. That name gives the agent something precise" +" to look for in the main bundle. The four excerpts below show the route it connects." +msgstr "" + +#: website/public/showcase/notion/index.html:339 +msgctxt "page:showcase/notion/index.html" +msgid "Four short pieces of code" +msgstr "" + +#: website/public/showcase/notion/index.html:340 +msgctxt "page:showcase/notion/index.html" +msgid "" +"Simplified from the packaged JavaScript, with readable variable names. Unrelated " +"members are omitted." +msgstr "" + +#: website/public/showcase/notion/index.html:346 +msgctxt "page:showcase/notion/index.html" +msgid "Start at the API exposed to the page" +msgstr "" + +#. {ph0}: preload.js +#: website/public/showcase/notion/index.html:349 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "tab_browser_view/{ph0} · API member" +msgstr "" + +#. {ph0}: invokerInMain +#: website/public/showcase/notion/index.html:368 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"This member supplies the channel name. The implementation of {ph0} tells us how the " +"request leaves the page's process." +msgstr "" + +#: website/public/showcase/notion/index.html:375 +msgctxt "page:showcase/notion/index.html" +msgid "Resolve the preload's wrapper" +msgstr "" + +#. {ph0}: preload.js +#: website/public/showcase/notion/index.html:378 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "tab_browser_view/{ph0} · IPC helper" +msgstr "" + +#. {ph0}: notion:clipboard:write +#: website/public/showcase/notion/index.html:398 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"The returned function forwards the arguments through Electron's request-and-response " +"IPC. We can now look for {ph0} on the main-process side." +msgstr "" + +#: website/public/showcase/notion/index.html:406 +msgctxt "page:showcase/notion/index.html" +msgid "Check how the receiver is registered" +msgstr "" + +#. {ph0}: index.js +#: website/public/showcase/notion/index.html:409 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "main/{ph0} · handler helper" +msgstr "" + +#. {ph0}: addListener +#. {ph1}: ipcMain.handle +#: website/public/showcase/notion/index.html:427 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"The main process uses another wrapper. Its {ph0} method registers an {ph1} receiver " +"for that channel." +msgstr "" + +#: website/public/showcase/notion/index.html:434 +msgctxt "page:showcase/notion/index.html" +msgid "Find the write and its sender check" +msgstr "" + +#. {ph0}: index.js +#: website/public/showcase/notion/index.html:437 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "main/{ph0} · clipboard receiver" +msgstr "" + +#: website/public/showcase/notion/index.html:457 +msgctxt "page:showcase/notion/index.html" +msgid "" +"This is the destination. After checking the sender, the handler passes the supplied " +"data to Electron's clipboard API. The channel and the two resolved wrappers connect " +"the exposed method to this call." +msgstr "" + +#: website/public/showcase/notion/index.html:468 +msgctxt "page:showcase/notion/index.html" +msgid "How does a copied block keep its structure?" +msgstr "" + +#. {ph0}: electronApi.clipboard.write +#: website/public/showcase/notion/index.html:469 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"Notion's web editor sends text and HTML through {ph0}. It keeps the block data locally" +" and puts an ID in the copied HTML to connect them." +msgstr "" + +#: website/public/showcase/notion/index.html:475 +msgctxt "page:showcase/notion/index.html" +msgid "HTML links to saved block data" +msgstr "" + +#: website/public/showcase/notion/index.html:479 +msgctxt "page:showcase/notion/index.html" +msgid "Sent to the system clipboard" +msgstr "" + +#: website/public/showcase/notion/index.html:487 +msgctxt "page:showcase/notion/index.html" +msgid "Saved locally by Notion" +msgstr "" + +#: website/public/showcase/notion/index.html:499 +msgctxt "page:showcase/notion/index.html" +msgid "Read the HTML ID" +msgstr "" + +#: website/public/showcase/notion/index.html:500 +msgctxt "page:showcase/notion/index.html" +msgid "Find the same local ID" +msgstr "" + +#: website/public/showcase/notion/index.html:501 +msgctxt "page:showcase/notion/index.html" +msgid "Restore Notion block data" +msgstr "" + +#: website/public/showcase/notion/index.html:503 +msgctxt "page:showcase/notion/index.html" +msgid "" +"Illustrative text and ID. The recorded module test restores the block data when IDs " +"match; a stale entry returns only text and HTML." +msgstr "" + +#: website/public/showcase/notion/index.html:509 +msgctxt "page:showcase/notion/index.html" +msgid "" +"On paste, Notion looks for the HTML ID and checks it against the saved copy. Matching " +"IDs restore the block data." +msgstr "" + +#: website/public/showcase/notion/index.html:513 +msgctxt "page:showcase/notion/index.html" +msgid "Clipboard format recorded from web assets cached on July 13, 2026." +msgstr "" + +#: website/public/showcase/notion/index.html:519 +msgctxt "page:showcase/notion/index.html" +msgid "More examples and sources" +msgstr "" + +#: website/public/showcase/notion/index.html:521 +msgctxt "page:showcase/notion/index.html" +msgid "Another example: Markdown tables" +msgstr "" + +#: website/public/showcase/notion/index.html:522 +msgctxt "page:showcase/notion/index.html" +msgid "" +"Notion parses Markdown into block data. This example shows how a table becomes header " +"and data rows." +msgstr "" + +#: website/public/showcase/notion/index.html:527 +msgctxt "page:showcase/notion/index.html" +msgid "A table through Notion's Markdown parser" +msgstr "" + +#: website/public/showcase/notion/index.html:532 +msgctxt "page:showcase/notion/index.html" +msgid "Markdown input" +msgstr "" + +#: website/public/showcase/notion/index.html:539 +msgctxt "page:showcase/notion/index.html" +msgid "Structured parser output · excerpt" +msgstr "" + +#: website/public/showcase/notion/index.html:548 +msgctxt "page:showcase/notion/index.html" +msgid "" +"Recorded output from an extracted Markdown parser. The table becomes rows and cells." +msgstr "" + +#: website/public/showcase/notion/index.html:555 +msgctxt "page:showcase/notion/index.html" +msgid "Another path: the offline SQLite connection" +msgstr "" + +#. {ph0}: getSqliteMeta +#: website/public/showcase/notion/index.html:556 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"Notion's renderer requests {ph0} through IPC. The main process creates a message " +"channel and gives one port to the renderer and the other to a SQLite utility process. " +"Subsequent statement batches and results travel over that port." +msgstr "" + +#: website/public/showcase/notion/index.html:562 +msgctxt "page:showcase/notion/index.html" +msgid "" +"Following this handoff explains where the database work runs, and why tracing only the" +" initial IPC request misses the later conversation." +msgstr "" + +#: website/public/showcase/notion/index.html:569 +msgctxt "page:showcase/notion/index.html" +msgid "Sources and how to read the excerpts" +msgstr "" + +#. {ph0}: app.asar +#. {ph1}: main/index.js +#. {ph2}: isNotionWebContents +#: website/public/showcase/notion/index.html:570 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"The clipboard bridge comes from Notion Desktop 7.6.1's {ph0}: the tab preload and " +"{ph1}. The excerpts expand minified variable names and omit unrelated code; the " +"sender-check helper is shown with its underlying {ph2} call." +msgstr "" + +#. {ph0}: 747001 +#. {ph1}: 58169 +#. {ph2}: 736810 +#. {ph3}: 422457 +#: website/public/showcase/notion/index.html:578 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"The virtual clipboard and Markdown examples come from web assets cached on July 13, " +"2026, including modules {ph0}, {ph1}, {ph2} and {ph3}. Those assets have their own " +"version. Saved probes executed extracted modules and small harnesses; their outputs " +"describe those probes rather than a captured desktop UI session." +msgstr "" + +#: website/public/showcase/notion/index.html:586 +msgctxt "page:showcase/notion/index.html" +msgid "" +"The REA result shown here is a focused analysis of the saved tab preload, recorded " +"with the published REA 4.1.0 package. It locates the API and invoke operation. The " +"clipboard member and matching receiver are connected by reading their wrapper " +"implementations in the package." +msgstr "" + +#. {ph0}: 422457 +#: website/public/showcase/notion/index.html:593 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"The Markdown example uses parser module {ph0}. Saved module tests show that both page " +"and chat filters preserve this table. The paste/import, structured Markdown and " +"AI/chat parsers have separate entry points and intermediate formats." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/notion/index.html:601 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"{ph0}JavaScript application guide{ph1}{ph2}Follow a small Electron application's " +"export feature.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/notion/index.html:608 +#, python-brace-format +msgctxt "page:showcase/notion/index.html" +msgid "" +"{ph0}DX-Ball reconstruction{ph1}{ph2}Follow native instructions to a checked C " +"function.{ph3}" +msgstr "" + +#: website/public/showcase/notion/index.html:616 +msgctxt "page:showcase/notion/index.html" +msgid "Analyze your own app" +msgstr "" + +#: website/public/showcase/notion/index.html:6 +msgctxt "page:showcase/notion/index.html" +msgid "Notion Electron Reverse Engineering: Clipboard — REA" +msgstr "" + +#: website/public/showcase/notion/index.html:7 +msgctxt "page:showcase/notion/index.html" +msgid "" +"Follow Notion's clipboard API through Electron's preload, IPC wrappers and main " +"process, with short code excerpts and a look at its rich clipboard format." +msgstr "" + +#: website/public/showcase/notion/index.html:257 +msgctxt "page:showcase/notion/index.html" +msgid "On this page" +msgstr "" + +#: website/public/showcase/notion/index.html:265 +msgctxt "page:showcase/notion/index.html" +msgid "Notion Electron case study" +msgstr "" + +#: website/public/showcase/notion/index.html:279 +msgctxt "page:showcase/notion/index.html" +msgid "Copy Notion analysis prompt" +msgstr "" + +#: website/public/showcase/notion/index.html:352 +msgctxt "page:showcase/notion/index.html" +msgid "Copy Notion preload excerpt" +msgstr "" + +#: website/public/showcase/notion/index.html:381 +msgctxt "page:showcase/notion/index.html" +msgid "Copy Notion invoke wrapper excerpt" +msgstr "" + +#: website/public/showcase/notion/index.html:412 +msgctxt "page:showcase/notion/index.html" +msgid "Copy Notion handler wrapper excerpt" +msgstr "" + +#: website/public/showcase/notion/index.html:440 +msgctxt "page:showcase/notion/index.html" +msgid "Copy Notion clipboard receiver excerpt" +msgstr "" + +#: website/public/showcase/notion/index.html:495 +msgctxt "page:showcase/notion/index.html" +msgid "Restoring rich clipboard data on paste" +msgstr "" + +#: website/public/showcase/notion/index.html:639 +msgctxt "page:showcase/notion/index.html" +msgid "Back to top" +msgstr "" + +#: website/public/showcase/th04/index.html:109 +msgctxt "page:showcase/th04/index.html" +msgid "Skip to content" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/th04/index.html:201 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}Home{ph1} / {ph2}Showcases{ph3} / TH04" +msgstr "" + +#: website/public/showcase/th04/index.html:204 +msgctxt "page:showcase/th04/index.html" +msgid "Case study · Touhou 4: Lotus Land Story" +msgstr "" + +#. {ph0}:
+#: website/public/showcase/th04/index.html:205 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "Reconstructing TH04's{ph0}bullet patterns." +msgstr "" + +#: website/public/showcase/th04/index.html:206 +msgctxt "page:showcase/th04/index.html" +msgid "" +"A ring of bullets starts with a short angle calculation. Use REA to inspect the " +"original DOS function, then follow its instructions into readable C++." +msgstr "" + +#: website/public/showcase/th04/index.html:211 +msgctxt "page:showcase/th04/index.html" +msgid "PC-98 · 16-bit DOS · C++ and assembly" +msgstr "" + +#: website/public/showcase/th04/index.html:212 +msgctxt "page:showcase/th04/index.html" +msgid "View the TH04 reconstruction" +msgstr "" + +#: website/public/showcase/th04/index.html:218 +msgctxt "page:showcase/th04/index.html" +msgid "From original instructions to checked source" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/th04/index.html:220 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}01 · Original game{ph1}{ph2}MAIN.EXE{ph3}{ph4}The PC-98 executable and its " +"bullet-angle helper.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/th04/index.html:227 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}02 · Inspect with REA{ph1}{ph2}Instructions + references{ph3}{ph4}Verify the " +"loaded DOS code and read the angle calculation from the executable.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/th04/index.html:235 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}03 · Read the C++{ph1}{ph2}Space → aim → rotate{ph3}{ph4}Connect each operation " +"to the maintained reconstruction.{ph5}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/th04/index.html:242 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}04 · Check the source{ph1}{ph2}2,139 matching bytes{ph3}{ph4}Recorded compiler " +"checks cover the bullet-generation code that contains this helper.{ph5}" +msgstr "" + +#: website/public/showcase/th04/index.html:251 +msgctxt "page:showcase/th04/index.html" +msgid "" +"REA returns the original code and its analysis evidence. The TH04 project supplies the" +" maintained source and compiler checks." +msgstr "" + +#: website/public/showcase/th04/index.html:259 +msgctxt "page:showcase/th04/index.html" +msgid "In this case study" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:261 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}The bullet ring{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:262 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}What REA returns{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:263 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}Assembly to C++{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:264 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}Checking the source{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:265 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}The full project{ph1}" +msgstr "" + +#: website/public/showcase/th04/index.html:270 +msgctxt "page:showcase/th04/index.html" +msgid "How a ring aims at the player" +msgstr "" + +#: website/public/showcase/th04/index.html:271 +msgctxt "page:showcase/th04/index.html" +msgid "" +"Elly's attack requests an aimed ring with an initial count of 16. One helper " +"calculates the direction of each bullet. The same ring can face a fixed direction or " +"turn toward the player." +msgstr "" + +#. {ph0}: +#: website/public/showcase/th04/index.html:278 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}{ph1}{ph2}{ph3}{ph4}{ph5}{ph6}{ph7}Your coding agent" +msgstr "" + +#: website/public/showcase/th04/index.html:283 +#: website/public/showcase/th04/index.html:339 +#: website/public/showcase/th04/index.html:516 +#: website/public/showcase/th04/index.html:550 +msgctxt "page:showcase/th04/index.html" +msgid "Copy" +msgstr "" + +#. {ph0}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#: website/public/showcase/th04/index.html:292 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}›{ph1}{ph2}Use REA to find how TH04 creates a ring of bullets and aims it at the " +"player. Explain the calculation and show the code.{ph3}{ph4}{ph5}" +msgstr "" + +#: website/public/showcase/th04/index.html:301 +msgctxt "page:showcase/th04/index.html" +msgid "" +"An example prompt, with the original executable and reconstruction checkout available " +"locally." +msgstr "" + +#. {ph0}: 0, 16, 32, …, 240 +#: website/public/showcase/th04/index.html:305 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"TH04 stores a full clockwise turn in 256 angle units. For 16 bullets, each index adds " +"16 units: {ph0}. Adding the player's direction rotates those positions together." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:325 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"An illustration of the recovered angle math for count 16, player direction 40 and " +"template rotation 0. {ph0}Open figure{ph1}" +msgstr "" + +#: website/public/showcase/th04/index.html:333 +msgctxt "page:showcase/th04/index.html" +msgid "The firing template in the recovered source" +msgstr "" + +#: website/public/showcase/th04/index.html:338 +msgctxt "page:showcase/th04/index.html" +msgid "Elly's ring attack · source excerpt" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:353 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"These lines select the pattern before difficulty and performance tuning. {ph0}Read the" +" attack's source{ph1}." +msgstr "" + +#: website/public/showcase/th04/index.html:364 +msgctxt "page:showcase/th04/index.html" +msgid "What REA returns" +msgstr "" + +#. {ph0}: bullet_velocity_and_angle_set() +#: website/public/showcase/th04/index.html:365 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"We inspect {ph0}, the function that sets each bullet's velocity and angle. REA returns" +" its instructions, pseudocode and references. Three parts of that result explain the " +"pattern." +msgstr "" + +#: website/public/showcase/th04/index.html:373 +msgctxt "page:showcase/th04/index.html" +msgid "Check the DOS image before reading its code" +msgstr "" + +#: website/public/showcase/th04/index.html:376 +msgctxt "page:showcase/th04/index.html" +msgid "Agent → REA" +msgstr "" + +#: website/public/showcase/th04/index.html:385 +msgctxt "page:showcase/th04/index.html" +msgid "REA → agent · selected fields" +msgstr "" + +#: website/public/showcase/th04/index.html:394 +msgctxt "page:showcase/th04/index.html" +msgid "" +"The check ties the loaded code and relocation records to the supplied executable. The " +"path above is shortened for display." +msgstr "" + +#: website/public/showcase/th04/index.html:400 +msgctxt "page:showcase/th04/index.html" +msgid "Read the ring's multiply and divide" +msgstr "" + +#. {ph0}: analyze_function +#: website/public/showcase/th04/index.html:404 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "Agent → REA · {ph0}" +msgstr "" + +#: website/public/showcase/th04/index.html:410 +msgctxt "page:showcase/th04/index.html" +msgid "REA → agent · instruction excerpt" +msgstr "" + +#. {ph0}: SI +#. {ph1}: DS:53AF +#. {ph2}: bullet_template.count +#: website/public/showcase/th04/index.html:418 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0} holds the bullet index. The shift multiplies it by 256, then the division uses " +"the count read from {ph1}. The maintained source names that field {ph2}. The complete " +"sequence appears below." +msgstr "" + +#: website/public/showcase/th04/index.html:427 +msgctxt "page:showcase/th04/index.html" +msgid "Find where the pattern turns toward the player" +msgstr "" + +#: website/public/showcase/th04/index.html:431 +msgctxt "page:showcase/th04/index.html" +msgid "Same function result · aim excerpt" +msgstr "" + +#: website/public/showcase/th04/index.html:440 +msgctxt "page:showcase/th04/index.html" +msgid "Corresponding maintained C++" +msgstr "" + +#: website/public/showcase/th04/index.html:448 +msgctxt "page:showcase/th04/index.html" +msgid "" +"The instruction operands expose two coordinate differences and a direction helper. Its" +" return value is added to the relative ring angle. Source names make those addresses " +"readable; REA lets the agent check the original operations behind them." +msgstr "" + +#: website/public/showcase/th04/index.html:459 +msgctxt "page:showcase/th04/index.html" +msgid "From assembly to readable C++" +msgstr "" + +#: website/public/showcase/th04/index.html:460 +msgctxt "page:showcase/th04/index.html" +msgid "" +"Select a step to match the original instructions with the angle calculation. This " +"summary follows the aimed-ring path; the full source also handles spreads, stacks and " +"random patterns." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:471 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}01{ph1} Index" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:479 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}02{ph1} Space" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:487 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}03{ph1} Aim" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:495 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}04{ph1} Rotate" +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:503 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}05{ph1} Store" +msgstr "" + +#: website/public/showcase/th04/index.html:515 +msgctxt "page:showcase/th04/index.html" +msgid "REA · original 16-bit instructions" +msgstr "" + +#: website/public/showcase/th04/index.html:549 +msgctxt "page:showcase/th04/index.html" +msgid "Readable C++ · aimed-ring summary" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: SI +#: website/public/showcase/th04/index.html:578 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}01 · Read the bullet index.{ph1} The stack argument is loaded into {ph2}. In a " +"16-bullet ring, this member index runs from 0 through 15." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: SHL AX,8 +#. {ph3}: IDIV +#: website/public/showcase/th04/index.html:583 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}02 · Space the directions around a full turn.{ph1} {ph2} multiplies by 256. The " +"count is zero-extended into a word, then {ph3} divides the product by that count. For " +"count 16, each index advances 16 angle units." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: AX +#: website/public/showcase/th04/index.html:590 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}03 · Add the player direction.{ph1} The two subtractions form player-minus-origin" +" coordinates. The direction helper returns an angle in {ph2}; adding it turns the " +"whole ring toward the player." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: ADD AL,[0x53ad] +#: website/public/showcase/th04/index.html:596 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}04 · Add the pattern's rotation.{ph1} {ph2} adds the template angle. Elly's " +"initial template sets it to zero; other patterns can use the same helper with a " +"rotation." +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: AL +#: website/public/showcase/th04/index.html:602 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}05 · Keep the final angle in one byte.{ph1} The store writes {ph2} to the spawn-" +"angle field. Values wrap after 255, just as the unsigned-byte cast does. The " +"surrounding source also converts this angle and speed into velocity." +msgstr "" + +#: website/public/showcase/th04/index.html:611 +msgctxt "page:showcase/th04/index.html" +msgid "" +"The assembly selects the aimed-ring branch, aim calculation and final store. The C++ " +"above is a readable summary. Compiler checks below apply to the maintained source in " +"the linked project." +msgstr "" + +#: website/public/showcase/th04/index.html:617 +msgctxt "page:showcase/th04/index.html" +msgid "Read the maintained ring and aim source" +msgstr "" + +#: website/public/showcase/th04/index.html:620 +msgctxt "page:showcase/th04/index.html" +msgid "Ring macro · TH04 branch, excerpt" +msgstr "" + +#: website/public/showcase/th04/index.html:630 +msgctxt "page:showcase/th04/index.html" +msgid "Angle and velocity · source excerpt" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#. {ph4}: +#. {ph5}: +#: website/public/showcase/th04/index.html:646 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}Ring macro{ph1} · {ph2}Aim and velocity source{ph3} · {ph4}Angle " +"representation{ph5}" +msgstr "" + +#: website/public/showcase/th04/index.html:666 +msgctxt "page:showcase/th04/index.html" +msgid "Checking the maintained source" +msgstr "" + +#: website/public/showcase/th04/index.html:667 +msgctxt "page:showcase/th04/index.html" +msgid "" +"The TH04 project's recorded checks compile the bullet-generation code, including this " +"helper, with its pinned Turbo C++ 4.0J toolchain." +msgstr "" + +#: website/public/showcase/th04/index.html:674 +msgctxt "page:showcase/th04/index.html" +msgid "2,139 matching bytes" +msgstr "" + +#: website/public/showcase/th04/index.html:675 +msgctxt "page:showcase/th04/index.html" +msgid "" +"The compiled bullet-generation code matches a 2,139-byte section of the original " +"executable." +msgstr "" + +#: website/public/showcase/th04/index.html:681 +msgctxt "page:showcase/th04/index.html" +msgid "Two clean builds" +msgstr "" + +#: website/public/showcase/th04/index.html:682 +msgctxt "page:showcase/th04/index.html" +msgid "" +"Two separate builds produce the same matching bytes. The recorded input hashes match " +"the maintained source shown here." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:688 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "Recorded on 3 October 2026. {ph0}Read the compiler checks{ph1}." +msgstr "" + +#: website/public/showcase/th04/index.html:696 +msgctxt "page:showcase/th04/index.html" +msgid "Target identity and analysis scope" +msgstr "" + +#: website/public/showcase/th04/index.html:701 +msgctxt "page:showcase/th04/index.html" +msgid "Original target" +msgstr "" + +#. {ph0}: MAIN.EXE +#: website/public/showcase/th04/index.html:702 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}, 156,258 bytes, DOS MZ" +msgstr "" + +#: website/public/showcase/th04/index.html:705 +msgctxt "page:showcase/th04/index.html" +msgid "Helper entry" +msgstr "" + +#. {ph0}: 0x2cfc8 +#: website/public/showcase/th04/index.html:706 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0} in REA's loaded image" +msgstr "" + +#: website/public/showcase/th04/index.html:709 +msgctxt "page:showcase/th04/index.html" +msgid "Original file offset" +msgstr "" + +#. {ph0}: 0x1e7c8 +#. {ph1}: address_to_file_offset +#: website/public/showcase/th04/index.html:710 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}, returned by {ph1}" +msgstr "" + +#: website/public/showcase/th04/index.html:716 +msgctxt "page:showcase/th04/index.html" +msgid "Recorded code inspection" +msgstr "" + +#: website/public/showcase/th04/index.html:717 +msgctxt "page:showcase/th04/index.html" +msgid "REA 4.1.0 · 7 October 2026" +msgstr "" + +#: website/public/showcase/th04/index.html:722 +msgctxt "page:showcase/th04/index.html" +msgid "" +"Compiler checks cover the complete bullet-add code section, including this helper. " +"They also compare its MAP contribution and overlapping relocation." +msgstr "" + +#. {ph0}: 0x1000 +#: website/public/showcase/th04/index.html:727 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"REA verified the static DOS load image at load segment {ph0}. Its addresses describe " +"that analysis image. The function result reports 503 body bytes in two ranges across a" +" 517-byte span; the selected instructions above lie in those reported ranges." +msgstr "" + +#. {ph0}: 0d72e980 +#: website/public/showcase/th04/index.html:734 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"The source names and compiler checks come from TH04 checkpoint {ph0}. Earlier " +"reconstruction observations used the project's own analysis scripts; this page adds a " +"fresh REA inspection of the same original target. The supplied game's identity is " +"pinned by its repository manifest, with independent pristine-dump provenance still " +"open." +msgstr "" + +#: website/public/showcase/th04/index.html:742 +msgctxt "page:showcase/th04/index.html" +msgid "" +"The figure illustrates the angle calculation. Full-game controls, timing and PC-98 " +"hardware behavior have separate runtime checks in the reconstruction project." +msgstr "" + +#: website/public/showcase/th04/index.html:751 +msgctxt "page:showcase/th04/index.html" +msgid "The full TH04 reconstruction" +msgstr "" + +#: website/public/showcase/th04/index.html:752 +msgctxt "page:showcase/th04/index.html" +msgid "" +"The project builds the game's four DOS products from maintained C++ and assembly. " +"Beyond bullet generation, the source covers stages, bosses, rendering, input, menus, " +"endings and score handling." +msgstr "" + +#. {ph0}: +#. {ph1}: +#: website/public/showcase/th04/index.html:758 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "{ph0}Explore the TH04 repository{ph1}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/th04/index.html:764 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}Bullet-generation source{ph1}{ph2}The complete helper, other pattern types and " +"template tuning.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/th04/index.html:773 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}DOS build and run guide{ph1}{ph2}Build the source and test it in the project's " +"PC-98 emulator workflow.{ph3}" +msgstr "" + +#. {ph0}: +#. {ph1}: +#. {ph2}: +#. {ph3}: +#: website/public/showcase/th04/index.html:782 +#, python-brace-format +msgctxt "page:showcase/th04/index.html" +msgid "" +"{ph0}Current project state{ph1}{ph2}DOS verification and the separate native x64 " +"port.{ph3}" +msgstr "" + +#: website/public/showcase/th04/index.html:6 +msgctxt "page:showcase/th04/index.html" +msgid "TH04 Reverse Engineering: DOS Bullet Patterns — REA" +msgstr "" + +#: website/public/showcase/th04/index.html:7 +msgctxt "page:showcase/th04/index.html" +msgid "" +"Inspect TH04's original 16-bit DOS code with REA. Follow the assembly and recovered " +"C++ to see how a ring of bullets is spaced and aimed at the player." +msgstr "" + +#: website/public/showcase/th04/index.html:258 +msgctxt "page:showcase/th04/index.html" +msgid "On this page" +msgstr "" + +#: website/public/showcase/th04/index.html:268 +msgctxt "page:showcase/th04/index.html" +msgid "TH04 bullet-pattern case study" +msgstr "" + +#: website/public/showcase/th04/index.html:283 +msgctxt "page:showcase/th04/index.html" +msgid "Copy TH04 example prompt" +msgstr "" + +#: website/public/showcase/th04/index.html:311 +msgctxt "page:showcase/th04/index.html" +msgid "TH04 fixed and aimed bullet rings; scroll horizontally on smaller screens" +msgstr "" + +#: website/public/showcase/th04/index.html:317 +msgctxt "page:showcase/th04/index.html" +msgid "" +"Two diagrams of a 16-bullet ring. The fixed ring starts at angle zero. Adding a player" +" direction of 40 rotates every direction by the same amount; the highlighted first " +"bullet points toward the player. Both keep a spacing of 16 angle units, or 22.5 " +"degrees." +msgstr "" + +#: website/public/showcase/th04/index.html:339 +msgctxt "page:showcase/th04/index.html" +msgid "Copy TH04 firing template" +msgstr "" + +#: website/public/showcase/th04/index.html:466 +msgctxt "page:showcase/th04/index.html" +msgid "Follow the TH04 aimed-ring calculation" +msgstr "" + +#: website/public/showcase/th04/index.html:516 +msgctxt "page:showcase/th04/index.html" +msgid "Copy TH04 assembly excerpt" +msgstr "" + +#: website/public/showcase/th04/index.html:550 +msgctxt "page:showcase/th04/index.html" +msgid "Copy readable aimed-ring calculation" +msgstr "" + +#: website/public/showcase/th04/index.html:808 +msgctxt "page:showcase/th04/index.html" +msgid "Back to top" +msgstr "" + +#: scripts/website_i18n.py +msgctxt "runtime" +msgid "Translation is being updated. Read this page in English for now." +msgstr "" + +#: website/public/assets/aegis-demo.js:22 +#, python-brace-format +msgctxt "runtime" +msgid "{start}–{end} seconds" +msgstr "" + +#: website/public/assets/aegis-demo.js:29 +#, python-brace-format +msgctxt "runtime" +msgid "{seconds} seconds, time block {block}" +msgstr "" + +#: website/public/assets/aegis-demo.js:35 +msgctxt "runtime" +msgid "" +"Interactive calculation is unavailable in this browser. The example shows the code at " +"59 seconds." +msgstr "" + +#: website/public/assets/aegis-demo.js:62 +msgctxt "runtime" +msgid "Checking…" +msgstr "" + +#: website/public/assets/aegis-demo.js:76 +#, python-brace-format +msgctxt "runtime" +msgid "{passed} / {total} checks passed (six reference cases, at six and eight digits)." +msgstr "" + +#: website/public/assets/aegis-demo.js:81 +msgctxt "runtime" +msgid "Could not run the reference checks. Try again." +msgstr "" + +#: website/public/assets/contributors.js:21 +#, python-brace-format +msgctxt "runtime" +msgid "Contributors: {count}" +msgstr "" + +#: website/public/assets/dino-demo.js:77 +#, python-brace-format +msgctxt "runtime" +msgid "Distance {distance}" +msgstr "" + +#: website/public/assets/dino-demo.js:87 +msgctxt "runtime" +msgid "Hit a cactus. Try another speed." +msgstr "" + +#: website/public/assets/dino-demo.js:87 +msgctxt "runtime" +msgid "Space or Jump ↑" +msgstr "" + +#: website/public/assets/dino-demo.js:97 +msgctxt "runtime" +msgid "Play again" +msgstr "" + +#: website/public/assets/dino-demo.js:97 website/public/assets/dino-demo.js:111 +msgctxt "runtime" +msgid "Play" +msgstr "" + +#: website/public/assets/dino-demo.js:112 +msgctxt "runtime" +msgid "Press Play, then jump over the cactus." +msgstr "" + +#: website/public/assets/dino-demo.js:147 +msgctxt "runtime" +msgid "Hit a cactus. Press Play again, or change the speed and restart." +msgstr "" + +#: website/public/assets/dino-demo.js:171 +msgctxt "runtime" +msgid "Pause" +msgstr "" + +#: website/public/assets/dino-demo.js:172 +msgctxt "runtime" +msgid "Running. Space or Jump clears a cactus." +msgstr "" + +#: website/public/assets/dino-demo.js:183 website/public/assets/dino-demo.js:219 +#: website/public/assets/dino-demo.js:224 +msgctxt "runtime" +msgid "Paused. Press Play to continue." +msgstr "" + +#: website/public/assets/dino-demo.js:203 +#, python-brace-format +msgctxt "runtime" +msgid "Fixed speed: {speed}. Space or Jump clears a cactus." +msgstr "" + +#: website/public/assets/dino-demo.js:206 +#, python-brace-format +msgctxt "runtime" +msgid "Fixed speed: {speed}. Press Play to try it." +msgstr "" + +#: website/public/assets/dino-demo.js:215 +msgctxt "runtime" +msgid "Recovered rule: start at 6, then increase toward 13." +msgstr "" + +#: website/public/assets/dino-demo.js:216 +#, python-brace-format +msgctxt "runtime" +msgid "Fixed speed: {speed}." +msgstr "" + +#: website/public/assets/dino-demo.js:249 +msgctxt "runtime" +msgid "" +"Replayed the recovered rule. All four values match the controlled original-game check " +"when rounded to three decimals." +msgstr "" + +#: website/public/assets/dino-demo.js:252 +msgctxt "runtime" +msgid "" +"The replay differs from the recorded original-game values. Compare the speed rule and " +"settings above." +msgstr "" + +#: website/public/assets/home.js:29 +msgctxt "runtime" +msgid "Press % to see what happens to 10." +msgstr "" + +#: website/public/assets/home.js:32 +msgctxt "runtime" +msgid "10% of 200 is 20. Press = to add it." +msgstr "" + +#: website/public/assets/home.js:33 +msgctxt "runtime" +msgid "For multiplication, 10 becomes 0.1. Press = to multiply." +msgstr "" + +#: website/public/assets/main.js:21 +msgctxt "runtime" +msgid "Copied" +msgstr "" + +#: website/public/assets/main.js:23 +msgctxt "runtime" +msgid "Code copied to clipboard." +msgstr "" + +#: website/public/assets/main.js:32 +msgctxt "runtime" +msgid "Selected" +msgstr "" + +#: website/public/assets/main.js:34 +msgctxt "runtime" +msgid "Code selected. Use your keyboard to copy it." +msgstr "" + +#: website/public/assets/main.js:158 +#, python-brace-format +msgctxt "runtime" +msgid "REA on GitHub ({count})" +msgstr "" + +#: website/public/assets/theme.js:52 +msgctxt "runtime" +msgid "Switch to light mode" +msgstr "" + +#: website/public/assets/theme.js:53 +msgctxt "runtime" +msgid "Switch to dark mode" +msgstr "" + +#: website/public/assets/figures/analyst-thinking.svg:2 +msgctxt "figure:analyst-thinking.svg" +msgid "An analyst thinking at a computer" +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:2 +#: website/public/assets/figures/ctf-mask-equation.svg:24 +msgctxt "figure:ctf-mask-equation.svg" +msgid "One check reveals one character" +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:3 +msgctxt "figure:ctf-mask-equation.svg" +msgid "" +"The seventh mask selects only position 21 in the six by six input grid. Its character " +"code must equal 55, so the character is 7. The other masks select different positions " +"and give further equations." +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:25 +msgctxt "figure:ctf-mask-equation.svg" +msgid "The seventh check. Cell labels are input positions, starting at 0." +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:27 +msgctxt "figure:ctf-mask-equation.svg" +msgid "Encoded mask: −21, +1, −14, 0" +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:28 +msgctxt "figure:ctf-mask-equation.svg" +msgid "Skip 21 cells. Select 1. Skip 14. Stop at 0." +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:32 +msgctxt "figure:ctf-mask-equation.svg" +msgid "Only one cell contributes to this sum" +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:35 +msgctxt "figure:ctf-mask-equation.svg" +msgid "Position 21 in the flag must contain 7." +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:37 +msgctxt "figure:ctf-mask-equation.svg" +msgid "Selected: one cell" +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:38 +msgctxt "figure:ctf-mask-equation.svg" +msgid "26 masks give 26 equations." +msgstr "" + +#: website/public/assets/figures/ctf-mask-equation.svg:39 +msgctxt "figure:ctf-mask-equation.svg" +msgid "Solve them together to find the flag." +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:2 +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:20 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "DX-Ball sound-pan investigation" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:3 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "" +"REA provides the instruction, caller and byte-read evidence for one DX-Ball function. " +"A stack input is multiplied by 1.5625, offset by 500, scaled, and converted to an " +"integer. Maintained C is checked in 3,205 original-x86 cases and a separate 63-byte " +"compiler replay." +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:39 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "Stack" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:40 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "input x" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:44 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "Integer" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:45 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "return" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:46 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "Reconstructed function" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:47 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "Maintained C" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:48 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "Brick-hit caller" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:49 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "20 + 30 × tile_x" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:50 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "Original code" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:51 +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:54 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "comparison" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:52 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "3,205 cases" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:53 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "VC4.0 build" +msgstr "" + +#: website/public/assets/figures/dx-ball-sound-pan-investigation.svg:55 +msgctxt "figure:dx-ball-sound-pan-investigation.svg" +msgid "63 matching bytes" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:2 +#: website/public/assets/figures/rea-investigation-flow.svg:22 +msgctxt "figure:rea-investigation-flow.svg" +msgid "REA investigation flow" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:3 +msgctxt "figure:rea-investigation-flow.svg" +msgid "" +"Ask a question about a local target. REA inspects and traces through local analysis " +"adapters, returns evidence, and supports follow-up questions as your agent explains, " +"implements and tests." +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:31 +msgctxt "figure:rea-investigation-flow.svg" +msgid "1. Ask" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:32 +msgctxt "figure:rea-investigation-flow.svg" +msgid "Your agent + local target" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:33 +msgctxt "figure:rea-investigation-flow.svg" +msgid "App / binary / browser" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:34 +msgctxt "figure:rea-investigation-flow.svg" +msgid "2. Inspect & trace" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:36 +msgctxt "figure:rea-investigation-flow.svg" +msgid "CLI / MCP" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:37 +msgctxt "figure:rea-investigation-flow.svg" +msgid "3. Read the evidence" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:38 +msgctxt "figure:rea-investigation-flow.svg" +msgid "Code / references /" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:39 +msgctxt "figure:rea-investigation-flow.svg" +msgid "unknowns" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:40 +msgctxt "figure:rea-investigation-flow.svg" +msgid "4. Use what you learn" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:41 +msgctxt "figure:rea-investigation-flow.svg" +msgid "Your agent" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:42 +msgctxt "figure:rea-investigation-flow.svg" +msgid "Explain / implement / test" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:43 +msgctxt "figure:rea-investigation-flow.svg" +msgid "Analysis tools" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:44 +msgctxt "figure:rea-investigation-flow.svg" +msgid "Local analysis adapters" +msgstr "" + +#: website/public/assets/figures/rea-investigation-flow.svg:45 +msgctxt "figure:rea-investigation-flow.svg" +msgid "Follow-up question" +msgstr "" + +#: website/public/assets/figures/th04-bullet-ring.svg:2 +msgctxt "figure:th04-bullet-ring.svg" +msgid "TH04: spacing and aiming a ring of bullets" +msgstr "" + +#: website/public/assets/figures/th04-bullet-ring.svg:3 +msgctxt "figure:th04-bullet-ring.svg" +msgid "" +"A full clockwise turn has 256 angle units. Sixteen bullets start at angles zero, " +"sixteen, thirty-two, through 240. Adding an example player direction of forty turns " +"all sixteen directions together; the first bullet points at the player. Template " +"rotation is zero." +msgstr "" + +#: website/public/assets/figures/th04-bullet-ring.svg:24 +msgctxt "figure:th04-bullet-ring.svg" +msgid "Fixed ring" +msgstr "" + +#: website/public/assets/figures/th04-bullet-ring.svg:25 +msgctxt "figure:th04-bullet-ring.svg" +msgid "First bullet: angle 0" +msgstr "" + +#: website/public/assets/figures/th04-bullet-ring.svg:26 +msgctxt "figure:th04-bullet-ring.svg" +msgid "Aimed ring" +msgstr "" + +#: website/public/assets/figures/th04-bullet-ring.svg:27 +msgctxt "figure:th04-bullet-ring.svg" +msgid "First bullet: player direction" +msgstr "" + +#: website/public/assets/figures/th04-bullet-ring.svg:64 +#: website/public/assets/figures/th04-bullet-ring.svg:102 +msgctxt "figure:th04-bullet-ring.svg" +msgid "Origin" +msgstr "" + +#: website/public/assets/figures/th04-bullet-ring.svg:105 +msgctxt "figure:th04-bullet-ring.svg" +msgid "Player" +msgstr "" + +#: website/public/assets/figures/th04-bullet-ring.svg:110 +msgctxt "figure:th04-bullet-ring.svg" +msgid "Same spacing: 256 ÷ 16 = 16 angle units = 22.5°" +msgstr "" diff --git a/website/public/blog/index.html b/website/public/blog/index.html index a4b3262b92..dd963ddc68 100644 --- a/website/public/blog/index.html +++ b/website/public/blog/index.html @@ -55,6 +55,8 @@ + + @@ -122,7 +124,7 @@ Contributors
-
English
+
English